From e34261d3ef3d618822b531d12cdd7a79b5ad46f8 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 12 Oct 2020 18:09:58 +0300
Subject: [PATCH 01/27] mark some audio stuff and fix frameCounter

---
 src/audio/AudioLogic.cpp   | 23 +++------------
 src/audio/AudioManager.cpp |  4 +--
 src/audio/AudioManager.h   | 59 +++++++++++++++++++-------------------
 3 files changed, 35 insertions(+), 51 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 9a8dda28..bf99f991 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -46,16 +46,6 @@ const int channels = ARRAY_SIZE(cAudioManager::m_asActiveSamples);
 const int policeChannel = channels + 1;
 const int allChannels = channels + 2;
 
-uint32 gPornNextTime;
-uint32 gSawMillNextTime;
-uint32 gShopNextTime;
-uint32 gAirportNextTime;
-uint32 gCinemaNextTime;
-uint32 gDocksNextTime;
-uint32 gHomeNextTime;
-uint32 gCellNextTime;
-uint32 gNextCryTime;
-
 enum PLAY_STATUS : uint8 { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FINISHED };
 enum LOADING_STATUS : uint8 { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED };
 
@@ -187,7 +177,11 @@ cAudioManager::PostInitialiseGameSpecificSetup()
 	field_5538 = 127;
 
 	ResetAudioLogicTimers(CTimer::GetTimeInMilliseconds());
+	m_bIsPlayerShutUp = false;
+	m_nPlayerMood = 0;
+	m_nPlayerMoodTimer = 0;
 }
+
 void
 cAudioManager::PreTerminateGameSpecificShutdown()
 {
@@ -240,15 +234,6 @@ cAudioManager::PostTerminateGameSpecificShutdown()
 void
 cAudioManager::ResetAudioLogicTimers(uint32 timer)
 {
-	gPornNextTime = timer;
-	gNextCryTime = timer;
-	gSawMillNextTime = timer;
-	gCellNextTime = timer;
-	gShopNextTime = timer;
-	gHomeNextTime = timer;
-	gAirportNextTime = timer;
-	gDocksNextTime = timer;
-	gCinemaNextTime = timer;
 	for (int32 i = 0; i < m_nAudioEntitiesTotal; i++) {
 		if (m_asAudioEntities[m_anAudioEntityIndices[i]].m_nType == AUDIOTYPE_PHYSICAL) {
 			CPed *ped = (CPed *)m_asAudioEntities[m_anAudioEntityIndices[i]].m_pEntity;
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index 93ac8857..d2a85285 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -432,7 +432,7 @@ cAudioManager::IsAudioInitialised() const
 void
 cAudioManager::ServiceSoundEffects()
 {
-	field_5554++;
+	m_FrameCounter++;
 	m_bFifthFrameFlag = (m_FrameCounter++ % 5) == 0;
 	if (m_nUserPause && !m_nPreviousUserPause) {
 		for (int32 i = 0; i < allChannels; i++)
@@ -771,7 +771,7 @@ cAudioManager::ProcessActiveQueues()
 					sample.m_nSampleIndex == m_asActiveSamples[j].m_nSampleIndex) {
 					if (sample.m_nLoopCount) {
 						
-						if (field_5554 & 1) {
+						if (m_FrameCounter & 1) {
 							if (!(j & 1)) {
 								flag = false;
 							} else {
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index a43b4309..d2f9bc94 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -226,14 +226,13 @@ public:
 	uint8 m_nUserPause;
 	uint8 m_nPreviousUserPause;
 	uint32 m_FrameCounter;
-	uint32 field_5554;
 
 	cAudioManager();
 	~cAudioManager();
 
 	// getters
-	uint32 GetFrameCounter() const { return m_FrameCounter; }
-	float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; }
+	uint32 GetFrameCounter() const { return m_FrameCounter; } // done
+	float GetReflectionsDistance(int32 idx) const { return m_afReflectionsDistances[idx]; } // done
 	int32 GetRandomNumber(int32 idx) const { return m_anRandomTable[idx]; }
 	int32 GetRandomNumberInRange(int32 idx, int32 low, int32 high) const { return (m_anRandomTable[idx] % (high - low + 1)) + low; }
 	bool IsMissionAudioSamplePlaying(uint8 slot) const; // { return m_sMissionAudio.m_nPlayStatus == 1; }
@@ -250,7 +249,7 @@ public:
 	void CalculateDistance(bool &condition, float dist);                                                                   // done
 	bool CheckForAnAudioFileOnCD() const;                                                                                  // done
 	void ClearActiveSamples();                                                                                             // done
-	void ClearMissionAudio(uint8 slot);                                                                                    // done
+	void ClearMissionAudio(uint8 slot);                                                                                    // done (inlined in vc)
 	void ClearRequestedQueue();                                                                                            // done (inlined in vc)
 	uint32 ComputeDopplerEffectedFrequency(uint32 oldFreq, float position1, float position2, float speedMultiplier) const; // done
 	int32 ComputePan(float, CVector *);                                                                                    // done
@@ -266,7 +265,7 @@ public:
 	// TODO: miami
 	// end of functions returning talk sfx
 
-	void GenerateIntegerRandomNumberTable();
+	void GenerateIntegerRandomNumberTable(); // done
 	char *Get3DProviderName(uint8 id) const;
 	uint8 GetCDAudioDriveLetter() const;
 	int8 GetCurrent3DProviderIndex() const;
@@ -290,24 +289,24 @@ public:
 	void InitialisePoliceRadio();
 	void InitialisePoliceRadioZones();
 	void InterrogateAudioEntities(); // done
-	bool IsAudioInitialised() const;
-	bool IsMissionAudioSampleFinished(uint8 slot);
+	bool IsAudioInitialised() const; // done
+	bool IsMissionAudioSampleFinished(uint8 slot); // done
 	bool IsMP3RadioChannelAvailable() const; // done
 
-	bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const;
+	bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; //done
 
 	void PlayLoadedMissionAudio(uint8 slot);                // done
 	void PlayOneShot(int32 index, int16 sound, float vol);  // done
 	void PlaySuspectLastSeen(float x, float y, float z);    //
 	void PlayerJustGotInCar() const;                        // done
 	void PlayerJustLeftCar() const;                         // done
-	void PostInitialiseGameSpecificSetup();                 //
+	void PostInitialiseGameSpecificSetup();                 // done
 	void PostTerminateGameSpecificShutdown();               // done
 	void PreInitialiseGameSpecificSetup() const;            // done
 	void PreloadMissionAudio(uint8 slot, Const char *name); // done
 	void PreTerminateGameSpecificShutdown();                // done
 	/// processX - main logic of adding new sounds
-	void ProcessActiveQueues(); //done
+	void ProcessActiveQueues();                             // done
 	bool ProcessAirBrakes(cVehicleParams *params);
 	bool ProcessBoatEngine(cVehicleParams *params);
 	bool ProcessBoatMovingOverWater(cVehicleParams *params);
@@ -355,32 +354,32 @@ public:
 #ifdef GTA_TRAIN
 	bool ProcessTrainNoise(cVehicleParams *params);
 #endif
-	void ProcessVehicle(CVehicle *vehicle); //done, but need add model functions
-	bool ProcessVehicleDoors(cVehicleParams *params); //done
-	void ProcessVehicleEngine(cVehicleParams *params); //done
-	void UpdateGasPedalAudio(CVehicle* veh, int vehType); //done
-	void ProcessVehicleHorn(cVehicleParams *params);
-	void ProcessVehicleOneShots(cVehicleParams *params);
-	bool ProcessVehicleReverseWarning(cVehicleParams *params);
-	bool ProcessVehicleRoadNoise(cVehicleParams *params);
-	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);
-	bool ProcessVehicleSkidding(cVehicleParams *params);
-	void ProcessWaterCannon(int32);
-	void ProcessWeather(int32 id); //done
-	bool ProcessWetRoadNoise(cVehicleParams *params);
-	void ProcessEscalators(); //done
-	void ProcessExtraSounds(); //done
+	void ProcessVehicle(CVehicle *vehicle);                    // done, but need add model functions
+	bool ProcessVehicleDoors(cVehicleParams *params);          // done
+	void ProcessVehicleEngine(cVehicleParams *params);         // done
+	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
+	void ProcessVehicleHorn(cVehicleParams *params);           // 
+	void ProcessVehicleOneShots(cVehicleParams *params);       // 
+	bool ProcessVehicleReverseWarning(cVehicleParams *params); // 
+	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // 
+	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // 
+	bool ProcessVehicleSkidding(cVehicleParams *params);       // 
+	void ProcessWaterCannon(int32);                            // 
+	void ProcessWeather(int32 id);                             // done
+	bool ProcessWetRoadNoise(cVehicleParams *params);          // 
+	void ProcessEscalators();                                  // done
+	void ProcessExtraSounds();                                 // done
 
-	int32 RandomDisplacement(uint32 seed) const;
+	int32 RandomDisplacement(uint32 seed) const;                                                                                      // 
 	void ReacquireDigitalHandle() const;                                                                                              // done
 	void ReleaseDigitalHandle() const;                                                                                                // done
 	void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done
 	void ReportCrime(int32 crime, const CVector *pos);                                                                                // done
-	void ResetAudioLogicTimers(uint32 timer);
-	void ResetPoliceRadio();
-	void ResetTimers(uint32 time);
+	void ResetAudioLogicTimers(uint32 timer);                                                                                         // done
+	void ResetPoliceRadio();                                                                                                          // 
+	void ResetTimers(uint32 time);                                                                                                    // 
 
-	void Service();
+	void Service(); //done
 	void ServiceCollisions();
 	void ServicePoliceRadio();
 	void ServicePoliceRadioChannel(int32 wantedLevel);

From a4fd1a9f395c3ef9bf5ead3eb1eff6254b9ed678 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 12 Oct 2020 20:55:19 +0300
Subject: [PATCH 02/27] sirenes and more marks for audio. also fix cAudioMrg
 size

---
 src/audio/AudioLogic.cpp   | 26 +++++---------------------
 src/audio/AudioManager.cpp |  1 +
 src/audio/AudioManager.h   | 23 ++++++++++++-----------
 src/audio/MusicManager.cpp |  6 +++---
 4 files changed, 21 insertions(+), 35 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index bf99f991..7bc2b93f 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2027,33 +2027,17 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
 }
 
 bool
-cAudioManager::UsesSiren(int32 model) const
+cAudioManager::UsesSiren(cVehicleParams *params) const
 {
-	switch (model) {
-	case FIRETRUK:
-	case AMBULAN:
-	case FBICAR:
-	case POLICE:
-	case ENFORCER:
-	case PREDATOR:
-		return true;
-	default:
-		return false;
-	}
+	params->m_pVehicle->UsesSiren();
 }
 
 bool
-cAudioManager::UsesSirenSwitching(int32 model) const
+cAudioManager::UsesSirenSwitching(cVehicleParams *params) const
 {
-	switch (model) {
-	case AMBULAN:
-	case POLICE:
-	case ENFORCER:
-	case PREDATOR:
-		return true;
-	default:
+	if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP)
 		return false;
-	}
+	return params->m_pVehicle->UsesSiren();
 }
 
 bool
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index d2a85285..338f33a4 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -275,6 +275,7 @@ cAudioManager::ResetTimers(uint32 time)
 		SampleManager.SetEffectsFadeVolume(0);
 		SampleManager.SetMusicFadeVolume(0);
 		MusicManager.ResetMusicAfterReload();
+		m_bIsPlayerShutUp = false;
 #ifdef AUDIO_OAL
 		SampleManager.Service();
 #endif
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index d2f9bc94..7783590e 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -76,6 +76,7 @@ public:
 	uint8 m_nIndexMap[NUM_PED_COMMENTS_BANKS][NUM_PED_COMMENTS_SLOTS];
 	uint8 m_nCommentsInBank[NUM_PED_COMMENTS_BANKS];
 	uint8 m_nActiveBank;
+	uint32 field_48C;
 
 	cPedComments()
 	{
@@ -93,7 +94,7 @@ public:
 	void Process();
 };
 
-VALIDATE_SIZE(cPedComments, 1164);
+VALIDATE_SIZE(cPedComments, 0x490);
 
 class CEntity;
 
@@ -286,8 +287,8 @@ public:
 	bool HasAirBrakes(int32 model) const; // done
 
 	void Initialise(); // done
-	void InitialisePoliceRadio();
-	void InitialisePoliceRadioZones();
+	void InitialisePoliceRadio(); //done
+	void InitialisePoliceRadioZones(); //done
 	void InterrogateAudioEntities(); // done
 	bool IsAudioInitialised() const; // done
 	bool IsMissionAudioSampleFinished(uint8 slot); // done
@@ -370,17 +371,17 @@ public:
 	void ProcessEscalators();                                  // done
 	void ProcessExtraSounds();                                 // done
 
-	int32 RandomDisplacement(uint32 seed) const;                                                                                      // 
+	int32 RandomDisplacement(uint32 seed) const;                                                                                      // done
 	void ReacquireDigitalHandle() const;                                                                                              // done
 	void ReleaseDigitalHandle() const;                                                                                                // done
 	void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done
 	void ReportCrime(int32 crime, const CVector *pos);                                                                                // done
 	void ResetAudioLogicTimers(uint32 timer);                                                                                         // done
-	void ResetPoliceRadio();                                                                                                          // 
-	void ResetTimers(uint32 time);                                                                                                    // 
+	void ResetPoliceRadio();                                                                                                          // done
+	void ResetTimers(uint32 time);                                                                                                    // done
 
 	void Service(); //done
-	void ServiceCollisions();
+	void ServiceCollisions(); //done
 	void ServicePoliceRadio();
 	void ServicePoliceRadioChannel(int32 wantedLevel);
 	void ServiceSoundEffects();
@@ -408,13 +409,13 @@ public:
 	void SetupPedComments(cPedParams *params, uint32 sound);
 	void SetupSuspectLastSeenReport();
 
-	void Terminate();
-	void TranslateEntity(Const CVector *v1, CVector *v2) const;
+	void Terminate(); //done
+	void TranslateEntity(Const CVector *v1, CVector *v2) const; //done
 
 	void UpdateReflections();
 	bool UsesReverseWarning(int32 model) const; //done
-	bool UsesSiren(int32 model) const;
-	bool UsesSirenSwitching(int32 model) const;
+	bool UsesSiren(cVehicleParams *params) const; //done
+	bool UsesSirenSwitching(cVehicleParams* params) const; //done
 
 	CVehicle *FindVehicleOfPlayer(); //done
 	void SetPedTalkingStatus(CPed *ped, uint8 status);
diff --git a/src/audio/MusicManager.cpp b/src/audio/MusicManager.cpp
index fde92590..4653acb7 100644
--- a/src/audio/MusicManager.cpp
+++ b/src/audio/MusicManager.cpp
@@ -374,7 +374,7 @@ cMusicManager::Service()
 		field_399A = true;
 		if (!field_3999 && !AudioManager.m_nUserPause && AudioManager.m_nPreviousUserPause)
 			field_3999 = true;
-		if (AudioManager.field_5554 % 4 == 0) {
+		if (AudioManager.m_FrameCounter % 4 == 0) {
 			gNumRetunePresses = 0;
 			gRetuneCounter = 0;
 			field_2 = false;
@@ -422,7 +422,7 @@ cMusicManager::ServiceFrontEndMode()
 		m_nPlayingTrack = NO_TRACK;
 	}
 
-	if (AudioManager.field_5554 % 4 != 0) return;
+	if (AudioManager.m_FrameCounter % 4 != 0) return;
 
 	if (!field_398F && !field_3995) {
 		m_nStreamedTrack = m_nFrontendTrack;
@@ -893,7 +893,7 @@ cMusicManager::ServiceTrack(CVehicle *veh, CPed *ped)
 	{
 		field_398F = true;
 		SampleManager.SetStreamedVolumeAndPan(0, 63, 0, 0);
-		if (!(AudioManager.field_5554 & 1)) {
+		if (!(AudioManager.m_FrameCounter & 1)) {
 			if (field_3995 || !SampleManager.IsStreamPlaying(0)) {
 				bRadioStatsRecorded2 = false;
 				if (SampleManager.IsStreamPlaying(0)) {

From 894a1ae93aa7ec14e9d83ba43caa75adc500d582 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 17 Oct 2020 00:27:28 +0300
Subject: [PATCH 03/27] siren and horn

---
 src/audio/AudioLogic.cpp  | 202 +++++++++++++++++++++-----------------
 src/audio/AudioManager.h  |   8 +-
 src/audio/PoliceRadio.cpp |  11 +--
 3 files changed, 120 insertions(+), 101 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 7bc2b93f..aa390b64 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -1981,49 +1981,62 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automo
 	return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f));
 }
 
-void
-cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
+bool
+cAudioManager::ProcessVehicleHorn(cVehicleParams* params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
-	CAutomobile *automobile;
+	CVehicle *veh;
+	uint8 volume;
 
-	if (params->m_fDistance < SQR(SOUND_INTENSITY)) {
-		automobile = (CAutomobile *)params->m_pVehicle;
-		if ((!automobile->m_bSirenOrAlarm || !UsesSirenSwitching(params->m_nIndex)) && automobile->GetModelIndex() != MI_MRWHOOP) {
-			if (automobile->m_nCarHornTimer) {
-				if (params->m_pVehicle->GetStatus() != STATUS_PLAYER) {
-					automobile->m_nCarHornTimer = Min(44, automobile->m_nCarHornTimer);
-					if (automobile->m_nCarHornTimer == 44)
-						automobile->m_nCarHornPattern = (m_FrameCounter + m_sQueueSample.m_nEntityIndex) & 7;
-					if (!hornPatternsArray[automobile->m_nCarHornPattern][44 - automobile->m_nCarHornTimer])
-						return;
-				}
+	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+		return false;
 
-				CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-				m_sQueueSample.m_nVolume = ComputeVolume(80, 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;
-					m_sQueueSample.m_nEmittingVolume = 80;
-					m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
-					m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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 = 3;
-					m_sQueueSample.m_bReverbFlag = true;
-					m_sQueueSample.m_bRequireReflection = false;
-					AddSampleToRequestedQueue();
-				}
-			}
+	veh = params->m_pVehicle;
+	if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params))
+		return true;
+
+	if (veh->m_modelIndex == MI_MRWHOOP)
+		return true;
+
+	veh->m_nAlarmState;
+	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;
+			m_sQueueSample.m_nEmittingVolume = 80; //mb bug?
+			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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;
 }
 
 bool
@@ -2037,68 +2050,74 @@ cAudioManager::UsesSirenSwitching(cVehicleParams *params) const
 {
 	if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP)
 		return false;
-	return params->m_pVehicle->UsesSiren();
+	return UsesSiren(params);
 }
 
 bool
-cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params)
+cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams* params)
 {
 	const float SOUND_INTENSITY = 110.0f;
 
-	if (params->m_fDistance < SQR(SOUND_INTENSITY)) {
-		CVehicle *veh = params->m_pVehicle;
-		if (veh->m_bSirenOrAlarm == false && !veh->IsAlarmOn())
+	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;
+	}
 
-		if (veh->IsAlarmOn()) {
-			if (CTimer::GetTimeInMilliseconds() > veh->m_bRainAudioCounter)
-				veh->m_bRainAudioCounter = CTimer::GetTimeInMilliseconds() + 750;
-
-			if (veh->m_bRainAudioCounter < CTimer::GetTimeInMilliseconds() + 375)
+	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;
-		}
-
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-		m_sQueueSample.m_nVolume = ComputeVolume(veh->bIsDrowning ? 20 : 80, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
-		if (m_sQueueSample.m_nVolume != 0) {
-			m_sQueueSample.m_nCounter = 5;
-			if (UsesSiren(params->m_nIndex)) {
-				if (params->m_pVehicle->GetStatus() == STATUS_ABANDONED)
-					return true;
-				if (veh->m_nCarHornTimer && params->m_nIndex != FIRETRUK) {
-					m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST;
-					if (params->m_nIndex == FBICAR)
-						m_sQueueSample.m_nFrequency = 16113;
-					else
-						m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST);
-					m_sQueueSample.m_nCounter = 60;
-				} else {
-					m_sQueueSample.m_nSampleIndex = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmSample;
-					m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nSirenOrAlarmFrequency;
-				}
+			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;
 			}
-			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 = 80;
-			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
-			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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;
-		} else
-			return true;
-	} else
-		return false;
+		} 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;
+		m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+		m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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;
 }
 
 bool
@@ -2194,10 +2213,11 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params)
 bool
 cAudioManager::ProcessAirBrakes(cVehicleParams *params)
 {
+	const float SOUND_INTENSITY = 30.0f;
 	CAutomobile *automobile;
-	uint8 rand;
+	uint8 volume;
 
-	if (params->m_fDistance > SQR(30))
+	if (params->m_fDistance > SQR(SOUND_INTENSITY))
 		return false;
 	automobile = (CAutomobile *)params->m_pVehicle;
 	if (!automobile->bEngineOn)
@@ -2208,8 +2228,8 @@ cAudioManager::ProcessAirBrakes(cVehicleParams *params)
 		return true;
 
 	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-	rand = m_anRandomTable[0] % 10 + 70;
-	m_sQueueSample.m_nVolume = ComputeVolume(rand, 30.0f, m_sQueueSample.m_fDistance);
+	volume = m_anRandomTable[0] % 10 + 70;
+	m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 	if (m_sQueueSample.m_nVolume != 0) {
 		m_sQueueSample.m_nCounter = 13;
 		m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES;
@@ -2219,11 +2239,11 @@ cAudioManager::ProcessAirBrakes(cVehicleParams *params)
 		m_sQueueSample.m_bIs2D = false;
 		m_sQueueSample.m_nReleasingVolumeModificator = 10;
 		m_sQueueSample.m_nLoopCount = 1;
-		m_sQueueSample.m_nEmittingVolume = rand;
+		m_sQueueSample.m_nEmittingVolume = volume;
 		m_sQueueSample.m_nLoopStart = 0;
 		m_sQueueSample.m_nLoopEnd = -1;
 		m_sQueueSample.m_fSpeedMultiplier = 0.0f;
-		m_sQueueSample.m_fSoundIntensity = 30.0f;
+		m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
 		m_sQueueSample.m_bReleasingSoundFlag = true;
 		m_sQueueSample.m_bReverbFlag = true;
 		m_sQueueSample.m_bRequireReflection = false;
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 7783590e..aacf0006 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -298,7 +298,7 @@ public:
 
 	void PlayLoadedMissionAudio(uint8 slot);                // done
 	void PlayOneShot(int32 index, int16 sound, float vol);  // done
-	void PlaySuspectLastSeen(float x, float y, float z);    //
+	void PlaySuspectLastSeen(float x, float y, float z);    // done
 	void PlayerJustGotInCar() const;                        // done
 	void PlayerJustLeftCar() const;                         // done
 	void PostInitialiseGameSpecificSetup();                 // done
@@ -308,7 +308,7 @@ public:
 	void PreTerminateGameSpecificShutdown();                // done
 	/// processX - main logic of adding new sounds
 	void ProcessActiveQueues();                             // done
-	bool ProcessAirBrakes(cVehicleParams *params);
+	bool ProcessAirBrakes(cVehicleParams *params);          // done
 	bool ProcessBoatEngine(cVehicleParams *params);
 	bool ProcessBoatMovingOverWater(cVehicleParams *params);
 #ifdef GTA_BRIDGE
@@ -359,11 +359,11 @@ public:
 	bool ProcessVehicleDoors(cVehicleParams *params);          // done
 	void ProcessVehicleEngine(cVehicleParams *params);         // done
 	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
-	void ProcessVehicleHorn(cVehicleParams *params);           // 
+	bool ProcessVehicleHorn(cVehicleParams *params);           // done
 	void ProcessVehicleOneShots(cVehicleParams *params);       // 
 	bool ProcessVehicleReverseWarning(cVehicleParams *params); // 
 	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // 
-	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // 
+	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
 	bool ProcessVehicleSkidding(cVehicleParams *params);       // 
 	void ProcessWaterCannon(int32);                            // 
 	void ProcessWeather(int32 id);                             // done
diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp
index bd29ad4b..15dafab1 100644
--- a/src/audio/PoliceRadio.cpp
+++ b/src/audio/PoliceRadio.cpp
@@ -671,7 +671,6 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
 	float halfY;
 	float quarterX;
 	float quarterY;
-	int32 sample;
 	bool processed = false;
 	CVector vec = CVector(x, y, z);
 
@@ -683,8 +682,7 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
 			zone = CTheZones::GetAudioZone(audioZone);
 			for (int i = 0; i < NUMAUDIOZONES; i++) {
 				if (strcmp(zone->name, ZoneSfx[i].m_aName) == 0) {
-					sample = ZoneSfx[i].m_nSampleIndex;
-					m_sPoliceRadioQueue.Add(m_anRandomTable[4] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
+					m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
 					m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_SUSPECT);
 					m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_LAST_SEEN);
 					m_sPoliceRadioQueue.Add(SFX_IN);
@@ -709,9 +707,10 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
 						m_sPoliceRadioQueue.Add(SFX_WEST);
 					else if (!processed)
 						m_sPoliceRadioQueue.Add(SFX_CENTRAL);
-					m_sPoliceRadioQueue.Add(sample);
-					m_sPoliceRadioQueue.Add(m_anRandomTable[2] % 3 + SFX_POLICE_RADIO_MESSAGE_NOISE_1);
-					m_sPoliceRadioQueue.Add(TOTAL_AUDIO_SAMPLES);
+
+					m_sPoliceRadioQueue.Add(ZoneSfx[i].m_nSampleIndex);
+					m_sPoliceRadioQueue.Add(SFX_POLICE_RADIO_MESSAGE_NOISE_1);
+					m_sPoliceRadioQueue.Add(NO_SAMPLE);
 					gSpecialSuspectLastSeenReport = true;
 					break;
 				}

From 97fc5224e7e65c513e6a299b531bc2be98bf2a5f Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 17 Oct 2020 02:22:02 +0300
Subject: [PATCH 04/27] road noise

---
 src/audio/AudioLogic.cpp | 168 +++++++++++++++++++++++----------------
 src/audio/AudioManager.h |   6 +-
 2 files changed, 102 insertions(+), 72 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index aa390b64..b1d1eeb3 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -972,7 +972,7 @@ cAudioManager::ProcessModelCarEngine(cVehicleParams *params)
 
 
 bool
-cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
+cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 {
 	const float SOUND_INTENSITY = 95.0f;
 
@@ -981,51 +981,66 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
 	float modificator;
 	int sampleFreq;
 	float velocity;
+	uint8 wheelsOnGround;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	if (params->m_pTransmission != nil) {
-		if (((CAutomobile*)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) {
-			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;
-						modificator = m_sQueueSample.m_fDistance / 190.f;
-						sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
-						freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4);
-					}
-					m_sQueueSample.m_nFrequency = freq;
-					m_sQueueSample.m_nLoopCount = 0;
-					m_sQueueSample.m_nEmittingVolume = emittingVol;
-					m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
-					m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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();
-				}
+
+	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) {
+		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;
+				modificator = (m_sQueueSample.m_fDistance / 95.0f) * 0.5f;   //mb SOUND_INTENSITY?
+				sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
+				freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4);
 			}
+			m_sQueueSample.m_nFrequency = freq;
+			m_sQueueSample.m_nLoopCount = 0;
+			m_sQueueSample.m_nEmittingVolume = emittingVol;
+			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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();
 		}
 	}
+
 	return true;
 }
 
 bool
-cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
+cAudioManager::ProcessWetRoadNoise(cVehicleParams* params)
 {
 	const float SOUND_INTENSITY = 30.0f;
 
@@ -1033,42 +1048,54 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
 	int32 emittingVol;
 	float modificator;
 	int freq;
-	float velChange;
+	float velocity;
+	uint8 wheelsOnGround;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	if (params->m_pTransmission != nil) {
-		if (((CAutomobile *)params->m_pVehicle)->m_nDriveWheelsOnGround != 0) {
-			velChange = Abs(params->m_fVelocityChange);
-			if (velChange > 0.f) {
-				CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-				relativeVelocity = Min(1.0f, velChange / (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;
-					modificator = m_sQueueSample.m_fDistance / 6.f;
-					freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
-					m_sQueueSample.m_nFrequency = freq + freq * modificator;
-					m_sQueueSample.m_nLoopCount = 0;
-					m_sQueueSample.m_nEmittingVolume = emittingVol;
-					m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
-					m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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();
-				}
-			}
+	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) {
+		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;
+			modificator = (m_sQueueSample.m_fDistance / 30.0f) * 0.5f; //need recheck in III, mb sount_intensity?
+			freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
+			m_sQueueSample.m_nFrequency = freq + freq * modificator;
+			m_sQueueSample.m_nLoopCount = 0;
+			m_sQueueSample.m_nEmittingVolume = emittingVol;
+			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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();
 		}
 	}
+
 	return true;
 }
 
@@ -2132,13 +2159,15 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params)
 	const float SOUND_INTENSITY = 50.0f;
 
 	CVehicle *veh = params->m_pVehicle;
+	uint8 volume;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
 	if (veh->bEngineOn && veh->m_fGasPedal < 0.0f) {
 		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-		m_sQueueSample.m_nVolume = ComputeVolume(60, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
+		volume = veh->bIsDrowning ? 15 : 60;
+		m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 		if (m_sQueueSample.m_nVolume != 0) {
 			m_sQueueSample.m_nCounter = 12;
 			m_sQueueSample.m_nSampleIndex = SFX_REVERSE_WARNING;
@@ -2147,7 +2176,7 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params)
 			m_sQueueSample.m_nReleasingVolumeModificator = 2;
 			m_sQueueSample.m_nFrequency = (100 * m_sQueueSample.m_nEntityIndex & 1023) + SampleManager.GetSampleBaseFrequency(SFX_REVERSE_WARNING);
 			m_sQueueSample.m_nLoopCount = 0;
-			m_sQueueSample.m_nEmittingVolume = 60;
+			m_sQueueSample.m_nEmittingVolume = 60; //mb bug?
 			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_fSpeedMultiplier = 3.0f;
@@ -2803,6 +2832,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		}
 	}
 }
+
 #ifdef GTA_TRAIN
 bool
 cAudioManager::ProcessTrainNoise(cVehicleParams *params)
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index aacf0006..60845bde 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -361,13 +361,13 @@ public:
 	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
 	bool ProcessVehicleHorn(cVehicleParams *params);           // done
 	void ProcessVehicleOneShots(cVehicleParams *params);       // 
-	bool ProcessVehicleReverseWarning(cVehicleParams *params); // 
-	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // 
+	bool ProcessVehicleReverseWarning(cVehicleParams *params); // done
+	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // done
 	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
 	bool ProcessVehicleSkidding(cVehicleParams *params);       // 
 	void ProcessWaterCannon(int32);                            // 
 	void ProcessWeather(int32 id);                             // done
-	bool ProcessWetRoadNoise(cVehicleParams *params);          // 
+	bool ProcessWetRoadNoise(cVehicleParams *params);          // done
 	void ProcessEscalators();                                  // done
 	void ProcessExtraSounds();                                 // done
 

From eeee5012b79297f042eca7ea59c7fa2e35ec5b39 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 17 Oct 2020 16:57:36 +0300
Subject: [PATCH 05/27] model cars and other audio stuff

---
 src/audio/AudioLogic.cpp | 278 +++++++++++++++++++++++++--------------
 src/audio/AudioManager.h |   8 +-
 2 files changed, 183 insertions(+), 103 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index b1d1eeb3..3520ca72 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -744,7 +744,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 			automobile = (CAutomobile*)veh;
 			UpdateGasPedalAudio(veh, params.m_VehicleType);
 			if (veh->m_modelIndex == MI_RCBANDIT || veh->m_modelIndex == MI_RCBARON) {
-				ProcessModelCarEngine(&params);
+				ProcessModelVehicle(&params);
 				ProcessEngineDamage(&params);
 			} else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) {
 				//ProcessModelHeliVehicle(this, &params);
@@ -825,37 +825,42 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 }
 
 void
-cAudioManager::ProcessRainOnVehicle(cVehicleParams *params)
+cAudioManager::ProcessRainOnVehicle(cVehicleParams* params)
 {
-	const int rainOnVehicleIntensity = 22;
-	if (params->m_fDistance < SQR(rainOnVehicleIntensity) && CWeather::Rain > 0.01f && (!CCullZones::CamNoRain() || !CCullZones::PlayerNoRain())) {
-		CVehicle *veh = params->m_pVehicle;
-		++veh->m_bRainAudioCounter;
-		if (veh->m_bRainAudioCounter >= 2) {
-			veh->m_bRainAudioCounter = 0;
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-			float emittingVol = 30.f * CWeather::Rain;
-			m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, rainOnVehicleIntensity, 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_bIs2D = false;
-				m_sQueueSample.m_nReleasingVolumeModificator = 9;
-				m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000;
-				m_sQueueSample.m_nLoopCount = 1;
-				m_sQueueSample.m_nEmittingVolume = (uint8)emittingVol;
-				m_sQueueSample.m_nLoopStart = 0;
-				m_sQueueSample.m_nLoopEnd = -1;
-				m_sQueueSample.m_fSpeedMultiplier = 0.0f;
-				m_sQueueSample.m_fSoundIntensity = rainOnVehicleIntensity;
-				m_sQueueSample.m_bReleasingSoundFlag = true;
-				m_sQueueSample.m_bReverbFlag = false;
-				m_sQueueSample.m_bRequireReflection = false;
-				AddSampleToRequestedQueue();
-			}
+	const int SOUND_INTENSITY = 22.0f;
+
+	CVehicle* veh;
+	uint8 emittingVol;
+
+	if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain())
+		return;
+
+	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;
+		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_bIs2D = false;
+			m_sQueueSample.m_nReleasingVolumeModificator = 9;
+			m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000;
+			m_sQueueSample.m_nLoopCount = 1;
+			m_sQueueSample.m_nEmittingVolume = emittingVol;
+			m_sQueueSample.m_nLoopStart = 0;
+			m_sQueueSample.m_nLoopEnd = -1;
+			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
+			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+			m_sQueueSample.m_bReleasingSoundFlag = true;
+			m_sQueueSample.m_bReverbFlag = false;
+			m_sQueueSample.m_bRequireReflection = false;
+			AddSampleToRequestedQueue();
 		}
 	}
 }
@@ -915,62 +920,131 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params)
 	return true;
 }
 
-// TODO(Miami): this becomes ProcessModelVehicle
 void
-cAudioManager::ProcessModelCarEngine(cVehicleParams *params)
+cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 {
-/*	const float SOUND_INTENSITY = 30.0f;
-	CAutomobile *automobile;
-	float allowedVelocity;
-	int32 emittingVol;
-	float velocityChange;
+	const float SOUND_INTENSITY = 35.0f;
+	uint8 volume;
+	uint32 freq;
+	bool isPlayerVeh;
 
-	if (params->m_fDistance < SQR(SOUND_INTENSITY)) {
-		automobile = (CAutomobile *)params->m_pVehicle;
-		if (automobile->bEngineOn) {
-			if (automobile->m_nWheelsOnGround == 0) {
-				if (automobile->m_nDriveWheelsOnGround != 0)
-					automobile->m_fGasPedalAudio *= 0.4f;
-				velocityChange = automobile->m_fGasPedalAudio * params->m_pTransmission->fMaxVelocity;
-			} else {
-				velocityChange = Abs(params->m_fVelocityChange);
-			}
-			if (velocityChange > 0.001f) {
-				allowedVelocity = 0.5f * params->m_pTransmission->fMaxVelocity;
-				if (velocityChange < allowedVelocity)
-					emittingVol = (90.f * velocityChange / allowedVelocity);
-				else
-					emittingVol = 90;
-				if (emittingVol) {
-					CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-					m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 30.f, m_sQueueSample.m_fDistance);
-					if (m_sQueueSample.m_nVolume != 0) {
-						m_sQueueSample.m_nCounter = 2;
-						m_sQueueSample.m_nSampleIndex = SFX_REMOTE_CONTROLLED_CAR;
-						m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-						m_sQueueSample.m_bIs2D = false;
-						m_sQueueSample.m_nReleasingVolumeModificator = 1;
-						m_sQueueSample.m_nFrequency = (11025.f * velocityChange / params->m_pTransmission->fMaxVelocity + 11025.f);
-						m_sQueueSample.m_nLoopCount = 0;
-						m_sQueueSample.m_nEmittingVolume = emittingVol;
-						m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
-						m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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();
-					}
-				}
+	static uint8 prevVolume = 0;
+	static uint32 prevFreq = 14000;
+	int16 acceletateState;
+	int16 brakeState;
+	bool vehSlowdown;
+
+	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+		return;
+
+	if (FindPlayerVehicle() == params->m_pVehicle)
+		isPlayerVeh = true;
+	else
+		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil;  //mb bug?
+	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 {
+			volume = 127;
+			freq = 25000;
+		}
+		if (isPlayerVeh) {
+			volume = clamp2(volume, prevVolume, 7);
+			freq = clamp2(freq, prevFreq, 800);
+		}
+		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_nBankIndex = SFX_BANK_0;
+				m_sQueueSample.m_bIs2D = false;
+				m_sQueueSample.m_nReleasingVolumeModificator = 1;
+				m_sQueueSample.m_nFrequency = freq;
+				m_sQueueSample.m_nLoopCount = 0;
+				m_sQueueSample.m_nEmittingVolume = volume;
+				m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(SFX_RC_REV);
+				m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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_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)
+			freq += 8000.0f * Abs(params->m_pVehicle->GetUp().y);
+		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;
+				m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+				m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
+				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;
+			}
+		}
+	}
 }
 
-
-
 bool
 cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 {
@@ -4942,17 +5016,17 @@ cAudioManager::ProcessFires(int32)
 void
 cAudioManager::ProcessWaterCannon(int32)
 {
-	const float SOUND_INTENSITY = 900.0f;
+	const float SOUND_INTENSITY = 30.0f;
 
 	for (int32 i = 0; i < NUM_WATERCANNONS; i++) {
 		if (CWaterCannons::aCannons[i].m_nId) {
 			m_sQueueSample.m_vecPos = CWaterCannons::aCannons[0].m_avecPos[CWaterCannons::aCannons[i].m_nCur];
 			float distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
-			if (distSquared < SOUND_INTENSITY) {
-				m_sQueueSample.m_fDistance = Sqrt(distSquared);
-				m_sQueueSample.m_nVolume = ComputeVolume(50, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance);
+			if (distSquared < SQR(SOUND_INTENSITY)) {
+				m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared);
+				m_sQueueSample.m_nVolume = ComputeVolume(50, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 				if (m_sQueueSample.m_nVolume != 0) {
-					m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+					m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;  //BUG IN III!!!! 
 					m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI;
 					m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 					m_sQueueSample.m_nFrequency = 15591;
@@ -5773,39 +5847,45 @@ cAudioManager::ProcessCrane()
 void
 cAudioManager::ProcessProjectiles()
 {
-	const int rocketLauncherIntensity = 90;
-	const int molotovIntensity = 30;
-	const int molotovVolume = 50;
 	uint8 emittingVol;
+	float distSquared;
 
 	for (int32 i = 0; i < NUM_PROJECTILES; i++) {
 		if (CProjectileInfo::GetProjectileInfo(i)->m_bInUse) {
 			switch (CProjectileInfo::GetProjectileInfo(i)->m_eWeaponType) {
-			case WEAPONTYPE_ROCKETLAUNCHER:
-				emittingVol = MAX_VOLUME;
-				m_sQueueSample.m_fSoundIntensity = rocketLauncherIntensity;
-				m_sQueueSample.m_nSampleIndex = SFX_ROCKET_FLY;
+			case WEAPONTYPE_TEARGAS:
+				emittingVol = 80;
+				m_sQueueSample.m_fSoundIntensity = 40.0f;
+				m_sQueueSample.m_nSampleIndex = SFX_PALM_TREE_LO;
 				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_ROCKET_FLY);
-				m_sQueueSample.m_nReleasingVolumeModificator = 3;
+				m_sQueueSample.m_nFrequency = 13879;
+				m_sQueueSample.m_nReleasingVolumeModificator = 7;
 				break;
 			case WEAPONTYPE_MOLOTOV:
-				emittingVol = molotovVolume;
-				m_sQueueSample.m_fSoundIntensity = molotovIntensity;
+				emittingVol = 50;
+				m_sQueueSample.m_fSoundIntensity = 30.0f;
 				m_sQueueSample.m_nSampleIndex = SFX_PED_ON_FIRE;
 				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 				m_sQueueSample.m_nFrequency = 32 * SampleManager.GetSampleBaseFrequency(SFX_PED_ON_FIRE) / 25;
 				m_sQueueSample.m_nReleasingVolumeModificator = 7;
 				break;
+			case WEAPONTYPE_ROCKET:
+				emittingVol = 127;
+				m_sQueueSample.m_fSoundIntensity = 90.0f;
+				m_sQueueSample.m_nSampleIndex = SFX_ROCKET_FLY;
+				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_ROCKET_FLY);
+				m_sQueueSample.m_nReleasingVolumeModificator = 3;
+				break;
 			default:
 				return;
 			}
 			m_sQueueSample.m_fSpeedMultiplier = 4.0f;
 			m_sQueueSample.m_nReleasingVolumeDivider = 3;
-			m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition();
-			float distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
+			m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); //??
+			distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
 			if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) {
-				m_sQueueSample.m_fDistance = Sqrt(distSquared);
+				m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared);
 				m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance);
 				if (m_sQueueSample.m_nVolume != 0) {
 					m_sQueueSample.m_nCounter = i;
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 60845bde..80607b35 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -339,15 +339,15 @@ public:
 	void ProcessLoopingScriptObject(uint8 sound);                            // 
 	void ProcessMissionAudio();                                              // 
 	void ProcessMissionAudioSlot(uint8 slot);                                // 
-	void ProcessModelCarEngine(cVehicleParams *params);                      // 
+	void ProcessModelVehicle(cVehicleParams *params);                        // done
 	void ProcessOneShotScriptObject(uint8 sound);                            // 
 	void ProcessPed(CPhysical *ped);                                         // 
 	void ProcessPedOneShots(cPedParams *params);                             // 
 	void ProcessPhysical(int32 id);                                          // done
 	void ProcessPlane(cVehicleParams *params);                               // done
 	void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done
-	void ProcessProjectiles();                                               // 
-	void ProcessRainOnVehicle(cVehicleParams *params);                       // 
+	void ProcessProjectiles();                                               // done
+	void ProcessRainOnVehicle(cVehicleParams *params);                       // done
 	void ProcessReverb() const;                                              // 
 	bool ProcessReverseGear(cVehicleParams *params);                         // done
 	void ProcessScriptObject(int32 id);                                      // done
@@ -365,7 +365,7 @@ public:
 	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // done
 	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
 	bool ProcessVehicleSkidding(cVehicleParams *params);       // 
-	void ProcessWaterCannon(int32);                            // 
+	void ProcessWaterCannon(int32);                            // done
 	void ProcessWeather(int32 id);                             // done
 	bool ProcessWetRoadNoise(cVehicleParams *params);          // done
 	void ProcessEscalators();                                  // done

From 1e3aabf65486a4a1f32ae92704e1082566090eef Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 17 Oct 2020 21:30:48 +0300
Subject: [PATCH 06/27] fix bugs

---
 src/audio/AudioLogic.cpp | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 3520ca72..3712f49b 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -940,7 +940,11 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 	if (FindPlayerVehicle() == params->m_pVehicle)
 		isPlayerVeh = true;
 	else
-		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil;  //mb bug?
+#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);
@@ -1052,7 +1056,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 
 	int32 emittingVol;
 	uint32 freq;
-	float modificator;
+	float multiplier;
 	int sampleFreq;
 	float velocity;
 	uint8 wheelsOnGround;
@@ -1091,9 +1095,9 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 				freq = 6050 * emittingVol / 30 + 16000;
 			} else {
 				m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE;
-				modificator = (m_sQueueSample.m_fDistance / 95.0f) * 0.5f;   //mb SOUND_INTENSITY?
+				multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f;
 				sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
-				freq = (sampleFreq * modificator) + ((3 * sampleFreq) / 4);
+				freq = (sampleFreq * multiplier) + ((3 * sampleFreq) / 4);
 			}
 			m_sQueueSample.m_nFrequency = freq;
 			m_sQueueSample.m_nLoopCount = 0;
@@ -1120,7 +1124,7 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams* params)
 
 	float relativeVelocity;
 	int32 emittingVol;
-	float modificator;
+	float multiplier;
 	int freq;
 	float velocity;
 	uint8 wheelsOnGround;
@@ -1153,9 +1157,9 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams* params)
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_bIs2D = false;
 			m_sQueueSample.m_nReleasingVolumeModificator = 3;
-			modificator = (m_sQueueSample.m_fDistance / 30.0f) * 0.5f; //need recheck in III, mb sount_intensity?
+			multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f;
 			freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE);
-			m_sQueueSample.m_nFrequency = freq + freq * modificator;
+			m_sQueueSample.m_nFrequency = freq + freq * multiplier;
 			m_sQueueSample.m_nLoopCount = 0;
 			m_sQueueSample.m_nEmittingVolume = emittingVol;
 			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
@@ -2125,7 +2129,11 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams* params)
 			m_sQueueSample.m_nReleasingVolumeModificator = 2;
 			m_sQueueSample.m_nFrequency = aVehicleSettings[params->m_nIndex].m_nHornFrequency;
 			m_sQueueSample.m_nLoopCount = 0;
-			m_sQueueSample.m_nEmittingVolume = 80; //mb bug?
+#ifdef FIX_BUGS
+			m_sQueueSample.m_nEmittingVolume = volume;
+#else
+			m_sQueueSample.m_nEmittingVolume = 80;
+#endif
 			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_fSpeedMultiplier = 5.0f;
@@ -2143,7 +2151,7 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams* params)
 bool
 cAudioManager::UsesSiren(cVehicleParams *params) const
 {
-	params->m_pVehicle->UsesSiren();
+	return params->m_pVehicle->UsesSiren();
 }
 
 bool
@@ -2250,7 +2258,11 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params)
 			m_sQueueSample.m_nReleasingVolumeModificator = 2;
 			m_sQueueSample.m_nFrequency = (100 * m_sQueueSample.m_nEntityIndex & 1023) + SampleManager.GetSampleBaseFrequency(SFX_REVERSE_WARNING);
 			m_sQueueSample.m_nLoopCount = 0;
-			m_sQueueSample.m_nEmittingVolume = 60; //mb bug?
+#ifdef FIX_BUGS
+			m_sQueueSample.m_nEmittingVolume = volume;
+#else
+			m_sQueueSample.m_nEmittingVolume = 60;
+#endif
 			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_fSpeedMultiplier = 3.0f;
@@ -5882,7 +5894,7 @@ cAudioManager::ProcessProjectiles()
 			}
 			m_sQueueSample.m_fSpeedMultiplier = 4.0f;
 			m_sQueueSample.m_nReleasingVolumeDivider = 3;
-			m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition(); //??
+			m_sQueueSample.m_vecPos = CProjectileInfo::ms_apProjectile[i]->GetPosition();
 			distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
 			if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) {
 				m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared);

From 0594ed5b4631ed779d946fced1e189c10cc0e5c5 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 18 Oct 2020 23:03:03 +0300
Subject: [PATCH 07/27] peds

---
 src/audio/AudioLogic.cpp | 82 +++++++++++++++++++++++++++++++---------
 src/audio/AudioManager.h |  8 ++--
 src/control/Script.h     |  1 +
 3 files changed, 71 insertions(+), 20 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 3712f49b..dcaf4dcb 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -40,6 +40,7 @@
 #include "Bike.h"
 #include "WindModifiers.h"
 #include "Fluff.h"
+#include "Script.h"
 
 
 const int channels = ARRAY_SIZE(cAudioManager::m_asActiveSamples);
@@ -251,15 +252,14 @@ cAudioManager::ResetAudioLogicTimers(uint32 timer)
 void
 cAudioManager::ProcessReverb() const
 {
-	if (SampleManager.UpdateReverb() && m_bDynamicAcousticModelingStatus) {
-		for (uint32 i = 0; i <
 #ifdef FIX_BUGS
-		                   channels
+	const uint32 numChannels = channels;
 #else
-		                   28
+	const uint32 numChannels = 28;
 #endif
-		     ;
-		     i++) {
+
+	if (SampleManager.UpdateReverb() && m_bDynamicAcousticModelingStatus) {
+		for (uint32 i = 0; i < numChannels; i++) {
 			if (m_asActiveSamples[i].m_bReverbFlag)
 				SampleManager.SetChannelReverbFlag(i, 1);
 		}
@@ -297,25 +297,67 @@ CVehicle *cAudioManager::FindVehicleOfPlayer()
 	return vehicle;
 }
 
+void
+cAudioManager::ProcessPlayerMood()
+{
+	CPlayerPed* playerPed;
+	uint32* lastMisstonPassedTime;
+	uint32 curTime = CTimer::GetTimeInMilliseconds();
+
+	if (m_nPlayerMoodTimer <= curTime) {
+		playerPed = FindPlayerPed();
+		if (playerPed != nil) {
+#ifdef 0
+			if (playerPed->m_pWanted->m_nWantedLevel > 3) {
+				m_nPlayerMood = 2;
+				return;
+			}
+			if (playerPed->m_pWanted->m_nWantedLevel > 1) {
+				m_nPlayerMood = 1;
+				return;
+			}
+#endif
+			if (playerPed->m_pWanted->m_nWantedLevel > 1) {
+				m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1;
+				return;
+			}
+			lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime();
+			if (*lastMisstonPassedTime != -1) {
+				if (curTime < *lastMisstonPassedTime) {
+					*lastMisstonPassedTime = curTime;
+					return;
+				}
+				if (curTime < *lastMisstonPassedTime + 180000) {
+					m_nPlayerMood = 3;
+					return;
+				}
+			}
+			m_nPlayerMood = 0;
+		}
+	}
+}
+
 void
 cAudioManager::ProcessSpecial()
 {
+	CPlayerPed* playerPed;
+
 	if (m_nUserPause) {
 		if (!m_nPreviousUserPause) {
-			MusicManager.ChangeMusicMode(MUSICMODE_FRONTEND);
 			SampleManager.SetEffectsFadeVolume(MAX_VOLUME);
 			SampleManager.SetMusicFadeVolume(MAX_VOLUME);
 		}
 	} else {
-		if (m_nPreviousUserPause) {
-			MusicManager.StopFrontEndTrack();
-			MusicManager.ChangeMusicMode(MUSICMODE_GAME);
-		}
-		CPlayerPed *playerPed = FindPlayerPed();
-		if (playerPed) {
-			const PedState &state = playerPed->m_nPedState;
-			if (state != PED_ENTER_CAR && state != PED_STEAL_CAR && !playerPed->bInVehicle)
-				SampleManager.StopChannel(m_nActiveSamples);
+		if (!CReplay::IsPlayingBack())
+			ProcessPlayerMood();
+		playerPed = FindPlayerPed();
+		if (playerPed != nil) {
+			if (playerPed->m_audioEntityId >= 0 && m_asAudioEntities[playerPed->m_audioEntityId].m_bIsUsed) {
+				if (playerPed->m_nPedState != PED_ENTER_CAR && playerPed->m_nPedState != PED_CARJACK) {
+					if(!playerPed->bInVehicle&& CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == nil)
+						SampleManager.StopChannel(m_nActiveSamples);
+				}
+			}
 		}
 	}
 }
@@ -3902,7 +3944,7 @@ cAudioManager::ProcessPed(CPhysical *ped)
 
 	m_sQueueSample.m_vecPos = ped->GetPosition();
 
-	// params.m_bDistanceCalculated = false;
+	//params.m_bDistanceCalculated = false;
 	params.m_pPed = (CPed *)ped;
 	params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos);
 	ProcessPedOneShots(&params);
@@ -6855,6 +6897,12 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot)
 	}
 }
 
+void
+cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
+{
+
+}
+
 void
 cAudioManager::ProcessMissionAudio()
 {
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 80607b35..7b2e01ae 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -339,19 +339,21 @@ public:
 	void ProcessLoopingScriptObject(uint8 sound);                            // 
 	void ProcessMissionAudio();                                              // 
 	void ProcessMissionAudioSlot(uint8 slot);                                // 
+	void ProcessModelHeliVehicle(cVehicleParams* params);                    //
 	void ProcessModelVehicle(cVehicleParams *params);                        // done
 	void ProcessOneShotScriptObject(uint8 sound);                            // 
-	void ProcessPed(CPhysical *ped);                                         // 
+	void ProcessPed(CPhysical *ped);                                         // done
 	void ProcessPedOneShots(cPedParams *params);                             // 
 	void ProcessPhysical(int32 id);                                          // done
 	void ProcessPlane(cVehicleParams *params);                               // done
+	void ProcessPlayerMood();                                                // done(need redo pointer)
 	void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done
 	void ProcessProjectiles();                                               // done
 	void ProcessRainOnVehicle(cVehicleParams *params);                       // done
-	void ProcessReverb() const;                                              // 
+	void ProcessReverb() const;                                              // done
 	bool ProcessReverseGear(cVehicleParams *params);                         // done
 	void ProcessScriptObject(int32 id);                                      // done
-	void ProcessSpecial();
+	void ProcessSpecial();                                                   // done
 #ifdef GTA_TRAIN
 	bool ProcessTrainNoise(cVehicleParams *params);
 #endif
diff --git a/src/control/Script.h b/src/control/Script.h
index c7218847..ac11f967 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -381,6 +381,7 @@ private:
 public:
 	static void RemoveThisPed(CPed* pPed);
 
+	static uint32* GetLastMissionPassedTime() { return &LastMissionPassedTime; }
 #ifdef MISSION_SWITCHER
 	static void SwitchToMission(int32 mission);
 #endif

From 19ffb9c8df3a2535e0f502f6153c3096082f0215 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 24 Oct 2020 19:24:48 +0300
Subject: [PATCH 08/27] model heli

---
 src/audio/AudioLogic.cpp | 81 ++++++++++++++++++++++++++++++++--------
 src/audio/AudioManager.h |  4 +-
 2 files changed, 67 insertions(+), 18 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index b690882e..6b6d1082 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -789,7 +789,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 				ProcessModelVehicle(&params);
 				ProcessEngineDamage(&params);
 			} else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) {
-				//ProcessModelHeliVehicle(this, &params);
+				ProcessModelHeliVehicle(&params);
 				ProcessEngineDamage(&params);
 			} else {
 				switch (veh->GetVehicleAppearance()) {
@@ -966,14 +966,15 @@ void
 cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 {
 	const float SOUND_INTENSITY = 35.0f;
-	uint8 volume;
-	uint32 freq;
-	bool isPlayerVeh;
 
-	static uint8 prevVolume = 0;
 	static uint32 prevFreq = 14000;
+	static uint8 prevVolume = 0;
+
+	uint32 freq;
 	int16 acceletateState;
 	int16 brakeState;
+	uint8 volume;
+	bool isPlayerVeh;
 	bool vehSlowdown;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
@@ -1091,6 +1092,64 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 	}
 }
 
+void
+cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
+{
+	const float SOUND_INTENSITY = 35.0f;
+
+	static uint32 prevFreq = 22050;
+
+	uint32 freq;
+	bool isPlayerVeh;
+	int16 acceletateState;
+	int16 brakeState;
+
+	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+		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;
+		m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(SFX_CAR_RC_HELI);
+		m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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;
+}
+
 bool
 cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 {
@@ -5079,12 +5138,8 @@ cAudioManager::ProcessWaterCannon(int32)
 			if (distSquared < SQR(SOUND_INTENSITY)) {
 				m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared);
 				m_sQueueSample.m_nVolume = ComputeVolume(50, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
-#endif
 				if (m_sQueueSample.m_nVolume != 0) {
-					m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;  //BUG IN III!!!! 
-#else
-					m_sQueueSample.m_fSoundIntensity = SQR(SOUND_INTENSITY);
-#endif
+					m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
 					m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI;
 					m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 					m_sQueueSample.m_nFrequency = 15591;
@@ -6901,12 +6956,6 @@ cAudioManager::ProcessMissionAudioSlot(uint8 slot)
 	}
 }
 
-void
-cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
-{
-
-}
-
 void
 cAudioManager::ProcessMissionAudio()
 {
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index dbc58ac2..daa65470 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -335,7 +335,7 @@ public:
 	void ProcessLoopingScriptObject(uint8 sound);                            // 
 	void ProcessMissionAudio();                                              // 
 	void ProcessMissionAudioSlot(uint8 slot);                                // 
-	void ProcessModelHeliVehicle(cVehicleParams* params);                    //
+	void ProcessModelHeliVehicle(cVehicleParams* params);                    // done
 	void ProcessModelVehicle(cVehicleParams *params);                        // done
 	void ProcessOneShotScriptObject(uint8 sound);                            // 
 	void ProcessPed(CPhysical *ped);                                         // done
@@ -353,7 +353,7 @@ public:
 #ifdef GTA_TRAIN
 	bool ProcessTrainNoise(cVehicleParams *params);
 #endif
-	void ProcessVehicle(CVehicle *vehicle);                    // done, but need add model functions
+	void ProcessVehicle(CVehicle *vehicle);                    // done
 	bool ProcessVehicleDoors(cVehicleParams *params);          // done
 	void ProcessVehicleEngine(cVehicleParams *params);         // done
 	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done

From beae41b2079645f5e2053d12fd794b1f0414aecf Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 24 Oct 2020 19:43:11 +0300
Subject: [PATCH 09/27] fires

---
 src/audio/AudioLogic.cpp | 36 ++++++++++++++++++++++++++++++------
 src/audio/AudioManager.h |  2 +-
 2 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 6b6d1082..d999dfed 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -5070,7 +5070,7 @@ cAudioManager::ProcessFires(int32)
 			if (entity) {
 				switch (entity->GetType()) {
 				case ENTITY_TYPE_BUILDING:
-					m_sQueueSample.m_fSoundIntensity = 50.0f;
+					m_sQueueSample.m_fSoundIntensity = 80.0f;
 					m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE;
 					emittingVol = 100;
 					m_sQueueSample.m_nFrequency = 8 * SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE) / 10;
@@ -5086,7 +5086,7 @@ cAudioManager::ProcessFires(int32)
 					m_sQueueSample.m_nReleasingVolumeModificator = 10;
 					break;
 				default:
-					m_sQueueSample.m_fSoundIntensity = 50.0f;
+					m_sQueueSample.m_fSoundIntensity = 80.0f;
 					m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE;
 					m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE);
 					m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64);
@@ -5094,17 +5094,17 @@ cAudioManager::ProcessFires(int32)
 					m_sQueueSample.m_nReleasingVolumeModificator = 8;
 				}
 			} else {
-				m_sQueueSample.m_fSoundIntensity = 50.0f;
+				m_sQueueSample.m_fSoundIntensity = 80.0f;
 				m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE;
 				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE);
-				m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64);
+				//mb error in III
 				emittingVol = 80;
 				m_sQueueSample.m_nReleasingVolumeModificator = 8;
 			}
 			m_sQueueSample.m_vecPos = gFireManager.m_aFires[i].m_vecPos;
 			distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
 			if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) {
-				m_sQueueSample.m_fDistance = Sqrt(distSquared);
+				m_sQueueSample.m_fDistance = distSquared < 0.0f ? 0.0f : Sqrt(distSquared);
 				m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance);
 				if (m_sQueueSample.m_nVolume != 0) {
 					m_sQueueSample.m_nCounter = i;
@@ -5122,6 +5122,30 @@ cAudioManager::ProcessFires(int32)
 					AddSampleToRequestedQueue();
 				}
 			}
+			if (gFireManager.m_aFires[i].m_bExtinguishedWithWater) {
+				gFireManager.m_aFires[i].m_bExtinguishedWithWater = false;
+				emittingVol = 100.0f * gFireManager.m_aFires[i].m_fWaterExtinguishCountdown;
+				m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance);
+				if (m_sQueueSample.m_nVolume != 0) {
+					m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI;
+					m_sQueueSample.m_nFrequency = 19591;
+					m_sQueueSample.m_nFrequency += i * (m_sQueueSample.m_nFrequency / 64);
+					m_sQueueSample.m_nReleasingVolumeModificator = 9;
+					m_sQueueSample.m_nCounter = i + 40;
+					m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+					m_sQueueSample.m_fSpeedMultiplier = 2.0f;
+					m_sQueueSample.m_nReleasingVolumeDivider = 10;
+					m_sQueueSample.m_bIs2D = false;
+					m_sQueueSample.m_nLoopCount = 0;
+					m_sQueueSample.m_bReleasingSoundFlag = false;
+					m_sQueueSample.m_nEmittingVolume = emittingVol;
+					m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
+					m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
+					m_sQueueSample.m_bReverbFlag = true;
+					m_sQueueSample.m_bRequireReflection = false;
+					AddSampleToRequestedQueue();
+				}
+			}
 		}
 	}
 }
@@ -6144,7 +6168,7 @@ cAudioManager::ProcessGarages()
 void
 cAudioManager::ProcessFireHydrant()
 {
-	const int SOUND_INTENSITY = 35;
+	const float SOUND_INTENSITY = 35;
 
 	float distSquared;
 
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index daa65470..5d6b4f9f 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -320,7 +320,7 @@ public:
 	void ProcessEntity(int32 sound);                                         // done
 	void ProcessExplosions(int32 explosion);                                 // done
 	void ProcessFireHydrant();                                               // done
-	void ProcessFires(int32 entity);                                         // 
+	void ProcessFires(int32 entity);                                         // done
 	void ProcessFrontEnd();                                                  // 
 	void ProcessGarages();                                                   // 
 	void ProcessCarHeli(cVehicleParams* params);                             // done

From a9db60a1d9e8060920c23e1304a49a8fb8bbc7a7 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 24 Oct 2020 20:47:03 +0300
Subject: [PATCH 10/27] jumbo

---
 src/audio/AudioLogic.cpp | 62 ++++++++++++++++++----------------------
 src/audio/AudioManager.h | 14 ++++-----
 2 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index d999dfed..78cebf0e 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -3704,38 +3704,34 @@ DoJumboVolOffset()
 }
 
 void
-cAudioManager::ProcessJumbo(cVehicleParams *params)
+cAudioManager::ProcessJumbo(cVehicleParams* params)
 {
-	CPlane *plane;
+	CPlane* plane;
 	float position;
 
-	if (params->m_fDistance < SQR(440)) {
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-		plane = (CPlane *)params->m_pVehicle;
-		DoJumboVolOffset();
-		position = PlanePathPosition[plane->m_nPlaneId];
-		if (position <= TakeOffPoint) {
-			if (plane->m_fSpeed <= 0.103344f) {
-				ProcessJumboTaxi();
-				return;
-			}
+	if (params->m_fDistance >= SQR(440))
+		return;
 
+	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	plane = (CPlane*)params->m_pVehicle;
+	DoJumboVolOffset();
+	position = PlanePathPosition[plane->m_nPlaneId];
+	if (position <= TakeOffPoint) {
+		if (plane->m_fSpeed > 0.103344f) {
 			ProcessJumboAccel(plane);
-		} else if (300.0f + TakeOffPoint >= position) {
-			ProcessJumboTakeOff(plane);
-		} else if (LandingPoint - 350.0f >= position) {
-			ProcessJumboFlying();
 		} else {
-			if (position > LandingPoint) {
-				if (plane->m_fSpeed > 0.103344f) {
-					ProcessJumboDecel(plane);
-					return;
-				}
-				ProcessJumboTaxi();
-				return;
-			}
-			ProcessJumboLanding(plane);
+			ProcessJumboTaxi();
 		}
+	} else 	if (position <= TakeOffPoint + 300.0f) {
+		ProcessJumboTakeOff(plane);
+	} else if (position <= LandingPoint - 350.0f) {
+		ProcessJumboFlying();
+	} else if (position <= LandingPoint) {
+		ProcessJumboLanding(plane);
+	} else if (plane->m_fSpeed > 0.103344f) {
+		ProcessJumboDecel(plane);
+	} else {
+		ProcessJumboTaxi();
 	}
 }
 
@@ -3753,25 +3749,23 @@ cAudioManager::ProcessJumboAccel(CPlane *plane)
 {
 	int32 engineFreq;
 	int32 vol;
-	float whineSoundFreq;
 	float modificator;
+	float freqModifier;
 
 	if (SetupJumboFlySound(20)) {
-		modificator = (plane->m_fSpeed - 0.103344f) * 1.6760077f;
-		if (modificator > 1.0f)
-			modificator = 1.0f;
+		modificator = Min(1.0f, (plane->m_fSpeed - 0.103344f) * 1.6760077f);
 		if (SetupJumboRumbleSound(MAX_VOLUME * modificator) && SetupJumboTaxiSound((1.0f - modificator) * 75.f)) {
 			if (modificator < 0.2f) {
-				whineSoundFreq = modificator * 5.f * 14600.0f + 29500;
-				vol = modificator * 5.f * MAX_VOLUME;
-				engineFreq = modificator * 5.f * 6050.f + 16000;
+				freqModifier = modificator * 5.0f;
+				vol = MAX_VOLUME * freqModifier;
+				engineFreq = 6050.0f * freqModifier + 16000;
 			} else {
-				whineSoundFreq = 44100;
+				freqModifier = 1.0f;
 				engineFreq = 22050;
 				vol = MAX_VOLUME;
 			}
 			SetupJumboEngineSound(vol, engineFreq);
-			SetupJumboWhineSound(18, whineSoundFreq);
+			SetupJumboWhineSound(18, 14600.0f * freqModifier + 29500);
 		}
 	}
 }
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 5d6b4f9f..57293442 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -325,13 +325,13 @@ public:
 	void ProcessGarages();                                                   // 
 	void ProcessCarHeli(cVehicleParams* params);                             // done
 	void ProcessVehicleFlatTyre(cVehicleParams* params);                     // done
-	void ProcessJumbo(cVehicleParams *);                                     // 
-	void ProcessJumboAccel(CPlane *plane);                                   // 
-	void ProcessJumboDecel(CPlane *plane);                                   // 
-	void ProcessJumboFlying();                                               // 
-	void ProcessJumboLanding(CPlane *plane);                                 // 
-	void ProcessJumboTakeOff(CPlane *plane);                               	 // 
-	void ProcessJumboTaxi();                                                 // 
+	void ProcessJumbo(cVehicleParams *);                                     // done
+	void ProcessJumboAccel(CPlane *plane);                                   // done
+	void ProcessJumboDecel(CPlane *plane);                                   // done
+	void ProcessJumboFlying();                                               // done
+	void ProcessJumboLanding(CPlane *plane);                                 // done
+	void ProcessJumboTakeOff(CPlane *plane);                               	 // done
+	void ProcessJumboTaxi();                                                 // done
 	void ProcessLoopingScriptObject(uint8 sound);                            // 
 	void ProcessMissionAudio();                                              // 
 	void ProcessMissionAudioSlot(uint8 slot);                                // 

From c4707fe8875a0155725171d060313a52898f3dfe Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 24 Oct 2020 22:06:45 +0300
Subject: [PATCH 11/27] fix merging errors

---
 src/audio/AudioLogic.cpp  | 20 ++++++++++----------
 src/audio/AudioManager.h  |  4 ++--
 src/audio/PoliceRadio.cpp |  1 +
 3 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 78cebf0e..d7f20aec 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -307,7 +307,7 @@ cAudioManager::ProcessPlayerMood()
 	if (m_nPlayerMoodTimer <= curTime) {
 		playerPed = FindPlayerPed();
 		if (playerPed != nil) {
-#ifdef 0
+/*
 			if (playerPed->m_pWanted->m_nWantedLevel > 3) {
 				m_nPlayerMood = 2;
 				return;
@@ -316,7 +316,7 @@ cAudioManager::ProcessPlayerMood()
 				m_nPlayerMood = 1;
 				return;
 			}
-#endif
+*/
 			if (playerPed->m_pWanted->m_nWantedLevel > 1) {
 				m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1;
 				return;
@@ -6165,29 +6165,29 @@ cAudioManager::ProcessFireHydrant()
 	const float SOUND_INTENSITY = 35;
 
 	float distSquared;
+	bool distCalculated = 0;
 
 	m_sQueueSample.m_vecPos = ((CEntity *)m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_pEntity)->GetPosition();
 	distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos);
 	if (distSquared < SQR(SOUND_INTENSITY)) {
-		m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared);
+		CalculateDistance(distCalculated, distSquared);
 		m_sQueueSample.m_nVolume = ComputeVolume(40, 35.0f, m_sQueueSample.m_fDistance);
 		if (m_sQueueSample.m_nVolume != 0) {
-			m_sQueueSample.m_nCounter = 0;
 			m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI;
-			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_bIs2D = false;
 			m_sQueueSample.m_nReleasingVolumeModificator = 4;
 			m_sQueueSample.m_nFrequency = 15591;
-			m_sQueueSample.m_nLoopCount = 0;
+			m_sQueueSample.m_nCounter = 0;
 			m_sQueueSample.m_nEmittingVolume = 40;
+			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+			m_sQueueSample.m_bIs2D = false;
+			m_sQueueSample.m_nLoopCount = 0;
 			m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex);
-			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;
+			m_sQueueSample.m_nReleasingVolumeDivider = 3;
+			m_sQueueSample.m_fSpeedMultiplier = 2.0f;
 			AddSampleToRequestedQueue();
 		}
 	}
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 57293442..a7d987da 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -342,7 +342,7 @@ public:
 	void ProcessPedOneShots(cPedParams *params);                             // 
 	void ProcessPhysical(int32 id);                                          // done
 	void ProcessPlane(cVehicleParams *params);                               // done
-	void ProcessPlayerMood();                                                // done(need redo pointer)
+	void ProcessPlayerMood();                                                // done
 	void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done
 	void ProcessProjectiles();                                               // done
 	void ProcessRainOnVehicle(cVehicleParams *params);                       // done
@@ -373,7 +373,7 @@ public:
 	void ReacquireDigitalHandle() const;                                                                                              // done
 	void ReleaseDigitalHandle() const;                                                                                                // done
 	void ReportCollision(CEntity *entity1, CEntity *entity2, uint8 surface1, uint8 surface2, float collisionPower, float intensity2); // done
-	void ReportCrime(int32 crime, const CVector *pos);                                                                                // done
+	void ReportCrime(eCrimeType crime, const CVector &pos);                                                                           // done
 	void ResetAudioLogicTimers(uint32 timer);                                                                                         // done
 	void ResetPoliceRadio();                                                                                                          // done
 	void ResetTimers(uint32 time);                                                                                                    // done
diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp
index 2f0c7fc3..781040d6 100644
--- a/src/audio/PoliceRadio.cpp
+++ b/src/audio/PoliceRadio.cpp
@@ -686,6 +686,7 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z)
 	float halfY;
 	float quarterX;
 	float quarterY;
+	int32 sample;
 	bool processed = false;
 	CVector vec = CVector(x, y, z);
 

From 63c7df9f0908e27f9394f7668e520cc87e09f483 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sat, 24 Oct 2020 22:26:45 +0300
Subject: [PATCH 12/27] mark reflections done

---
 src/audio/AudioManager.cpp | 2 --
 src/audio/AudioManager.h   | 6 +++---
 2 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index d89f7891..516cc8af 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -624,7 +624,6 @@ cAudioManager::AddDetailsToRequestedOrderList(uint8 sample)
 	m_abSampleQueueIndexTable[m_nActiveSampleQueue][i] = sample;
 }
 
-// --MIAMI: Done
 void
 cAudioManager::AddReflectionsToRequestedQueue()
 {
@@ -686,7 +685,6 @@ cAudioManager::AddReflectionsToRequestedQueue()
 	m_sQueueSample.m_fDistance = oldDist;
 }
 
-// --MIAMI: Done
 void
 cAudioManager::UpdateReflections()
 {
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index a7d987da..e03c77fa 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -410,9 +410,9 @@ public:
 	void Terminate(); //done
 	void TranslateEntity(Const CVector *v1, CVector *v2) const; //done
 
-	void UpdateReflections();
-	bool UsesReverseWarning(int32 model) const; //done
-	bool UsesSiren(cVehicleParams *params) const; //done
+	void UpdateReflections();                              //done
+	bool UsesReverseWarning(int32 model) const;            //done
+	bool UsesSiren(cVehicleParams *params) const;          //done
 	bool UsesSirenSwitching(cVehicleParams* params) const; //done
 
 	CVehicle *FindVehicleOfPlayer(); //done

From 211ab16ddb0cfbb32f74bf8b16dab4faa91309da Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 25 Oct 2020 16:14:29 +0300
Subject: [PATCH 13/27] skiding

---
 src/audio/AudioLogic.cpp | 62 +++++++++++++++++++++++++++++-----------
 src/audio/AudioManager.h |  7 +++--
 2 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index d7f20aec..9231d448 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2055,6 +2055,13 @@ 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;
@@ -2062,29 +2069,48 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	automobile = (CAutomobile *)params->m_pVehicle;
-	if (automobile->m_nWheelsOnGround == 0)
+	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 < ARRAY_SIZE(automobile->m_aWheelState); i++) {
-		if (automobile->m_aWheelState[i] == WHEEL_STATE_NORMAL || automobile->Damage.GetWheelStatus(i) == WHEEL_STATUS_MISSING)
+
+	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(i, automobile, transmission, params->m_fVelocityChange);
+			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(i, automobile, transmission, params->m_fVelocityChange);
+				newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange);
 			else
-				newSkidVal = GetVehicleNonDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange);
+				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(i, automobile, transmission, params->m_fVelocityChange);
+				newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange);
 			else
-				newSkidVal = GetVehicleNonDriveWheelSkidValue(i, automobile, transmission, params->m_fVelocityChange);
+				newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange);
 			break;
 		default:
 			break;
@@ -2111,6 +2137,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 			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;
@@ -2118,6 +2145,8 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 			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;
 			}
 
@@ -2141,18 +2170,17 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 }
 
 float
-cAudioManager::GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange)
+cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange)
 {
 	float relativeVelChange = 0.0f;
-	float gasPedalAudio = automobile->m_fGasPedalAudio;
 	float velChange;
 	float relativeVel;
 
-	switch (automobile->m_aWheelState[wheel])
+	switch (wheelState)
 	{
 	case WHEEL_STATE_SPINNING:
 		if (gasPedalAudio > 0.4f)
-			relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) / (4.0f / 3.0f);
+			relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) * 0.75f;
 		break;
 	case WHEEL_STATE_SKIDDING:
 		relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity);
@@ -2173,18 +2201,18 @@ cAudioManager::GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobil
 		break;
 	}
 
-	return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f));
+	return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f));
 }
 
 float
-cAudioManager::GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange)
+cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission *transmission, float velocityChange)
 {
 	float relativeVelChange = 0.0f;
 
-	if (automobile->m_aWheelState[wheel] == WHEEL_STATE_SKIDDING)
+	if (wheelState == WHEEL_STATE_SKIDDING)
 		relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity);
 
-	return Max(relativeVelChange, Min(1.0f, Abs(automobile->m_vecTurnSpeed.z) * 20.0f));
+	return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f));
 }
 
 bool
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index e03c77fa..c3890817 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -4,6 +4,7 @@
 #include "AudioCollision.h"
 #include "PoliceRadio.h"
 #include "VehicleModelInfo.h"
+#include "vehicle.h"
 
 class tSound
 {
@@ -277,8 +278,8 @@ public:
 	uint8 GetNum3DProvidersAvailable() const; // done
 	int32 GetPedCommentSfx(CPed *ped, int32 sound);
 	void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample, uint32 maxOffset) const;
-	float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
-	float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
+	float GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange); // done
+	float GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange);                   // done
 
 	bool HasAirBrakes(int32 model) const; // done
 
@@ -362,7 +363,7 @@ public:
 	bool ProcessVehicleReverseWarning(cVehicleParams *params); // done
 	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // done
 	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
-	bool ProcessVehicleSkidding(cVehicleParams *params);       // 
+	bool ProcessVehicleSkidding(cVehicleParams *params);       // done
 	void ProcessWaterCannon(int32);                            // done
 	void ProcessWeather(int32 id);                             // done
 	bool ProcessWetRoadNoise(cVehicleParams *params);          // done

From 04b841c71992e564c18635a9a4af33d74dcdd4a0 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 26 Oct 2020 00:11:04 +0300
Subject: [PATCH 14/27] processVehicleOneShots

---
 src/audio/AudioLogic.cpp    | 237 +++++++++++++++++++++++++++---------
 src/audio/AudioManager.h    |   2 +-
 src/audio/soundlist.h       |   2 +-
 src/vehicles/Automobile.cpp |   2 +-
 4 files changed, 182 insertions(+), 61 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 9231d448..9626cefc 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2613,11 +2613,17 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 	float relVol;
 	float vol;
 	bool noReflections;
+	bool isHeli;
 	float maxDist;
 	cPedParams pedParams;
+	static uint8 GunIndex = 53;
 
+	pedParams.m_pPed = nil;
+	pedParams.m_bDistanceCalculated = false;
+	pedParams.m_fDistance = 0.0f;
 	for (int i = 0; i < m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_AudioEvents; i++) {
-		noReflections = 0;
+		noReflections = false;
+		isHeli = false;
 		m_sQueueSample.m_bRequireReflection = false;
 		event = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i];
 		switch (event) {
@@ -2634,20 +2640,22 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			case OLD_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE;
 				break;
-			case NEW_DOOR:
-			default:
-				m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE;
-				break;
 			case TRUCK_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_CLOSE;
 				break;
 			case BUS_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES;
 				break;
+			default:
+				m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE;
+				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22;
-			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
+			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
+				m_sQueueSample.m_nFrequency = 28062;
+			else
+				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32);
 			m_sQueueSample.m_nReleasingVolumeModificator = 3;
 			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
@@ -2668,20 +2676,22 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			case OLD_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_OPEN;
 				break;
-			case NEW_DOOR:
-			default:
-				m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_OPEN;
-				break;
 			case TRUCK_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_OPEN;
 				break;
 			case BUS_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_AIR_BRAKES;
 				break;
+			default:
+				m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_OPEN;
+				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10;
-			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
+			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
+				m_sQueueSample.m_nFrequency = 23459;
+			else
+				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
 			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32);
 			m_sQueueSample.m_nReleasingVolumeModificator = 3;
 			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
@@ -2690,40 +2700,64 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			break;
 		}
 		case SOUND_CAR_WINDSHIELD_CRACK: {
-			const float SOUND_INTENSITY = 30.0f;
+			const float SOUND_INTENSITY = 40.0f;
 			maxDist = SQR(SOUND_INTENSITY);
 			m_sQueueSample.m_nSampleIndex = SFX_GLASS_CRACK;
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = 68;
-			emittingVol = m_anRandomTable[1] % 30 + 60;
+			emittingVol = m_anRandomTable[1] % 30 + 80; //GetRandomNumberInRange(1, 80, 109)
 			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_GLASS_CRACK);
 			m_sQueueSample.m_nReleasingVolumeModificator = 5;
 			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
 			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
 		} break;
-		case SOUND_CAR_JUMP: {
+		case SOUND_CAR_JUMP: 
+		case SOUND_CAR_JUMP_2: {
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 WheelIndex = 82;
-			emittingVol = Max(80.f, 2 * (100.f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
 			maxDist = SQR(SOUND_INTENSITY);
-			m_sQueueSample.m_nSampleIndex = SFX_TYRE_BUMP;
+			if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) {
+				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B;
+				emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
+			} else {
+				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BUMP;
+				emittingVol = Max(80.f, 2 * (100.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
+			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = WheelIndex++;
 			if (WheelIndex > 85)
 				WheelIndex = 82;
 			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BUMP);
 			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
-			if (params->m_nIndex == RCBANDIT) {
+			if (params->m_VehicleType == VEHICLE_TYPE_BIKE)
 				m_sQueueSample.m_nFrequency *= 2;
-				emittingVol /= 2;
-			}
 			m_sQueueSample.m_nReleasingVolumeModificator = 6;
 			m_sQueueSample.m_fSpeedMultiplier = 2.0f;
 			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
 			break;
 		}
+		case SOUND_CAR_TYRE_POP: {
+			const float SOUND_INTENSITY = 60.0f;
+			static uint8 WheelIndex = 91;
+			m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST;
+			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+			m_sQueueSample.m_nCounter = WheelIndex++;
+			if (WheelIndex > 94)
+				WheelIndex = 91;
+			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BURST);
+			m_sQueueSample.m_nFrequency += RandomDisplacement(2000);
+			m_sQueueSample.m_nReleasingVolumeModificator = 2;
+			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
+			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+			maxDist = SQR(SOUND_INTENSITY);
+			emittingVol = m_anRandomTable[4] % 10 + 117;
+			break;
+		}
 		case SOUND_CAR_ENGINE_START: {
 			const float SOUND_INTENSITY = 40.0f;
+			if (params->m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR
+				|| params->m_pVehicle->m_modelIndex == MI_CADDY)
+				continue;
 			emittingVol = 60;
 			maxDist = SQR(SOUND_INTENSITY);
 			m_sQueueSample.m_nSampleIndex = SFX_CAR_STARTER;
@@ -2798,24 +2832,24 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			break;
 		}
 		case SOUND_CAR_SPLASH: {
-			const float SOUND_INTENSITY = 40.0f;
+			const float SOUND_INTENSITY = 60.0f;
 			static uint8 WaveIndex = 41;
 			vol = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i];
-			if (vol <= 300.f)
+			if (vol <= 150.0f)
 				continue;
-			if (vol > 1200.f)
-				m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] = 1200.0f;
-			relVol = (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] - 300.f) / 900.f;
+			if (vol > 800.0f)
+				m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] = 800.0f;
+			relVol = (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i] - 150.0f) / 650.0f;
 			m_sQueueSample.m_nSampleIndex = (m_anRandomTable[0] & 1) + SFX_BOAT_SPLASH_1;
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = WaveIndex++;
 			if (WaveIndex > 46)
 				WaveIndex = 41;
-			m_sQueueSample.m_nFrequency = (7000.f * relVol) + 6000;
+			m_sQueueSample.m_nFrequency = (7000.0f * relVol) + 6000;
 			m_sQueueSample.m_nReleasingVolumeModificator = 3;
 			m_sQueueSample.m_fSpeedMultiplier = 2.0f;
 			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
-			emittingVol = (55.f * relVol);
+			emittingVol = (35.0f * relVol);
 			maxDist = SQR(SOUND_INTENSITY);
 			break;
 		}
@@ -2832,6 +2866,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			maxDist = SQR(SOUND_INTENSITY);
 			break;
 		}*/
+#ifdef GTA_TRAIN
 		case SOUND_TRAIN_DOOR_CLOSE:
 		case SOUND_TRAIN_DOOR_OPEN: {
 			const float SOUND_INTENSITY = 35.0f;
@@ -2846,20 +2881,21 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			emittingVol = m_anRandomTable[1] % 20 + 70;
 			break;
 		}
+#endif
 		case SOUND_CAR_TANK_TURRET_ROTATE: {
 			const float SOUND_INTENSITY = 40.0f;
 			vol = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i];
-			if (vol > 96.0f / 2500.0f)
-				vol = 96.0f / 2500.0f;
+			if (vol > 24.0f / 625.0f)
+				vol = 24.0f / 625.0f;
 			m_sQueueSample.m_nSampleIndex = SFX_TANK_TURRET;
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = 79;
-			m_sQueueSample.m_nFrequency = (3000.f * vol * 2500.0f / 96.0f) + 9000;
+			m_sQueueSample.m_nFrequency = (3000.0f * vol * 625.0f / 24.0f) + 9000;
 			m_sQueueSample.m_nReleasingVolumeModificator = 2;
 			m_sQueueSample.m_fSpeedMultiplier = 2.0f;
 			m_sQueueSample.m_nReleasingVolumeDivider = 3;
 			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
-			emittingVol = (37.f * vol * 2500.0f / 96.0f) + 90;
+			emittingVol = (37.0f * vol * 625.0f / 24.0f) + 90;
 			maxDist = SQR(SOUND_INTENSITY);
 			noReflections = true;
 			break;
@@ -2891,9 +2927,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			emittingVol = m_anRandomTable[4] % 25 + 75;
 			break;
 		}
-		case SOUND_31:{
+		case SOUND_HELI_BLADE:{
 			const float SOUND_INTENSITY = 35.0f;
-			static uint8 HeliIndex = 0;
+			static uint8 HeliIndex = 89;
 			relVol = ((CAutomobile*)params->m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f;
 			if (relVol < 0.2f || relVol == 1.0f)
 				continue;
@@ -2901,8 +2937,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			maxDist = SQR(SOUND_INTENSITY);
 			m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_ROT;
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = HeliIndex + 89;
-			HeliIndex = HeliIndex != 1 ? HeliIndex + 1 : 0; //maybe better use 1 and 0, to avoid extreme values
+			m_sQueueSample.m_nCounter = HeliIndex++;
+			if (HeliIndex > 90)
+				HeliIndex = 89;
 			m_sQueueSample.m_nFrequency = (8000.0f * relVol) + 16000;
 			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 32);
 			m_sQueueSample.m_nReleasingVolumeModificator = 2;
@@ -2912,20 +2949,68 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		}
 		case SOUND_WEAPON_SHOT_FIRED: {
 			const float SOUND_INTENSITY = 120.0f;
-			static uint8 GunIndex = 53;
-			emittingVol = m_anRandomTable[2];
-			maxDist = SQR(SOUND_INTENSITY);
-			m_sQueueSample.m_nSampleIndex = SFX_UZI_LEFT;
-			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = GunIndex++;
-			emittingVol = emittingVol % 15 + 65;
-			if (GunIndex > 58)
-				GunIndex = 53;
-			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_UZI_LEFT);
-			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
-			m_sQueueSample.m_nReleasingVolumeModificator = 3;
-			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
-			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+			CVehicle* playerVeh;
+			CPlayerPed* playerPed;
+
+			switch (params->m_pVehicle->m_modelIndex) {
+			case MI_HUNTER:
+			case MI_CHOPPER:
+			case MI_SEASPAR:
+			case MI_SPARROW:
+			case MI_MAVERICK:
+			case MI_VCNMAV:
+				if (params->m_pVehicle->m_modelIndex == MI_HUNTER) {
+					if (Pads[0].GetHandBrake() == 0) {
+						playerVeh = FindPlayerVehicle();
+						playerPed = FindPlayerPed();
+						if (playerVeh == 0 && playerPed != 0) {
+							if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE)
+								playerVeh = (CVehicle*)playerPed->m_attachedTo;
+						}
+						if (playerVeh != params->m_pVehicle) {
+							m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT;
+							m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+						} else {
+							m_sQueueSample.m_nSampleIndex = SFX_ROCKET_LEFT;
+							m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+						}
+					} else {
+						m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT;
+						m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+					}
+				} else {
+					m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT;
+					m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+				}
+				maxDist = SQR(SOUND_INTENSITY);
+				m_sQueueSample.m_nCounter = GunIndex++;
+				emittingVol = MAX_VOLUME;
+				if (GunIndex > 58)
+					GunIndex = 53;
+				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_M60_LEFT);
+				m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
+				m_sQueueSample.m_nReleasingVolumeModificator = 2;
+				m_sQueueSample.m_fSpeedMultiplier = 0.0f;
+				m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+				m_sQueueSample.m_bRequireReflection = true;
+				isHeli = true;
+				break;
+			default:
+				maxDist = SQR(SOUND_INTENSITY);
+				m_sQueueSample.m_nSampleIndex = SFX_UZI_LEFT;
+				m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+				m_sQueueSample.m_nCounter = GunIndex++;
+				emittingVol = m_anRandomTable[2] % 15 + 65;
+				if (GunIndex > 58)
+					GunIndex = 53;
+				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_UZI_LEFT);
+				m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
+				m_sQueueSample.m_nReleasingVolumeModificator = 3;
+				m_sQueueSample.m_fSpeedMultiplier = 0.0f;
+				m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
+				m_sQueueSample.m_bRequireReflection = true;
+				break;
+			}
 			break;
 		}
 		case SOUND_WEAPON_HIT_VEHICLE: {
@@ -2959,14 +3044,12 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			maxDist = SQR(SOUND_INTENSITY);
 			break;
 		}
-		case SOUND_PED_HELI_PLAYER_FOUND:
-			pedParams.m_pPed = nil;
-			pedParams.m_bDistanceCalculated = false;
-			pedParams.m_fDistance = 0.0f;
+		case SOUND_PED_HELI_PLAYER_FOUND: {
 			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
 			pedParams.m_fDistance = params->m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_HELI_PLAYER_FOUND);
 			continue;
+		}
 		/* case SOUND_PED_BODYCAST_HIT:
 			pedParams.m_pPed = nil;
 			pedParams.m_bDistanceCalculated = false;
@@ -2975,8 +3058,17 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			pedParams.m_fDistance = params->m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT);
 			continue; */
+		case SOUND_115: {
+			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
+			pedParams.m_fDistance = params->m_fDistance;
+			SetupPedComments(&pedParams, SOUND_115);
+		}
 		case SOUND_WATER_FALL: {
 			const float SOUND_INTENSITY = 40.0f;
+			static uint32 WaterFallFrame = 0;
+			if (m_FrameCounter <= WaterFallFrame)
+				continue;
+			WaterFallFrame = m_FrameCounter + 6;
 			m_sQueueSample.m_nSampleIndex = SFX_SPLASH_1;
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = 15;
@@ -2995,10 +3087,10 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			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 = SampleManager.GetSampleBaseFrequency(SFX_PED_CRUNCH_1) + RandomDisplacement(600);
+			m_sQueueSample.m_nFrequency = RandomDisplacement(6000) + 16000;
 			m_sQueueSample.m_nReleasingVolumeModificator = 1;
 			m_sQueueSample.m_fSpeedMultiplier = 0.0f;
-			m_sQueueSample.m_fSoundIntensity = 40.0f;
+			m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY;
 			++CrunchOffset;
 			maxDist = SQR(SOUND_INTENSITY);
 			emittingVol = m_anRandomTable[4] % 20 + 55;
@@ -3009,14 +3101,15 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		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 = (vol / 20.0f * 127.f);
-			if (!emittingVol)
+			emittingVol = Min(127, (3 * (vol / 20.0f * 127.f)) / 2);
+			if (emittingVol == 0)
 				continue;
 
-			m_sQueueSample.m_nSampleIndex = (m_anRandomTable[2] & 3) + SFX_FIGHT_1;
+			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) / 2;
+			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;
@@ -3041,8 +3134,36 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(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;
+						AddSampleToRequestedQueue();
+						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();
+						continue;
+					}
+					isHeli = false;
+				}
 				m_sQueueSample.m_bIs2D = false;
 				AddSampleToRequestedQueue();
+/* looks like this code ca't be reached(originaly it exist bcs used goto)
+				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();
+				}*/
+				continue;
+
 			}
 		}
 	}
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index c3890817..3c4b2116 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -359,7 +359,7 @@ public:
 	void ProcessVehicleEngine(cVehicleParams *params);         // done
 	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
 	bool ProcessVehicleHorn(cVehicleParams *params);           // done
-	void ProcessVehicleOneShots(cVehicleParams *params);       // 
+	void ProcessVehicleOneShots(cVehicleParams *params);       // done
 	bool ProcessVehicleReverseWarning(cVehicleParams *params); // done
 	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // done
 	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
diff --git a/src/audio/soundlist.h b/src/audio/soundlist.h
index 973a1585..44056d55 100644
--- a/src/audio/soundlist.h
+++ b/src/audio/soundlist.h
@@ -33,7 +33,7 @@ enum eSound : uint16
 	SOUND_CAR_TANK_TURRET_ROTATE,
 	SOUND_CAR_BOMB_TICK,
 	SOUND_PLANE_ON_GROUND,
-	SOUND_31,
+	SOUND_HELI_BLADE,
 	SOUND_32,
 	SOUND_STEP_START,
 	SOUND_STEP_END,
diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp
index d1a7505e..ddfc1441 100644
--- a/src/vehicles/Automobile.cpp
+++ b/src/vehicles/Automobile.cpp
@@ -1494,7 +1494,7 @@ CAutomobile::ProcessControl(void)
 				blade = Multiply3x3(blade, GetMatrix());
 				camDist /= Max(Sqrt(distSq), 0.01f);
 				if(Abs(DotProduct(camDist, blade)) > 0.95f){
-					DMAudio.PlayOneShot(m_audioEntityId, SOUND_31, 0.0f);
+					DMAudio.PlayOneShot(m_audioEntityId, SOUND_HELI_BLADE, 0.0f);
 					m_fPropellerRotation = m_aWheelRotation[1];
 				}
 			}

From 96ccb1333b2d8cabe914c4a9f65a640f3db81c56 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 26 Oct 2020 00:14:59 +0300
Subject: [PATCH 15/27] cleanup processVehicleOneShots, processVehicleX done

---
 src/audio/AudioLogic.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 9626cefc..436c5ba9 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2651,7 +2651,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22;
+			m_sQueueSample.m_nCounter = event + 22;
 			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 28062;
 			else
@@ -2687,7 +2687,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10;
+			m_sQueueSample.m_nCounter = event + 10;
 			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 23459;
 			else
@@ -2716,7 +2716,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 WheelIndex = 82;
 			maxDist = SQR(SOUND_INTENSITY);
-			if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) {
+			if (event == SOUND_CAR_JUMP_2) {
 				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B;
 				emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
 			} else {

From 4bcd1769442b0b410bc3b14867ee23a2f18b78bf Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 26 Oct 2020 00:17:21 +0300
Subject: [PATCH 16/27] fix merge

---
 src/audio/AudioManager.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index eb8c0bf2..9a7c754d 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -321,7 +321,7 @@ public:
 	void ProcessEntity(int32 sound);                                         // done
 	void ProcessExplosions(int32 explosion);                                 // done
 	void ProcessFireHydrant();                                               // done
-	void ProcessFires(int32 entity);                                         // 
+	void ProcessFires(int32 entity);                                         // done
 	void ProcessFrontEnd();                                                  // done
 	void ProcessGarages();                                                   // 
 	void ProcessCarHeli(cVehicleParams* params);                             // done

From c3cbf4353d284b1f0f6280a0495085d8221f30e8 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 26 Oct 2020 14:02:11 +0300
Subject: [PATCH 17/27] Fix build and use enum in ProcessPlayerMood

---
 src/audio/AudioLogic.cpp | 16 ++++++----------
 src/audio/AudioManager.h | 22 +++++++++++-----------
 2 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 40e0ba6c..1fdba82a 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -307,20 +307,16 @@ cAudioManager::ProcessPlayerMood()
 	if (m_nPlayerMoodTimer <= curTime) {
 		playerPed = FindPlayerPed();
 		if (playerPed != nil) {
-/*
+
 			if (playerPed->m_pWanted->m_nWantedLevel > 3) {
-				m_nPlayerMood = 2;
+				m_nPlayerMood = PLAYER_MOOD_ANGRY;
 				return;
 			}
 			if (playerPed->m_pWanted->m_nWantedLevel > 1) {
-				m_nPlayerMood = 1;
-				return;
-			}
-*/
-			if (playerPed->m_pWanted->m_nWantedLevel > 1) {
-				m_nPlayerMood = (playerPed->m_pWanted->m_nWantedLevel > 3) ? 2 : 1;
+				m_nPlayerMood = PLAYER_MOOD_PISSED_OFF;
 				return;
 			}
+
 			lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime();
 			if (*lastMisstonPassedTime != -1) {
 				if (curTime < *lastMisstonPassedTime) {
@@ -328,11 +324,11 @@ cAudioManager::ProcessPlayerMood()
 					return;
 				}
 				if (curTime < *lastMisstonPassedTime + 180000) {
-					m_nPlayerMood = 3;
+					m_nPlayerMood = PLAYER_MOOD_WISECRACKING;
 					return;
 				}
 			}
-			m_nPlayerMood = 0;
+			m_nPlayerMood = PLAYER_MOOD_CALM;
 		}
 	}
 }
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 9a7c754d..97c332a2 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -4,7 +4,7 @@
 #include "AudioCollision.h"
 #include "PoliceRadio.h"
 #include "VehicleModelInfo.h"
-#include "vehicle.h"
+#include "Vehicle.h"
 
 class tSound
 {
@@ -304,19 +304,19 @@ public:
 	void PreloadMissionAudio(uint8 slot, Const char *name); // done
 	void PreTerminateGameSpecificShutdown();                // done
 	/// processX - main logic of adding new sounds
-	void ProcessActiveQueues();                             // done
-	bool ProcessAirBrakes(cVehicleParams *params);          // done
-	bool ProcessBoatEngine(cVehicleParams *params);
-	bool ProcessBoatMovingOverWater(cVehicleParams *params);
+	void ProcessActiveQueues();                              // done
+	bool ProcessAirBrakes(cVehicleParams *params);           // done
+	bool ProcessBoatEngine(cVehicleParams *params);          
+	bool ProcessBoatMovingOverWater(cVehicleParams *params); 
 #ifdef GTA_BRIDGE
-	void ProcessBridge();
-	void ProcessBridgeMotor();
-	void ProcessBridgeOneShots();
-	void ProcessBridgeWarning();
+	void ProcessBridge();         // done(bcs not exists in VC)
+	void ProcessBridgeMotor();    // done(bcs not exists in VC)
+	void ProcessBridgeOneShots(); // done(bcs not exists in VC)
+	void ProcessBridgeWarning();  // done(bcs not exists in VC)
 #endif
 	bool ProcessCarBombTick(cVehicleParams *params);                         // done
 	void ProcessCesna(cVehicleParams *params);                               // 
-	//void ProcessCrane();                                                   // 
+	//void ProcessCrane();                                                   // done(bcs not exists in VC)
 	bool ProcessEngineDamage(cVehicleParams *params);                        // done
 	void ProcessEntity(int32 sound);                                         // done
 	void ProcessExplosions(int32 explosion);                                 // done
@@ -352,7 +352,7 @@ public:
 	void ProcessScriptObject(int32 id);                                      // done
 	void ProcessSpecial();                                                   // done
 #ifdef GTA_TRAIN
-	bool ProcessTrainNoise(cVehicleParams *params);
+	bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC)
 #endif
 	void ProcessVehicle(CVehicle *vehicle);                    // done
 	bool ProcessVehicleDoors(cVehicleParams *params);          // done

From 5ea9285c5ba3720e9f227b61cc88fcdf2359d91b Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 1 Nov 2020 22:42:45 +0300
Subject: [PATCH 18/27] changes in switch, and mark code

---
 src/audio/AudioLogic.cpp | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 1fdba82a..8bc9c880 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2636,6 +2636,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			case OLD_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE;
 				break;
+			case NEW_DOOR:
+				m_sQueueSample.m_nSampleIndex = SFX_NEW_CAR_DOOR_CLOSE;
+				break;
 			case TRUCK_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_TRUCK_DOOR_CLOSE;
 				break;
@@ -2647,7 +2650,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = event + 22;
+			m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same
 			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 28062;
 			else
@@ -3867,7 +3870,7 @@ cAudioManager::ProcessJumbo(cVehicleParams* params)
 		} else {
 			ProcessJumboTaxi();
 		}
-	} else 	if (position <= TakeOffPoint + 300.0f) {
+	} else if (position <= TakeOffPoint + 300.0f) {
 		ProcessJumboTakeOff(plane);
 	} else if (position <= LandingPoint - 350.0f) {
 		ProcessJumboFlying();

From cebf32c46c43b55caa96ada3dece3473b6db7785 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 1 Nov 2020 23:38:45 +0300
Subject: [PATCH 19/27] mark code

---
 src/audio/AudioLogic.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 8bc9c880..44ca4b65 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2686,7 +2686,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = event + 10;
+			m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]
 			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 23459;
 			else
@@ -2715,7 +2715,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 WheelIndex = 82;
 			maxDist = SQR(SOUND_INTENSITY);
-			if (event == SOUND_CAR_JUMP_2) {
+			if (event == SOUND_CAR_JUMP_2) { //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]
 				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B;
 				emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
 			} else {

From 174424c5206100e442342b2e9b0cff5c16b239db Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Mon, 2 Nov 2020 12:05:23 +0300
Subject: [PATCH 20/27] fix serviceSoundEffects an cleanup

---
 src/audio/AudioLogic.cpp   | 14 ++------------
 src/audio/AudioManager.cpp |  1 -
 2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 44ca4b65..3c95273a 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -179,7 +179,7 @@ cAudioManager::PostInitialiseGameSpecificSetup()
 
 	ResetAudioLogicTimers(CTimer::GetTimeInMilliseconds());
 	m_bIsPlayerShutUp = false;
-	m_nPlayerMood = 0;
+	m_nPlayerMood = PLAYER_MOOD_CALM;
 	m_nPlayerMoodTimer = 0;
 }
 
@@ -863,7 +863,7 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 }
 
 void
-cAudioManager::ProcessRainOnVehicle(cVehicleParams* params)
+cAudioManager::ProcessRainOnVehicle(cVehicleParams *params)
 {
 	const int SOUND_INTENSITY = 22.0f;
 
@@ -3151,16 +3151,6 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				}
 				m_sQueueSample.m_bIs2D = false;
 				AddSampleToRequestedQueue();
-/* looks like this code ca't be reached(originaly it exist bcs used goto)
-				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();
-				}*/
 				continue;
 
 			}
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index 516cc8af..c9bd6c17 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -438,7 +438,6 @@ cAudioManager::IsAudioInitialised() const
 void
 cAudioManager::ServiceSoundEffects()
 {
-	m_FrameCounter++;
 	m_bFifthFrameFlag = (m_FrameCounter++ % 5) == 0;
 	if (m_nUserPause && !m_nPreviousUserPause) {
 		for (int32 i = 0; i < allChannels; i++)

From 89b622eea861f5566dc61d8d35fc72ea4bcb8f1d Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Wed, 4 Nov 2020 11:37:17 +0300
Subject: [PATCH 21/27] FORMAT

---
 src/audio/AudioLogic.cpp | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 3c95273a..be9758e4 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -300,7 +300,7 @@ CVehicle *cAudioManager::FindVehicleOfPlayer()
 void
 cAudioManager::ProcessPlayerMood()
 {
-	CPlayerPed* playerPed;
+	CPlayerPed *playerPed;
 	uint32* lastMisstonPassedTime;
 	uint32 curTime = CTimer::GetTimeInMilliseconds();
 
@@ -336,7 +336,7 @@ cAudioManager::ProcessPlayerMood()
 void
 cAudioManager::ProcessSpecial()
 {
-	CPlayerPed* playerPed;
+	CPlayerPed *playerPed;
 
 	if (m_nUserPause) {
 		if (!m_nPreviousUserPause) {
@@ -867,7 +867,7 @@ cAudioManager::ProcessRainOnVehicle(cVehicleParams *params)
 {
 	const int SOUND_INTENSITY = 22.0f;
 
-	CVehicle* veh;
+	CVehicle *veh;
 	uint8 emittingVol;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain())
@@ -1147,7 +1147,7 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
 }
 
 bool
-cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
+cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
 {
 	const float SOUND_INTENSITY = 95.0f;
 
@@ -1215,7 +1215,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams* params)
 }
 
 bool
-cAudioManager::ProcessWetRoadNoise(cVehicleParams* params)
+cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
 {
 	const float SOUND_INTENSITY = 30.0f;
 
@@ -2166,7 +2166,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 }
 
 float
-cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange)
+cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange)
 {
 	float relativeVelChange = 0.0f;
 	float velChange;
@@ -2201,7 +2201,7 @@ cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelSta
 }
 
 float
-cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission *transmission, float velocityChange)
+cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange)
 {
 	float relativeVelChange = 0.0f;
 
@@ -2212,7 +2212,7 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheel
 }
 
 bool
-cAudioManager::ProcessVehicleHorn(cVehicleParams* params)
+cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
@@ -2288,11 +2288,11 @@ cAudioManager::UsesSirenSwitching(cVehicleParams *params) const
 }
 
 bool
-cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams* params)
+cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params)
 {
 	const float SOUND_INTENSITY = 110.0f;
 
-	CVehicle* veh;
+	CVehicle *veh;
 	uint8 volume;
 
 	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
@@ -2948,8 +2948,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		}
 		case SOUND_WEAPON_SHOT_FIRED: {
 			const float SOUND_INTENSITY = 120.0f;
-			CVehicle* playerVeh;
-			CPlayerPed* playerPed;
+			CVehicle *playerVeh;
+			CPlayerPed *playerPed;
 
 			switch (params->m_pVehicle->m_modelIndex) {
 			case MI_HUNTER:
@@ -2962,7 +2962,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 					if (Pads[0].GetHandBrake() == 0) {
 						playerVeh = FindPlayerVehicle();
 						playerPed = FindPlayerPed();
-						if (playerVeh == 0 && playerPed != 0) {
+						if (playerVeh == nil && playerPed != nil) {
 							if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE)
 								playerVeh = (CVehicle*)playerPed->m_attachedTo;
 						}
@@ -3842,9 +3842,9 @@ DoJumboVolOffset()
 }
 
 void
-cAudioManager::ProcessJumbo(cVehicleParams* params)
+cAudioManager::ProcessJumbo(cVehicleParams *params)
 {
-	CPlane* plane;
+	CPlane *plane;
 	float position;
 
 	if (params->m_fDistance >= SQR(440))

From f8cc86c227b63f0bf45a9a152935b765a3b4a953 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 16:23:20 +0300
Subject: [PATCH 22/27] fix merge

---
 src/audio/AudioManager.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 9f833a6c..992b21a0 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -374,8 +374,8 @@ public:
 	uint8 GetNum3DProvidersAvailable() const; // done
 	uint32 GetPedCommentSfx(CPed *ped, int32 sound);
 	void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const;
-	float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
-	float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);
+	float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);   //done
+	float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);//done
 
 	bool HasAirBrakes(int32 model) const; // done
 

From a553ac87161e8caff7f890ebb79b38e9cac7b5c8 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 17:49:10 +0300
Subject: [PATCH 23/27] fix for merge fix

---
 src/audio/AudioLogic.cpp | 4 ++--
 src/audio/AudioManager.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 140981b9..53302f16 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -3057,10 +3057,10 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			pedParams.m_fDistance = params->m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT);
 			continue; */
-		case SOUND_115: {
+		case SOUND_PED_VCPA_PLAYER_FOUND: {
 			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
 			pedParams.m_fDistance = params->m_fDistance;
-			SetupPedComments(&pedParams, SOUND_115);
+			SetupPedComments(&pedParams, SOUND_PED_VCPA_PLAYER_FOUND);
 		}
 		case SOUND_WATER_FALL: {
 			const float SOUND_INTENSITY = 40.0f;
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 992b21a0..cdb59412 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -374,8 +374,8 @@ public:
 	uint8 GetNum3DProvidersAvailable() const; // done
 	uint32 GetPedCommentSfx(CPed *ped, int32 sound);
 	void GetPhrase(uint32 &phrase, uint32 &prevPhrase, uint32 sample, uint32 maxOffset) const;
-	float GetVehicleDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);   //done
-	float GetVehicleNonDriveWheelSkidValue(uint8 wheel, CAutomobile *automobile, cTransmission *transmission, float velocityChange);//done
+	float GetVehicleDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, float gasPedalAudio, cTransmission* transmission, float velocityChange); // done
+	float GetVehicleNonDriveWheelSkidValue(CVehicle* veh, tWheelState wheelState, cTransmission* transmission, float velocityChange);                   // done
 
 	bool HasAirBrakes(int32 model) const; // done
 

From 95bd5b073a9e05a362d8fd8f64a0a1abba597253 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 20:31:24 +0300
Subject: [PATCH 24/27] pointers into referencies!

---
 src/audio/AudioLogic.cpp | 622 +++++++++++++++++++--------------------
 src/audio/AudioManager.h |  54 ++--
 src/control/Script.h     |   2 +-
 3 files changed, 339 insertions(+), 339 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 53302f16..6270e6d8 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -301,7 +301,7 @@ void
 cAudioManager::ProcessPlayerMood()
 {
 	CPlayerPed *playerPed;
-	uint32* lastMisstonPassedTime;
+	uint32& lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime();
 	uint32 curTime = CTimer::GetTimeInMilliseconds();
 
 	if (m_nPlayerMoodTimer <= curTime) {
@@ -317,13 +317,13 @@ cAudioManager::ProcessPlayerMood()
 				return;
 			}
 
-			lastMisstonPassedTime = CTheScripts::GetLastMissionPassedTime();
-			if (*lastMisstonPassedTime != -1) {
-				if (curTime < *lastMisstonPassedTime) {
-					*lastMisstonPassedTime = curTime;
+			//lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime();
+			if (lastMissionPassedTime != -1) {
+				if (curTime < lastMissionPassedTime) {
+					lastMissionPassedTime = curTime;
 					return;
 				}
-				if (curTime < *lastMisstonPassedTime + 180000) {
+				if (curTime < lastMissionPassedTime + 180000) {
 					m_nPlayerMood = PLAYER_MOOD_WISECRACKING;
 					return;
 				}
@@ -349,7 +349,7 @@ cAudioManager::ProcessSpecial()
 		playerPed = FindPlayerPed();
 		if (playerPed != nil) {
 			if (playerPed->m_audioEntityId >= 0 && m_asAudioEntities[playerPed->m_audioEntityId].m_bIsUsed) {
-				if (playerPed->m_nPedState != PED_ENTER_CAR && playerPed->m_nPedState != PED_CARJACK) {
+				if (playerPed->EnteringCar()) {
 					if(!playerPed->bInVehicle&& CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == nil)
 						SampleManager.StopChannel(m_nActiveSamples);
 				}
@@ -772,9 +772,9 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 		params.m_VehicleType = veh->m_vehType;
 		
 		if (CGame::currArea == AREA_MALL && playerVeh != veh) {
-			ProcessVehicleOneShots(&params);
-			ProcessVehicleSirenOrAlarm(&params);
-			ProcessEngineDamage(&params);
+			ProcessVehicleOneShots(params);
+			ProcessVehicleSirenOrAlarm(params);
+			ProcessEngineDamage(params);
 			return;
 		}
 		switch (params.m_VehicleType) {
@@ -782,102 +782,102 @@ void cAudioManager::ProcessVehicle(CVehicle* veh)
 			automobile = (CAutomobile*)veh;
 			UpdateGasPedalAudio(veh, params.m_VehicleType);
 			if (veh->m_modelIndex == MI_RCBANDIT || veh->m_modelIndex == MI_RCBARON) {
-				ProcessModelVehicle(&params);
-				ProcessEngineDamage(&params);
+				ProcessModelVehicle(params);
+				ProcessEngineDamage(params);
 			} else if (veh->m_modelIndex == MI_RCRAIDER || veh->m_modelIndex == MI_RCGOBLIN) {
-				ProcessModelHeliVehicle(&params);
-				ProcessEngineDamage(&params);
+				ProcessModelHeliVehicle(params);
+				ProcessEngineDamage(params);
 			} else {
 				switch (veh->GetVehicleAppearance()) {
 				case VEHICLE_APPEARANCE_HELI:
-					ProcessCarHeli(&params);
-					ProcessVehicleFlatTyre(&params);
-					ProcessEngineDamage(&params);
+					ProcessCarHeli(params);
+					ProcessVehicleFlatTyre(params);
+					ProcessEngineDamage(params);
 					break;
 				case VEHICLE_APPEARANCE_BOAT:
 				case VEHICLE_APPEARANCE_PLANE:
 					break;
 				default:
-					if (ProcessVehicleRoadNoise(&params)) {
-						ProcessReverseGear(&params);
+					if (ProcessVehicleRoadNoise(params)) {
+						ProcessReverseGear(params);
 						if (CWeather::WetRoads > 0.0f)
-							ProcessWetRoadNoise(&params);
-						ProcessVehicleSkidding(&params);
-						ProcessVehicleFlatTyre(&params);
-						ProcessVehicleHorn(&params);
-						ProcessVehicleSirenOrAlarm(&params);
+							ProcessWetRoadNoise(params);
+						ProcessVehicleSkidding(params);
+						ProcessVehicleFlatTyre(params);
+						ProcessVehicleHorn(params);
+						ProcessVehicleSirenOrAlarm(params);
 						if (UsesReverseWarning(params.m_nIndex))
-							ProcessVehicleReverseWarning(&params);
+							ProcessVehicleReverseWarning(params);
 						if(HasAirBrakes(params.m_nIndex))
-							ProcessAirBrakes(&params);
-						ProcessCarBombTick(&params);
-						ProcessVehicleEngine(&params);
-						ProcessEngineDamage(&params);
-						ProcessVehicleDoors(&params);
+							ProcessAirBrakes(params);
+						ProcessCarBombTick(params);
+						ProcessVehicleEngine(params);
+						ProcessEngineDamage(params);
+						ProcessVehicleDoors(params);
 					}
 					break;
 				}
 			}
-			ProcessVehicleOneShots(&params);
+			ProcessVehicleOneShots(params);
 			automobile->m_fVelocityChangeForAudio = params.m_fVelocityChange;
 			break;
 		case VEHICLE_TYPE_BOAT:
 			if (veh->m_modelIndex == MI_SKIMMER)
-				ProcessCarHeli(&params);
+				ProcessCarHeli(params);
 			else
-				ProcessBoatEngine(&params);
-			ProcessBoatMovingOverWater(&params);
-			ProcessVehicleOneShots(&params);
+				ProcessBoatEngine(params);
+			ProcessBoatMovingOverWater(params);
+			ProcessVehicleOneShots(params);
 			break;
 		case VEHICLE_TYPE_HELI: 
-			ProcessCarHeli(&params);
-			ProcessVehicleOneShots(&params);
+			ProcessCarHeli(params);
+			ProcessVehicleOneShots(params);
 			break;
 		case VEHICLE_TYPE_PLANE:
-			ProcessPlane(&params);
-			ProcessVehicleOneShots(&params);
-			ProcessVehicleFlatTyre(&params);
+			ProcessPlane(params);
+			ProcessVehicleOneShots(params);
+			ProcessVehicleFlatTyre(params);
 			break;
 		case VEHICLE_TYPE_BIKE:
 			bike = (CBike*)veh;
 			UpdateGasPedalAudio(veh, params.m_VehicleType);
-			if (ProcessVehicleRoadNoise(&params)) {
+			if (ProcessVehicleRoadNoise(params)) {
 				if (CWeather::WetRoads > 0.0f)
-					ProcessWetRoadNoise(&params);
-				ProcessVehicleSkidding(&params);
-				ProcessVehicleHorn(&params);
-				ProcessVehicleSirenOrAlarm(&params);
-				ProcessCarBombTick(&params);
-				ProcessEngineDamage(&params);
-				ProcessVehicleEngine(&params);
-				ProcessVehicleFlatTyre(&params);
+					ProcessWetRoadNoise(params);
+				ProcessVehicleSkidding(params);
+				ProcessVehicleHorn(params);
+				ProcessVehicleSirenOrAlarm(params);
+				ProcessCarBombTick(params);
+				ProcessEngineDamage(params);
+				ProcessVehicleEngine(params);
+				ProcessVehicleFlatTyre(params);
 			}
-			ProcessVehicleOneShots(&params);
+			ProcessVehicleOneShots(params);
 			bike->m_fVelocityChangeForAudio = params.m_fVelocityChange;
 			break;
 		default:
 			break;
 		}
-		ProcessRainOnVehicle(&params);
+		ProcessRainOnVehicle(params);
 	}
 }
 
 void
-cAudioManager::ProcessRainOnVehicle(cVehicleParams *params)
+cAudioManager::ProcessRainOnVehicle(cVehicleParams& params)
 {
 	const int SOUND_INTENSITY = 22.0f;
 
 	CVehicle *veh;
 	uint8 emittingVol;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain())
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain())
 		return;
 
-	veh = params->m_pVehicle;
+	veh = params.m_pVehicle;
 	veh->m_bRainAudioCounter++;
 	if (veh->m_bRainAudioCounter >= 2) {
 		veh->m_bRainAudioCounter = 0;
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+		CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 		emittingVol = 30.0f * CWeather::Rain;
 		m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 		if (m_sQueueSample.m_nVolume != 0) {
@@ -904,7 +904,7 @@ cAudioManager::ProcessRainOnVehicle(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessReverseGear(cVehicleParams *params)
+cAudioManager::ProcessReverseGear(cVehicleParams& params)
 {
 	const int reverseGearIntensity = 30;
 
@@ -912,15 +912,15 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params)
 	float modificator;
 	uint8 emittingVolume;
 
-	if (params->m_fDistance >= SQR(reverseGearIntensity))
+	if (params.m_fDistance >= SQR(reverseGearIntensity))
 		return false;
-	automobile = (CAutomobile*)params->m_pVehicle;
+	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);
+		CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 		if (automobile->m_nDriveWheelsOnGround != 0) {
-			modificator = params->m_fVelocityChange / params->m_pTransmission->fMaxReverseVelocity;
+			modificator = params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity;
 		} else {
 			if (automobile->m_nDriveWheelsOnGroundPrev != 0)
 				automobile->m_fGasPedalAudio *= 0.4f;
@@ -931,7 +931,7 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params)
 		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) {
+			if (params.m_pVehicle->m_fGasPedal >= 0.0f) {
 				m_sQueueSample.m_nCounter = 62;
 				m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR_2;
 			} else {
@@ -959,7 +959,7 @@ cAudioManager::ProcessReverseGear(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessModelVehicle(cVehicleParams *params)
+cAudioManager::ProcessModelVehicle(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 35.0f;
 
@@ -973,21 +973,21 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 	bool isPlayerVeh;
 	bool vehSlowdown;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return;
 
-	if (FindPlayerVehicle() == params->m_pVehicle)
+	if (FindPlayerVehicle() == params.m_pVehicle)
 		isPlayerVeh = true;
 	else
 #ifdef FIX_BUGS
-		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle;
+		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;
+	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 {
 			volume = 127;
 			freq = 25000;
@@ -997,7 +997,7 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 			freq = clamp2(freq, prevFreq, 800);
 		}
 		if (volume > 0) {
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+			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;
@@ -1023,13 +1023,13 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 			prevFreq = freq;
 			prevVolume = volume;
 		}
-	} else if (params->m_pVehicle != nil) {
+	} 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;
+			acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal;
+			brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal;
 		}
 		if (acceletateState < brakeState)
 			acceletateState = brakeState;
@@ -1039,19 +1039,19 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 			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));
+			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)
-			freq += 8000.0f * Abs(params->m_pVehicle->GetUp().y);
-		if (params->m_pVehicle->bIsDrowning)
+			freq += 8000.0f * Abs(params.m_pVehicle->GetUp().y);
+		if (params.m_pVehicle->bIsDrowning)
 			volume /= 4;
 		if (volume > 0) {
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+			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) {
@@ -1089,7 +1089,7 @@ cAudioManager::ProcessModelVehicle(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
+cAudioManager::ProcessModelHeliVehicle(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 35.0f;
 
@@ -1100,14 +1100,14 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
 	int16 acceletateState;
 	int16 brakeState;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return;
 
-	if (FindPlayerVehicle() == params->m_pVehicle)
+	if (FindPlayerVehicle() == params.m_pVehicle)
 		isPlayerVeh = true;
 	else
 #ifdef FIX_BUGS
-		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params->m_pVehicle;
+		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle;
 #else
 		isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil;
 #endif
@@ -1115,13 +1115,13 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
 		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;
+		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);
+	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;
@@ -1147,7 +1147,7 @@ cAudioManager::ProcessModelHeliVehicle(cVehicleParams* params)
 }
 
 bool
-cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
+cAudioManager::ProcessVehicleRoadNoise(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 95.0f;
 
@@ -1158,36 +1158,36 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
 	float velocity;
 	uint8 wheelsOnGround;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	switch (params->m_VehicleType) {
+	switch (params.m_VehicleType) {
 	case VEHICLE_TYPE_CAR:
-		wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround;
+		wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround;
 		break;
 	case VEHICLE_TYPE_BIKE:
-		wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround;
+		wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround;
 		break;
 	default:
 		wheelsOnGround = 4;
 		break;
 	}
-	if (params->m_pTransmission == nil || wheelsOnGround == 0)
+	if (params.m_pTransmission == nil || wheelsOnGround == 0)
 		return true;
 
-	velocity = Abs(params->m_fVelocityChange);
+	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));
+		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) {
+			if (params.m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) {
 				m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP;
 				freq = 6050 * emittingVol / 30 + 16000;
 			} else {
@@ -1215,7 +1215,7 @@ cAudioManager::ProcessVehicleRoadNoise(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
+cAudioManager::ProcessWetRoadNoise(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 30.0f;
 
@@ -1226,26 +1226,26 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
 	float velocity;
 	uint8 wheelsOnGround;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	switch (params->m_VehicleType) {
+	switch (params.m_VehicleType) {
 	case VEHICLE_TYPE_CAR:
-		wheelsOnGround = ((CAutomobile*)params->m_pVehicle)->m_nWheelsOnGround;
+		wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround;
 		break;
 	case VEHICLE_TYPE_BIKE:
-		wheelsOnGround = ((CBike*)params->m_pVehicle)->m_nWheelsOnGround;
+		wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround;
 		break;
 	default:
 		wheelsOnGround = 4;
 		break;
 	}
-	if (params->m_pTransmission == nil || wheelsOnGround == 0)
+	if (params.m_pTransmission == nil || wheelsOnGround == 0)
 		return true;
 
-	velocity = Abs(params->m_fVelocityChange);
+	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));
+		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) {
@@ -1275,7 +1275,7 @@ cAudioManager::ProcessWetRoadNoise(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
+cAudioManager::ProcessVehicleEngine(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 50.0f;
 
@@ -1302,22 +1302,22 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 	pizzaFaggBool = false;
 	caddyBool = false;
 	traction = 0.0f;
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return;
 	playerVeh = FindPlayerVehicle();
-	veh = params->m_pVehicle;
+	veh = params.m_pVehicle;
 	if (playerVeh == veh && veh->GetStatus() == STATUS_WRECKED) {
 		SampleManager.StopChannel(m_nActiveSamples);
 		return;
 	}
 	if (!veh->bEngineOn)
 		return;
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 	if (playerVeh == veh && veh->m_modelIndex != MI_CADDY) {
-		ProcessPlayersVehicleEngine(params, params->m_pVehicle);
+		ProcessPlayersVehicleEngine(params, params.m_pVehicle);
 		return;
 	}
-	transmission = params->m_pTransmission;
+	transmission = params.m_pTransmission;
 	if (transmission != nil) {
 		switch (veh->m_modelIndex) {
 		case MI_PIZZABOY:
@@ -1333,7 +1333,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 			currentGear = veh->m_nCurrentGear;
 			break;
 		}
-		switch (params->m_VehicleType) {
+		switch (params.m_VehicleType) {
 		case VEHICLE_TYPE_CAR:
 			automobile = (CAutomobile*)veh;
 			wheelsOnGround = automobile->m_nDriveWheelsOnGround;
@@ -1349,7 +1349,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 			gasPedalAudioPtr = &bike->m_fGasPedalAudio;
 			break;
 		default:
-			debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params->m_VehicleType);
+			debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType);
 			return;
 		}
 
@@ -1360,7 +1360,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 				} else {
 					switch (transmission->nDriveType) {
 					case '4':
-						if (params->m_VehicleType == VEHICLE_TYPE_BIKE) {
+						if (params.m_VehicleType == VEHICLE_TYPE_BIKE) {
 							for (int i = 0; i < 2; i++)
 								if (wheelState[i] == WHEEL_STATE_SPINNING)
 									traction += 0.1f;
@@ -1371,7 +1371,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 						}
 						break;
 					case 'F':
-						if (params->m_VehicleType == VEHICLE_TYPE_BIKE) {
+						if (params.m_VehicleType == VEHICLE_TYPE_BIKE) {
 							if (wheelState[BIKEWHEEL_FRONT] == WHEEL_STATE_SPINNING)
 								traction += 0.2f;
 						} else {
@@ -1382,7 +1382,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 						}
 						break;
 					case 'R':
-						if (params->m_VehicleType == VEHICLE_TYPE_BIKE) {
+						if (params.m_VehicleType == VEHICLE_TYPE_BIKE) {
 							if (wheelState[BIKEWHEEL_REAR] == WHEEL_STATE_SPINNING)
 								traction += 0.2f;
 						} else {
@@ -1396,7 +1396,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 						break;
 					}
 				}
-			} else if (params->m_fVelocityChange == 0.0f) {
+			} else if (params.m_fVelocityChange == 0.0f) {
 				traction = 0.9f;
 			}
 			if (transmission->fMaxVelocity <= 0.0) {
@@ -1406,18 +1406,18 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 				if (!pizzaFaggBool && !caddyBool) {
 					if (currentGear != 0) {
 						relativeGearChange = Min(1.0f,
-							params->m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f;
+							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)
+							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));
+							1.0f - Abs((params.m_fVelocityChange - transmission->Gears[0].fShiftDownVelocity) / transmission->fMaxReverseVelocity));
 					}
 					modificator = relativeChange;
 				} else {
-					modificator = Min(1.0, Abs(params->m_fVelocityChange / transmission->fMaxVelocity > 1.0f));
+					modificator = Min(1.0, Abs(params.m_fVelocityChange / transmission->fMaxVelocity > 1.0f));
 				}
 			}
 		} else {
@@ -1428,7 +1428,7 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 		}
 		if (currentGear != 0 || wheelsOnGround == 0)
 			freq = 1200 * currentGear + 18000.0f * modificator + 14000;
-		else if (params->m_VehicleType == VEHICLE_TYPE_BIKE)
+		else if (params.m_VehicleType == VEHICLE_TYPE_BIKE)
 			freq = 22050;
 		else
 			freq = 13000.0f * modificator + 14000;
@@ -1452,26 +1452,26 @@ cAudioManager::ProcessVehicleEngine(cVehicleParams* params)
 		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_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_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_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_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)
+			if (FindVehicleOfPlayer() == params.m_pVehicle)
 				m_sQueueSample.m_nSampleIndex = SFX_CAR_AFTER_ACCEL_12;
 			else
 				m_sQueueSample.m_nSampleIndex = SFX_CAR_REV_12;
@@ -1564,14 +1564,14 @@ cAudioManager::AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sampl
 }
 
 void
-cAudioManager::ProcessCesna(cVehicleParams *params)
+cAudioManager::ProcessCesna(cVehicleParams& params)
 {
 	static uint8 nAccel = 0;
 
-	//((CAutomobile *)params->m_pVehicle)->Damage.GetEngineStatus();
+	//((CAutomobile *)params.m_pVehicle)->Damage.GetEngineStatus();
 
-	if (FindPlayerVehicle() == params->m_pVehicle) {
-		if (params->m_nIndex == DODO) {
+	if (FindPlayerVehicle() == params.m_pVehicle) {
+		if (params.m_nIndex == DODO) {
 			if (Pads[0].GetAccelerate() <= 0) {
 				if (nAccel != 0)
 					--nAccel;
@@ -1581,10 +1581,10 @@ cAudioManager::ProcessCesna(cVehicleParams *params)
 			AddPlayerCarSample(85 * (60 - nAccel) / 60 + 20, 8500 * nAccel / 60 + 17000, SFX_CESNA_IDLE, SFX_BANK_0, 52, true);
 			AddPlayerCarSample(85 * nAccel / 60 + 20, 8500 * nAccel / 60 + 17000, SFX_CESNA_REV, SFX_BANK_0, 2, true);
 		}
-	} else if (params->m_nIndex == DODO) {
+	} else if (params.m_nIndex == DODO) {
 		AddPlayerCarSample(105, 17000, SFX_CESNA_IDLE, SFX_BANK_0, 52, true);
-	} else if (params->m_fDistance < SQR(200)) {
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	} else 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;
@@ -1605,7 +1605,7 @@ cAudioManager::ProcessCesna(cVehicleParams *params)
 			m_sQueueSample.m_bRequireReflection = false;
 			AddSampleToRequestedQueue();
 		}
-		if (params->m_fDistance < SQR(90)) {
+		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;
@@ -1631,7 +1631,7 @@ cAudioManager::ProcessCesna(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh)
+cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh)
 {
 	static int32 GearFreqAdj[] = { 6000, 6000, 3400, 1200, 0, -1000 };
 
@@ -1676,7 +1676,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 	static bool bAccelSampleStopped = true;
 
 	lostTraction = false;
-	PizzaFaggBool = params->m_pVehicle->m_modelIndex == MI_PIZZABOY || params->m_pVehicle->m_modelIndex == MI_FAGGIO;
+	PizzaFaggBool = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO;
 	processedAccelSampleStopped = false;
 	if (bPlayerJustEnteredCar) {
 		bAccelSampleStopped = true;
@@ -1688,17 +1688,17 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		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));
+		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(m_nActiveSamples);
 	if (PizzaFaggBool) {
-		CurrentPretendGear = params->m_pTransmission->nNumberOfGears;
+		CurrentPretendGear = params.m_pTransmission->nNumberOfGears;
 		currentGear = CurrentPretendGear;
-		if (params->m_pVehicle->bIsHandbrakeOn) {
+		if (params.m_pVehicle->bIsHandbrakeOn) {
 			brakeState = 0;
 			nCruising = 0;
 			LastAccel = 0;
@@ -1707,12 +1707,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			nCruising = 1;
 		}
 	} else {
-		currentGear = params->m_pVehicle->m_nCurrentGear;
+		currentGear = params.m_pVehicle->m_nCurrentGear;
 	}
 
-	switch (params->m_VehicleType) {
+	switch (params.m_VehicleType) {
 	case VEHICLE_TYPE_CAR:
-		automobile = (CAutomobile*)params->m_pVehicle;
+		automobile = (CAutomobile*)params.m_pVehicle;
 		wheelsOnGround = automobile->m_nDriveWheelsOnGround;
 		wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev;
 		gasPedalAudioPtr = &automobile->m_fGasPedalAudio;
@@ -1720,7 +1720,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		velocityChangeForAudio = automobile->m_fVelocityChangeForAudio;
 		break;
 	case VEHICLE_TYPE_BIKE:
-		bike = (CBike*)params->m_pVehicle;
+		bike = (CBike*)params.m_pVehicle;
 		wheelsOnGround = bike->m_nDriveWheelsOnGround;
 		wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev;
 		gasPedalAudioPtr = &bike->m_fGasPedalAudio;
@@ -1728,13 +1728,13 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		velocityChangeForAudio = bike->m_fVelocityChangeForAudio;
 		break;
 	default:
-		debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params->m_VehicleType);
+		debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType);
 		return;
 	}
 	if (!PizzaFaggBool) {
-		switch (params->m_pTransmission->nDriveType) {
+		switch (params.m_pTransmission->nDriveType) {
 		case '4':
-			if (params->m_VehicleType != VEHICLE_TYPE_BIKE) {
+			if (params.m_VehicleType != VEHICLE_TYPE_BIKE) {
 				wheelInUseCounter = 0;
 				for (uint8 i = 0; i < 4; i++) {
 					if (wheelState[i] != WHEEL_STATE_NORMAL)
@@ -1745,7 +1745,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			}
 			break;
 		case 'F':
-			if (params->m_VehicleType == VEHICLE_TYPE_BIKE) {
+			if (params.m_VehicleType == VEHICLE_TYPE_BIKE) {
 				if (wheelState[BIKEWHEEL_FRONT] != WHEEL_STATE_NORMAL)
 					lostTraction = true;
 			} else {
@@ -1755,7 +1755,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			}
 			break;
 		case 'R':
-			if (params->m_VehicleType == VEHICLE_TYPE_BIKE) {
+			if (params.m_VehicleType == VEHICLE_TYPE_BIKE) {
 				if (wheelState[BIKEWHEEL_REAR] != WHEEL_STATE_NORMAL)
 					lostTraction = true;
 			} else {
@@ -1767,20 +1767,20 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			break;
 		}
 	}
-	if (params->m_fVelocityChange != 0.0f) {
-		time = params->m_pVehicle->m_vecMoveSpeed.z / params->m_fVelocityChange;
+	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)
+		if (params.m_fVelocityChange < -0.001f)
 			freqModifier = -freqModifier;
 	} else
 		freqModifier = 0;
-	if (params->m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed)
+	if (params.m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed)
 		freqModifier += 1400;
 	gearSoundLength = 0;
-	engineSoundType = aVehicleSettings[params->m_nIndex].m_nBank;
+	engineSoundType = aVehicleSettings[params.m_nIndex].m_nBank;
 	soundOffset = 3 * (engineSoundType - CAR_SFX_BANKS_OFFSET);
 	noGearBox = false;
 	switch (engineSoundType) {
@@ -1839,7 +1839,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			gearSoundStartTime = CTimer::GetTimeInMilliseconds();
 		}
 	}
-	relativeVelocityChange = 2.0f * params->m_fVelocityChange / params->m_pTransmission->fMaxVelocity;
+	relativeVelocityChange = 2.0f * params.m_fVelocityChange / params.m_pTransmission->fMaxVelocity;
 	accelerationMultipler = clamp(relativeVelocityChange, 0.0f, 1.0f);
 	gasPedalAudio = accelerationMultipler;
 	switch (engineSoundType) {
@@ -1856,17 +1856,17 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		break;
 	}
 	if (accelerateState <= 0) {
-		if (params->m_fVelocityChange < -0.001f) {
+		if (params.m_fVelocityChange < -0.001f) {
 			if (channelUsed) {
 				SampleManager.StopChannel(m_nActiveSamples);
 				bAccelSampleStopped = true;
 			}
-			if (wheelsOnGround == 0 || params->m_pVehicle->bIsHandbrakeOn || lostTraction)
+			if (wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction)
 				gasPedalAudio = *gasPedalAudioPtr;
-			else if (params->m_VehicleType == VEHICLE_TYPE_BIKE)
+			else if (params.m_VehicleType == VEHICLE_TYPE_BIKE)
 				gasPedalAudio = 0.0f;
 			else
-				gasPedalAudio = Min(1.0f, params->m_fVelocityChange / params->m_pTransmission->fMaxReverseVelocity);
+				gasPedalAudio = Min(1.0f, params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity);
 			*gasPedalAudioPtr = Max(0.0f, gasPedalAudio);
 		} else if (LastAccel > 0) {
 			if (channelUsed) {
@@ -1875,9 +1875,9 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			}
 			nCruising = 0;
 			if (wheelsOnGround == 0
-				|| params->m_pVehicle->bIsHandbrakeOn
+				|| params.m_pVehicle->bIsHandbrakeOn
 				|| lostTraction
-				|| params->m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) {
+				|| params.m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) {
 				if (PizzaFaggBool) {
 					gasPedalAudio = 0.0f;
 				} else {
@@ -1888,7 +1888,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 			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)
+				if (params.m_pVehicle->bIsDrowning)
 					vol /= 4;
 				if (engineSoundType == SFX_BANK_TRUCK)
 					freq /= 2;
@@ -1899,7 +1899,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		vol = 110 - (40.0f * gasPedalAudio);
 		if (engineSoundType == SFX_BANK_TRUCK)
 			freq /= 2;
-		if (params->m_pVehicle->bIsDrowning)
+		if (params.m_pVehicle->bIsDrowning)
 			vol /= 4;
 		AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1, SFX_BANK_0, 52, true);
 
@@ -1907,16 +1907,16 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 	}
 	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) {
+			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) {
+				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)
+					if (wheelsOnGround == 0 && wheelsOnGroundPrev != 0 || (params.m_pVehicle->bIsHandbrakeOn && !bHandbrakeOnLastFrame || lostTraction && !bLostTractionLastFrame)
 						&& wheelsOnGround != 0) {
 						*gasPedalAudioPtr *= 0.6f;
 					}
@@ -1934,7 +1934,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 					SampleManager.StopChannel(m_nActiveSamples);
 					bAccelSampleStopped = true;
 				}
-				if (params->m_pVehicle->bIsDrowning)
+				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 {
@@ -1959,7 +1959,7 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 					}
 				} else if (processedAccelSampleStopped) {
 					gearSoundStartTime = CTimer::GetTimeInMilliseconds();
-					params->m_pVehicle->bAudioChangingGear = true;
+					params.m_pVehicle->bAudioChangingGear = true;
 					if (!SampleManager.InitialiseChannel(m_nActiveSamples, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0))
 						return;
 					SampleManager.SetChannelLoopCount(m_nActiveSamples, 1);
@@ -1976,10 +1976,10 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 						SampleManager.SetChannelReverbFlag(m_nActiveSamples, m_bDynamicAcousticModelingStatus != false);
 						SampleManager.StartChannel(m_nActiveSamples);
 					}
-				} else if (CurrentPretendGear < params->m_pTransmission->nNumberOfGears - 1) {
+				} else if (CurrentPretendGear < params.m_pTransmission->nNumberOfGears - 1) {
 					++CurrentPretendGear;
 					gearSoundStartTime = CTimer::GetTimeInMilliseconds();
-					params->m_pVehicle->bAudioChangingGear = true;
+					params.m_pVehicle->bAudioChangingGear = true;
 					if (!SampleManager.InitialiseChannel(m_nActiveSamples, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0))
 						return;
 					SampleManager.SetChannelLoopCount(m_nActiveSamples, 1);
@@ -1998,12 +1998,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 					}
 				} else {
 					nCruising = 1;
-					params->m_pVehicle->bAudioChangingGear = true;
+					params.m_pVehicle->bAudioChangingGear = true;
 					bAccelSampleStopped = true;
 					SampleManager.StopChannel(m_nActiveSamples);
-					if (PizzaFaggBool || 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 (PizzaFaggBool || 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) {
@@ -2019,12 +2019,12 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 				}
 			}
 		} else {
-			params->m_pVehicle->bAudioChangingGear = true;
+			params.m_pVehicle->bAudioChangingGear = true;
 			bAccelSampleStopped = true;
 			SampleManager.StopChannel(m_nActiveSamples);
-			if (PizzaFaggBool || 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 (PizzaFaggBool || 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) {
@@ -2040,13 +2040,13 @@ cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams* params, CVehicle* veh
 		}
 	}
 	LastAccel = accelerateState;
-	bHandbrakeOnLastFrame = params->m_pVehicle->bIsHandbrakeOn;
+	bHandbrakeOnLastFrame = params.m_pVehicle->bIsHandbrakeOn;
 	bLostTractionLastFrame = lostTraction;
 	return;
 }
 
 bool
-cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
+cAudioManager::ProcessVehicleSkidding(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
@@ -2063,50 +2063,50 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 	float newSkidVal = 0.0f;
 	float skidVal = 0.0f;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	switch (params->m_VehicleType) {
+	switch (params.m_VehicleType) {
 	case VEHICLE_TYPE_CAR:
-		automobile = (CAutomobile*)params->m_pVehicle;
+		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;
+		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);
+		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);
+	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;
+		transmission = params.m_pTransmission;
 		switch (transmission->nDriveType) {
 		case '4':
-			newSkidVal = GetVehicleDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params->m_fVelocityChange);
+			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);
+				newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange);
 			else
-				newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange);
+				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);
+				newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange);
 			else
-				newSkidVal = GetVehicleNonDriveWheelSkidValue(params->m_pVehicle, wheelStateArr[i], transmission, params->m_fVelocityChange);
+				newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange);
 			break;
 		default:
 			break;
@@ -2119,7 +2119,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 		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) {
+			switch (params.m_pVehicle->m_nSurfaceTouched) {
 			case SURFACE_GRASS:
 			case SURFACE_HEDGE:
 				m_sQueueSample.m_nSampleIndex = SFX_RAIN;
@@ -2141,7 +2141,7 @@ cAudioManager::ProcessVehicleSkidding(cVehicleParams *params)
 			default:
 				m_sQueueSample.m_nSampleIndex = SFX_SKID;
 				m_sQueueSample.m_nFrequency = 5000.f * skidVal + 11000.f;
-				if (params->m_VehicleType == VEHICLE_TYPE_BIKE)
+				if (params.m_VehicleType == VEHICLE_TYPE_BIKE)
 					m_sQueueSample.m_nFrequency += 2000;
 				break;
 			}
@@ -2212,17 +2212,17 @@ cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheel
 }
 
 bool
-cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
+cAudioManager::ProcessVehicleHorn(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
 	CVehicle *veh;
 	uint8 volume;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
-	veh = params->m_pVehicle;
+	veh = params.m_pVehicle;
 	if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params))
 		return true;
 
@@ -2243,16 +2243,16 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
 				return true;
 		}
 
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+		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_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_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency;
 			m_sQueueSample.m_nLoopCount = 0;
 #ifdef FIX_BUGS
 			m_sQueueSample.m_nEmittingVolume = volume;
@@ -2274,31 +2274,31 @@ cAudioManager::ProcessVehicleHorn(cVehicleParams *params)
 }
 
 bool
-cAudioManager::UsesSiren(cVehicleParams *params) const
+cAudioManager::UsesSiren(cVehicleParams& params) const
 {
-	return params->m_pVehicle->UsesSiren();
+	return params.m_pVehicle->UsesSiren();
 }
 
 bool
-cAudioManager::UsesSirenSwitching(cVehicleParams *params) const
+cAudioManager::UsesSirenSwitching(cVehicleParams& params) const
 {
-	if (params->m_nIndex == FIRETRUK || params->m_nIndex == MRWHOOP)
+	if (params.m_nIndex == FIRETRUK || params.m_nIndex == MRWHOOP)
 		return false;
 	return UsesSiren(params);
 }
 
 bool
-cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params)
+cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 110.0f;
 
 	CVehicle *veh;
 	uint8 volume;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
-	veh = params->m_pVehicle;
+	veh = params.m_pVehicle;
 	if (!veh->m_bSirenOrAlarm && !veh->IsAlarmOn())
 		return true;
 
@@ -2310,31 +2310,31 @@ cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams *params)
 			return true;
 	}
 
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	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)
+			if (params.m_pVehicle->GetStatus() == STATUS_ABANDONED)
 				return true;
-			if (veh->m_nCarHornTimer != 0 && params->m_nIndex != FIRETRUK && params->m_nIndex != MRWHOOP) {
+			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)
+				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) {
+			} 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;
+				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_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;
@@ -2361,18 +2361,18 @@ cAudioManager::UsesReverseWarning(int32 model) const
 }
 
 bool
-cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params)
+cAudioManager::ProcessVehicleReverseWarning(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 50.0f;
 
-	CVehicle *veh = params->m_pVehicle;
+	CVehicle *veh = params.m_pVehicle;
 	uint8 volume;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
 	if (veh->bEngineOn && veh->m_fGasPedal < 0.0f) {
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+		CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 		volume = veh->bIsDrowning ? 15 : 60;
 		m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 		if (m_sQueueSample.m_nVolume != 0) {
@@ -2403,7 +2403,7 @@ cAudioManager::ProcessVehicleReverseWarning(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessVehicleDoors(cVehicleParams *params)
+cAudioManager::ProcessVehicleDoors(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
@@ -2412,11 +2412,11 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params)
 	int32 emittingVol;
 	float velocity;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
 
-	automobile = (CAutomobile *)params->m_pVehicle;
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	automobile = (CAutomobile *)params.m_pVehicle;
+	CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 	for (int32 i = 0; i < ARRAY_SIZE(automobile->Doors); i++) {
 		if (automobile->Damage.GetDoorStatus(i) == DOOR_STATUS_SWINGING) {
 			doorState = automobile->Doors[i].m_nDoorState;
@@ -2451,23 +2451,23 @@ cAudioManager::ProcessVehicleDoors(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessAirBrakes(cVehicleParams *params)
+cAudioManager::ProcessAirBrakes(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 30.0f;
 	CAutomobile *automobile;
 	uint8 volume;
 
-	if (params->m_fDistance > SQR(SOUND_INTENSITY))
+	if (params.m_fDistance > SQR(SOUND_INTENSITY))
 		return false;
-	automobile = (CAutomobile *)params->m_pVehicle;
+	automobile = (CAutomobile *)params.m_pVehicle;
 	if (!automobile->bEngineOn)
 		return true;
 
-	if ((automobile->m_fVelocityChangeForAudio < 0.025f || params->m_fVelocityChange >= 0.025f) &&
-	    (automobile->m_fVelocityChangeForAudio > -0.025f || params->m_fVelocityChange <= 0.025f))
+	if ((automobile->m_fVelocityChangeForAudio < 0.025f || params.m_fVelocityChange >= 0.025f) &&
+	    (automobile->m_fVelocityChangeForAudio > -0.025f || params.m_fVelocityChange <= 0.025f))
 		return true;
 
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 	volume = m_anRandomTable[0] % 10 + 70;
 	m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 	if (m_sQueueSample.m_nVolume != 0) {
@@ -2501,20 +2501,20 @@ cAudioManager::HasAirBrakes(int32 model) const
 }
 
 bool
-cAudioManager::ProcessEngineDamage(cVehicleParams *params)
+cAudioManager::ProcessEngineDamage(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 
 	float health;
 	uint8 emittingVolume;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	if (params->m_pVehicle->m_modelIndex == MI_CADDY)
+	if (params.m_pVehicle->m_modelIndex == MI_CADDY)
 		return true;
-	if (params->m_pVehicle->GetStatus() == STATUS_WRECKED)
+	if (params.m_pVehicle->GetStatus() == STATUS_WRECKED)
 		return true;
-	health = params->m_pVehicle->m_fHealth;
+	health = params.m_pVehicle->m_fHealth;
 	if (health < 390.0f) {
 		if (health < 250.0f) {
 			emittingVolume = 60;
@@ -2527,8 +2527,8 @@ cAudioManager::ProcessEngineDamage(cVehicleParams *params)
 			m_sQueueSample.m_nReleasingVolumeModificator = 7;
 			m_sQueueSample.m_nFrequency = 27000;
 		}
-		CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-		if (params->m_pVehicle->bIsDrowning)
+		CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
+		if (params.m_pVehicle->bIsDrowning)
 			emittingVolume /= 2;
 		m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 		if (m_sQueueSample.m_nVolume != 0) {
@@ -2552,30 +2552,30 @@ cAudioManager::ProcessEngineDamage(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessCarBombTick(cVehicleParams *params)
+cAudioManager::ProcessCarBombTick(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 40.0f;
 	const uint8 EMITTING_VOLUME = 60;
 
 	uint8 bombType;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return false;
-	if (params->m_pVehicle->bEngineOn) {
-		switch (params->m_VehicleType) {
+	if (params.m_pVehicle->bEngineOn) {
+		switch (params.m_VehicleType) {
 		case VEHICLE_TYPE_CAR:
-			bombType = params->m_pVehicle->m_bombType;
+			bombType = params.m_pVehicle->m_bombType;
 			break;
 		case VEHICLE_TYPE_BIKE:
-			bombType = params->m_pVehicle->m_bombType;
+			bombType = params.m_pVehicle->m_bombType;
 			break;
 		default:
-			debug("\n * AUDIOLOG:  ProcessCarBombTick()  Unsupported vehicle type %d * \n", params->m_VehicleType);
+			debug("\n * AUDIOLOG:  ProcessCarBombTick()  Unsupported vehicle type %d * \n", params.m_VehicleType);
 			return true;
 			break;
 		}
 		if (bombType == CARBOMB_TIMEDACTIVE) {
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+			CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 			m_sQueueSample.m_nVolume = ComputeVolume(EMITTING_VOLUME, SOUND_INTENSITY, m_sQueueSample.m_fDistance);
 			if (m_sQueueSample.m_nVolume != 0) {
 				m_sQueueSample.m_nCounter = 35;
@@ -2602,7 +2602,7 @@ cAudioManager::ProcessCarBombTick(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
+cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 {
 	int16 event;
 	uint8 emittingVol;
@@ -2632,7 +2632,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			const float SOUND_INTENSITY = 50.0f;
 			maxDist = SQR(SOUND_INTENSITY);
 			emittingVol = m_anRandomTable[2] % 5 + 122;
-			switch (aVehicleSettings[params->m_nIndex].m_bDoorType) {
+			switch (aVehicleSettings[params.m_nIndex].m_bDoorType) {
 			case OLD_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_CLOSE;
 				break;
@@ -2651,7 +2651,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same
-			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
+			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 28062;
 			else
 				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
@@ -2671,7 +2671,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			const float SOUND_INTENSITY = 50.0f;
 			maxDist = SQR(SOUND_INTENSITY);
 			emittingVol = m_anRandomTable[1] % 10 + 117;
-			switch (aVehicleSettings[params->m_nIndex].m_bDoorType) {
+			switch (aVehicleSettings[params.m_nIndex].m_bDoorType) {
 			case OLD_DOOR:
 				m_sQueueSample.m_nSampleIndex = SFX_OLD_CAR_DOOR_OPEN;
 				break;
@@ -2687,7 +2687,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 			m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]
-			if (params->m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
+			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 23459;
 			else
 				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex);
@@ -2728,7 +2728,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 				WheelIndex = 82;
 			m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TYRE_BUMP);
 			m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16);
-			if (params->m_VehicleType == VEHICLE_TYPE_BIKE)
+			if (params.m_VehicleType == VEHICLE_TYPE_BIKE)
 				m_sQueueSample.m_nFrequency *= 2;
 			m_sQueueSample.m_nReleasingVolumeModificator = 6;
 			m_sQueueSample.m_fSpeedMultiplier = 2.0f;
@@ -2754,8 +2754,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		}
 		case SOUND_CAR_ENGINE_START: {
 			const float SOUND_INTENSITY = 40.0f;
-			if (params->m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR
-				|| params->m_pVehicle->m_modelIndex == MI_CADDY)
+			if (params.m_pVehicle->GetVehicleAppearance() != VEHICLE_APPEARANCE_CAR
+				|| params.m_pVehicle->m_modelIndex == MI_CADDY)
 				continue;
 			emittingVol = 60;
 			maxDist = SQR(SOUND_INTENSITY);
@@ -2929,7 +2929,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		case SOUND_HELI_BLADE:{
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 HeliIndex = 89;
-			relVol = ((CAutomobile*)params->m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f;
+			relVol = ((CAutomobile*)params.m_pVehicle)->m_aWheelSpeed[1] * 50.0f / 11.0f;
 			if (relVol < 0.2f || relVol == 1.0f)
 				continue;
 			emittingVol = (1.0f - relVol) * 70.0f;
@@ -2951,14 +2951,14 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			CVehicle *playerVeh;
 			CPlayerPed *playerPed;
 
-			switch (params->m_pVehicle->m_modelIndex) {
+			switch (params.m_pVehicle->m_modelIndex) {
 			case MI_HUNTER:
 			case MI_CHOPPER:
 			case MI_SEASPAR:
 			case MI_SPARROW:
 			case MI_MAVERICK:
 			case MI_VCNMAV:
-				if (params->m_pVehicle->m_modelIndex == MI_HUNTER) {
+				if (params.m_pVehicle->m_modelIndex == MI_HUNTER) {
 					if (Pads[0].GetHandBrake() == 0) {
 						playerVeh = FindPlayerVehicle();
 						playerPed = FindPlayerPed();
@@ -2966,7 +2966,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 							if (playerPed->m_attachedTo != nil && playerPed->m_attachedTo->GetType() == ENTITY_TYPE_VEHICLE)
 								playerVeh = (CVehicle*)playerPed->m_attachedTo;
 						}
-						if (playerVeh != params->m_pVehicle) {
+						if (playerVeh != params.m_pVehicle) {
 							m_sQueueSample.m_nSampleIndex = SFX_M60_LEFT;
 							m_sQueueSample.m_nBankIndex = SFX_BANK_0;
 						} else {
@@ -3044,8 +3044,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			break;
 		}
 		case SOUND_PED_HELI_PLAYER_FOUND: {
-			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
-			pedParams.m_fDistance = params->m_fDistance;
+			pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated;
+			pedParams.m_fDistance = params.m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_HELI_PLAYER_FOUND);
 			continue;
 		}
@@ -3053,13 +3053,13 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 			pedParams.m_pPed = nil;
 			pedParams.m_bDistanceCalculated = false;
 			pedParams.m_fDistance = 0.0f;
-			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
-			pedParams.m_fDistance = params->m_fDistance;
+			pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated;
+			pedParams.m_fDistance = params.m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_BODYCAST_HIT);
 			continue; */
 		case SOUND_PED_VCPA_PLAYER_FOUND: {
-			pedParams.m_bDistanceCalculated = params->m_bDistanceCalculated;
-			pedParams.m_fDistance = params->m_fDistance;
+			pedParams.m_bDistanceCalculated = params.m_bDistanceCalculated;
+			pedParams.m_fDistance = params.m_fDistance;
 			SetupPedComments(&pedParams, SOUND_PED_VCPA_PLAYER_FOUND);
 		}
 		case SOUND_WATER_FALL: {
@@ -3118,8 +3118,8 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams *params)
 		default:
 			continue;
 		}
-		if (params->m_fDistance < maxDist) {
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+		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) {
@@ -3226,7 +3226,7 @@ cAudioManager::ProcessTrainNoise(cVehicleParams *params)
 }
 #endif
 bool
-cAudioManager::ProcessBoatEngine(cVehicleParams *params)
+cAudioManager::ProcessBoatEngine(cVehicleParams& params)
 {
 	CBoat *boat;
 	float padRelativeAccerate;
@@ -3240,10 +3240,10 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params)
 
 	static const int intensity = 50;
 
-	if (params->m_fDistance < SQR(intensity)) {
-		boat = (CBoat *)params->m_pVehicle;
-		if (params->m_nIndex == REEFER) {
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	if (params.m_fDistance < SQR(intensity)) {
+		boat = (CBoat *)params.m_pVehicle;
+		if (params.m_nIndex == REEFER) {
+			CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 			m_sQueueSample.m_nVolume = ComputeVolume(80, 50.f, m_sQueueSample.m_fDistance);
 			if (m_sQueueSample.m_nVolume != 0) {
 				m_sQueueSample.m_nCounter = 39;
@@ -3265,7 +3265,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params)
 				m_sQueueSample.m_bRequireReflection = false;
 				AddSampleToRequestedQueue();
 			}
-			if (FindPlayerVehicle() == params->m_pVehicle) {
+			if (FindPlayerVehicle() == params.m_pVehicle) {
 				padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake());
 				padRelativeAccerate = padAccelerate / 255;
 				emittingVol = (100.f * padRelativeAccerate) + 15;
@@ -3304,7 +3304,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params)
 			m_sQueueSample.m_bReverbFlag = true;
 			m_sQueueSample.m_bRequireReflection = false;
 		} else {
-			if (FindPlayerVehicle() == params->m_pVehicle) {
+			if (FindPlayerVehicle() == params.m_pVehicle) {
 				padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake());
 				if (padAccelerate <= 20) {
 					emittingVol = 45 - 45 * padAccelerate / 40;
@@ -3341,7 +3341,7 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params)
 					m_sQueueSample.m_nSampleIndex = SFX_FISHING_BOAT_IDLE;
 				}
 			}
-			CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+			CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 			m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 50.f, m_sQueueSample.m_fDistance);
 			if (!m_sQueueSample.m_nVolume)
 				return true;
@@ -3367,22 +3367,22 @@ cAudioManager::ProcessBoatEngine(cVehicleParams *params)
 }
 
 bool
-cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params)
+cAudioManager::ProcessBoatMovingOverWater(cVehicleParams& params)
 {
 	float velocityChange;
 	int32 vol;
 	float multiplier;
 
-	if (params->m_fDistance > SQR(50))
+	if (params.m_fDistance > SQR(50))
 		return false;
 
-	velocityChange = Abs(params->m_fVelocityChange);
-	if (velocityChange <= 0.0005f && ((CBoat*)params->m_pVehicle)->bBoatInWater)
+	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);
+	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) {
@@ -3409,7 +3409,7 @@ cAudioManager::ProcessBoatMovingOverWater(cVehicleParams *params)
 }
 
 void
-cAudioManager::ProcessCarHeli(cVehicleParams* params)
+cAudioManager::ProcessCarHeli(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 250.0f;
 
@@ -3440,11 +3440,11 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 	automobile = nil;
 	hunterBool = false;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return;
 
 	playerVeh = FindPlayerVehicle();
-	veh = params->m_pVehicle;
+	veh = params.m_pVehicle;
 	if (playerVeh == veh) {
 		accelerateState = Pads[0].GetAccelerate();
 		brakeState = Pads[0].GetBrake();
@@ -3457,7 +3457,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 	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) {
+	} else if (params.m_VehicleType == VEHICLE_TYPE_HELI) {
 		propellerSpeed = 1.0f;
 	} else {
 		automobile = (CAutomobile*)veh;
@@ -3468,7 +3468,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 		return;
 
 	propellerSpeed = Min(1.0f, propellerSpeed);
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
+	CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
 
 
 	//sound on long distances
@@ -3510,7 +3510,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 		}
 	}
 
-	if (params->m_fDistance >= SQR(140.0f))
+	if (params.m_fDistance >= SQR(140.0f))
 		return;
 
 	if (propellerSpeed >= 0.4f)
@@ -3640,7 +3640,7 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 
 
 	//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 (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;
@@ -3711,18 +3711,18 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 	} else {
 		//vacuum cleaner sound
 		vecPosOld = m_sQueueSample.m_vecPos;
-		distanceCalculatedOld = params->m_bDistanceCalculated;
-		distanceOld = params->m_fDistance;
+		distanceCalculatedOld = params.m_bDistanceCalculated;
+		distanceOld = params.m_fDistance;
 		
 		if (automobile != nil)
 			automobile->GetComponentWorldPosition(CAR_BOOT, m_sQueueSample.m_vecPos);
-		else if (params->m_VehicleType == VEHICLE_TYPE_HELI) 
+		else if (params.m_VehicleType == VEHICLE_TYPE_HELI) 
 			m_sQueueSample.m_vecPos = CVector(0.0f, -10.0f, 0.0f); //this is from android, but for real it's not used
 
-		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);
+		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(volumeModifier * 25.0f, 27.0f, m_sQueueSample.m_fDistance);
 			if (m_sQueueSample.m_nVolume) {
 				m_sQueueSample.m_nCounter = 2;
@@ -3746,13 +3746,13 @@ cAudioManager::ProcessCarHeli(cVehicleParams* params)
 		}
 		
 		m_sQueueSample.m_vecPos = vecPosOld;
-		params->m_bDistanceCalculated = distanceCalculatedOld;
-		params->m_fDistance = distanceOld;
+		params.m_bDistanceCalculated = distanceCalculatedOld;
+		params.m_fDistance = distanceOld;
 	}
 }
 
 void
-cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params)
+cAudioManager::ProcessVehicleFlatTyre(cVehicleParams& params)
 {
 	const float SOUND_INTENSITY = 60.0f;
 
@@ -3763,12 +3763,12 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params)
 
 	float modifier;
 
-	if (params->m_fDistance >= SQR(SOUND_INTENSITY))
+	if (params.m_fDistance >= SQR(SOUND_INTENSITY))
 		return;
 
-	switch (params->m_VehicleType) {
+	switch (params.m_VehicleType) {
 	case VEHICLE_TYPE_CAR:
-		automobile = (CAutomobile*)params->m_pVehicle;
+		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)
@@ -3777,7 +3777,7 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params)
 			return;
 		break;
 	case VEHICLE_TYPE_BIKE:
-		bike = (CBike*)params->m_pVehicle;
+		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)
@@ -3788,10 +3788,10 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params)
 	default:
 		return;
 	}
-	modifier = Min(1.0f, Abs(params->m_fVelocityChange) / (0.3f * params->m_pTransmission->fMaxVelocity));
+	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);
+		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;
@@ -3817,9 +3817,9 @@ cAudioManager::ProcessVehicleFlatTyre(cVehicleParams* params)
 
 //TODO use it in ProcessVehicle
 void
-cAudioManager::ProcessPlane(cVehicleParams *params)
+cAudioManager::ProcessPlane(cVehicleParams& params)
 {
-	switch (params->m_nIndex) {
+	switch (params.m_nIndex) {
 	case AIRTRAIN:
 		ProcessJumbo(params);
 		break;
@@ -3842,16 +3842,16 @@ DoJumboVolOffset()
 }
 
 void
-cAudioManager::ProcessJumbo(cVehicleParams *params)
+cAudioManager::ProcessJumbo(cVehicleParams& params)
 {
 	CPlane *plane;
 	float position;
 
-	if (params->m_fDistance >= SQR(440))
-		return;
+	//if (params.m_fDistance >= SQR(440))
+	//	return;
 
-	CalculateDistance(params->m_bDistanceCalculated, params->m_fDistance);
-	plane = (CPlane*)params->m_pVehicle;
+	CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance);
+	plane = (CPlane*)params.m_pVehicle;
 	DoJumboVolOffset();
 	position = PlanePathPosition[plane->m_nPlaneId];
 	if (position <= TakeOffPoint) {
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index cdb59412..35bb877c 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -401,28 +401,27 @@ public:
 	void PreTerminateGameSpecificShutdown();                // done
 	/// processX - main logic of adding new sounds
 	void ProcessActiveQueues();                              // done
-	bool ProcessAirBrakes(cVehicleParams *params);           // done
-	bool ProcessBoatEngine(cVehicleParams *params);          
-	bool ProcessBoatMovingOverWater(cVehicleParams *params); 
+	bool ProcessAirBrakes(cVehicleParams& params);           // done
+	bool ProcessBoatEngine(cVehicleParams& params);          
+	bool ProcessBoatMovingOverWater(cVehicleParams& params); 
 #ifdef GTA_BRIDGE
 	void ProcessBridge();         // done(bcs not exists in VC)
 	void ProcessBridgeMotor();    // done(bcs not exists in VC)
 	void ProcessBridgeOneShots(); // done(bcs not exists in VC)
 	void ProcessBridgeWarning();  // done(bcs not exists in VC)
 #endif
-	bool ProcessCarBombTick(cVehicleParams *params);                         // done
-	void ProcessCesna(cVehicleParams *params);                               // 
+	bool ProcessCarBombTick(cVehicleParams& params);                         // done
+	void ProcessCarHeli(cVehicleParams& params);                             // done
+	void ProcessCesna(cVehicleParams& params);                               // 
 	//void ProcessCrane();                                                   // done(bcs not exists in VC)
-	bool ProcessEngineDamage(cVehicleParams *params);                        // done
+	bool ProcessEngineDamage(cVehicleParams& params);                        // done
 	void ProcessEntity(int32 sound);                                         // done
 	void ProcessExplosions(int32 explosion);                                 // done
 	void ProcessFireHydrant();                                               // done
 	void ProcessFires(int32 entity);                                         // done
 	void ProcessFrontEnd();                                                  // done
 	void ProcessGarages();                                                   // 
-	void ProcessCarHeli(cVehicleParams* params);                             // done
-	void ProcessVehicleFlatTyre(cVehicleParams* params);                     // done
-	void ProcessJumbo(cVehicleParams *);                                     // done
+	void ProcessJumbo(cVehicleParams& params);                               // done
 	void ProcessJumboAccel(CPlane *plane);                                   // done
 	void ProcessJumboDecel(CPlane *plane);                                   // done
 	void ProcessJumboFlying();                                               // done
@@ -432,37 +431,37 @@ public:
 	void ProcessLoopingScriptObject(uint8 sound);                            // 
 	void ProcessMissionAudio();                                              // 
 	void ProcessMissionAudioSlot(uint8 slot);                                // 
-	void ProcessModelHeliVehicle(cVehicleParams* params);                    // done
-	void ProcessModelVehicle(cVehicleParams *params);                        // done
+	void ProcessModelHeliVehicle(cVehicleParams& params);                    // done
+	void ProcessModelVehicle(cVehicleParams& params);                        // done
 	void ProcessOneShotScriptObject(uint8 sound);                            // 
 	void ProcessPed(CPhysical *ped);                                         // done
 	void ProcessPedOneShots(cPedParams *params);                             // 
 	void ProcessPhysical(int32 id);                                          // done
-	void ProcessPlane(cVehicleParams *params);                               // done
+	void ProcessPlane(cVehicleParams& params);                               // done
 	void ProcessPlayerMood();                                                // done
-	void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done
+	void ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh); // done
 	void ProcessProjectiles();                                               // done
-	void ProcessRainOnVehicle(cVehicleParams *params);                       // done
+	void ProcessRainOnVehicle(cVehicleParams& params);                       // done
 	void ProcessReverb() const;                                              // done
-	bool ProcessReverseGear(cVehicleParams *params);                         // done
+	bool ProcessReverseGear(cVehicleParams& params);                         // done
 	void ProcessScriptObject(int32 id);                                      // done
 	void ProcessSpecial();                                                   // done
 #ifdef GTA_TRAIN
 	bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC)
 #endif
 	void ProcessVehicle(CVehicle *vehicle);                    // done
-	bool ProcessVehicleDoors(cVehicleParams *params);          // done
-	void ProcessVehicleEngine(cVehicleParams *params);         // done
-	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
-	bool ProcessVehicleHorn(cVehicleParams *params);           // done
-	void ProcessVehicleOneShots(cVehicleParams *params);       // done
-	bool ProcessVehicleReverseWarning(cVehicleParams *params); // done
-	bool ProcessVehicleRoadNoise(cVehicleParams *params);      // done
-	bool ProcessVehicleSirenOrAlarm(cVehicleParams *params);   // done
-	bool ProcessVehicleSkidding(cVehicleParams *params);       // done
+	bool ProcessVehicleDoors(cVehicleParams& params);          // done
+	void ProcessVehicleEngine(cVehicleParams& params);         // done
+	void ProcessVehicleFlatTyre(cVehicleParams& params);                     // done
+	bool ProcessVehicleHorn(cVehicleParams& params);           // done
+	void ProcessVehicleOneShots(cVehicleParams& params);       // done
+	bool ProcessVehicleReverseWarning(cVehicleParams& params); // done
+	bool ProcessVehicleRoadNoise(cVehicleParams& params);      // done
+	bool ProcessVehicleSirenOrAlarm(cVehicleParams& params);   // done
+	bool ProcessVehicleSkidding(cVehicleParams& params);       // done
 	void ProcessWaterCannon(int32);                            // done
 	void ProcessWeather(int32 id);                             // done
-	bool ProcessWetRoadNoise(cVehicleParams *params);          // done
+	bool ProcessWetRoadNoise(cVehicleParams& params);          // done
 	void ProcessEscalators();                                  // done
 	void ProcessExtraSounds();                                 // done
 
@@ -507,10 +506,11 @@ public:
 	void Terminate(); //done
 	void TranslateEntity(Const CVector *v1, CVector *v2) const; //done
 
+	void UpdateGasPedalAudio(CVehicle* veh, int vehType);      // done
 	void UpdateReflections();                              //done
 	bool UsesReverseWarning(int32 model) const;            //done
-	bool UsesSiren(cVehicleParams *params) const;          //done
-	bool UsesSirenSwitching(cVehicleParams* params) const; //done
+	bool UsesSiren(cVehicleParams& params) const;          //done
+	bool UsesSirenSwitching(cVehicleParams& params) const; //done
 
 	CVehicle *FindVehicleOfPlayer(); //done
 	void SetPedTalkingStatus(CPed *ped, uint8 status);
diff --git a/src/control/Script.h b/src/control/Script.h
index 8949fe05..c6ece50f 100644
--- a/src/control/Script.h
+++ b/src/control/Script.h
@@ -381,7 +381,7 @@ private:
 public:
 	static void RemoveThisPed(CPed* pPed);
 
-	static uint32* GetLastMissionPassedTime() { return &LastMissionPassedTime; }
+	static uint32& GetLastMissionPassedTime() { return LastMissionPassedTime; }
 #ifdef MISSION_SWITCHER
 	static void SwitchToMission(int32 mission);
 #endif

From 0853a47a3f521684a4c9c9890b65fc638e41cb07 Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 21:23:29 +0300
Subject: [PATCH 25/27] returned bad code, becouse no one knows what to do with
 it

---
 src/audio/AudioLogic.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 6270e6d8..72ca6655 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -2650,7 +2650,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = event + 22; //originaly used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i], which is same
+			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22;
 			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 28062;
 			else
@@ -2686,7 +2686,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
-			m_sQueueSample.m_nCounter = event + 10; //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]
+			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10;
 			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 23459;
 			else
@@ -2715,7 +2715,7 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 WheelIndex = 82;
 			maxDist = SQR(SOUND_INTENSITY);
-			if (event == SOUND_CAR_JUMP_2) { //also used m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i]
+			if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) {
 				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B;
 				emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
 			} else {

From 363a2c6098c6be9296406a1511a6183f921f929a Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 22:26:14 +0300
Subject: [PATCH 26/27] marked stupied code(dotProduct and AudioEvents)

---
 src/audio/AudioLogic.cpp | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 72ca6655..725149a2 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -1047,7 +1047,11 @@ cAudioManager::ProcessModelVehicle(cVehicleParams& params)
 			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) {
@@ -2650,7 +2654,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+#ifdef THIS_IS_STUPID
 			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 22;
+#else
+			m_sQueueSample.m_nCounter = event + 22;
+#endif
 			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 28062;
 			else
@@ -2686,7 +2694,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 				break;
 			}
 			m_sQueueSample.m_nBankIndex = SFX_BANK_0;
+#ifdef THIS_IS_STUPID
 			m_sQueueSample.m_nCounter = m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] + 10;
+#else
+			m_sQueueSample.m_nCounter = event + 10;
+#endif
 			if (params.m_pVehicle->GetVehicleAppearance() == VEHICLE_APPEARANCE_HELI)
 				m_sQueueSample.m_nFrequency = 23459;
 			else
@@ -2715,7 +2727,11 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 			const float SOUND_INTENSITY = 35.0f;
 			static uint8 WheelIndex = 82;
 			maxDist = SQR(SOUND_INTENSITY);
+#ifdef THIS_IS_STUPID
 			if (m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_awAudioEvent[i] == SOUND_CAR_JUMP_2) {
+#else
+			if (event == SOUND_CAR_JUMP_2) {
+#endif
 				m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_B;
 				emittingVol = Max(50.0f, 2 * (60.0f * m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]));
 			} else {
@@ -7698,7 +7714,6 @@ cAudioManager::ProcessFires(int32)
 				m_sQueueSample.m_fSoundIntensity = 80.0f;
 				m_sQueueSample.m_nSampleIndex = SFX_CAR_ON_FIRE;
 				m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_CAR_ON_FIRE);
-				//mb error in III
 				emittingVol = 80;
 				m_sQueueSample.m_nReleasingVolumeModificator = 8;
 			}

From fb2173c3964dcb6916399dffb9ff44c81863d11d Mon Sep 17 00:00:00 2001
From: Roman Masanin <36927roma@gmail.com>
Date: Sun, 8 Nov 2020 22:33:30 +0300
Subject: [PATCH 27/27] to make Serge and _R4K_ happy

---
 src/audio/AudioLogic.cpp | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp
index 725149a2..f51064aa 100644
--- a/src/audio/AudioLogic.cpp
+++ b/src/audio/AudioLogic.cpp
@@ -3153,6 +3153,9 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 					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++;
@@ -3162,11 +3165,26 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params)
 						m_sQueueSample.m_bRequireReflection = 0;
 						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;
 
 			}