MusicManager.cpp 29,1 КБ
Newer Older
1
#include "common.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
2
#include <time.h>
Sergeanur's avatar
Sergeanur включено в состав коммита
3
#include "soundlist.h"
aap's avatar
aap включено в состав коммита
4
#include "MusicManager.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
5
6
#include "AudioManager.h"
#include "ControllerConfig.h"
Filip Gawin's avatar
Filip Gawin включено в состав коммита
7
#include "Camera.h"
_AG's avatar
_AG включено в состав коммита
8
9
#include "Font.h"
#include "Hud.h"
Filip Gawin's avatar
Filip Gawin включено в состав коммита
10
11
#include "ModelIndices.h"
#include "Replay.h"
eray orçunus's avatar
eray orçunus включено в состав коммита
12
#include "Pad.h"
_AG's avatar
_AG включено в состав коммита
13
14
15
#include "Text.h"
#include "Timer.h"
#include "World.h"
Fire-Head's avatar
Fire-Head включено в состав коммита
16
#include "sampman.h"
Sergeanur's avatar
Sergeanur включено в состав коммита
17

erorcun's avatar
erorcun включено в состав коммита
18
19
20
#if !defined FIX_BUGS && (defined RADIO_SCROLL_TO_PREV_STATION || defined RADIO_OFF_TEXT)
static_assert(false, "RADIO_SCROLL_TO_PREV_STATION and RADIO_OFF_TEXT won't work correctly without FIX_BUGS");
#endif
aap's avatar
aap включено в состав коммита
21

Sergeanur's avatar
Sergeanur включено в состав коммита
22
23
24
cMusicManager MusicManager;
int32 gNumRetunePresses;
int32 gRetuneCounter;
Sergeanur's avatar
Sergeanur включено в состав коммита
25
bool8 bHasStarted;
Sergeanur's avatar
Sergeanur включено в состав коммита
26
27
28

cMusicManager::cMusicManager()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
29
30
	m_bIsInitialised = FALSE;
	m_bDisabled = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
31
	m_nMusicMode = MUSICMODE_DISABLED;
erorcun's avatar
erorcun включено в состав коммита
32
33
	m_nNextTrack = NO_TRACK;
	m_nPlayingTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
34
35
36
	m_bFrontendTrackFinished = FALSE;
	m_bPlayInFrontend = FALSE;
	m_bSetNextStation = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
37
	m_nAnnouncement = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
38
39
40
41
42
	m_bPreviousPlayerInCar = FALSE;
	m_bPlayerInCar = FALSE;
	m_bAnnouncementInProgress = FALSE;
	m_bVerifyAmbienceTrackStartedToPlay = FALSE;
	bHasStarted = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
43
}
aap's avatar
aap включено в состав коммита
44

Sergeanur's avatar
Sergeanur включено в состав коммита
45
bool8
Filip Gawin's avatar
Filip Gawin включено в состав коммита
46
cMusicManager::PlayerInCar()
_AG's avatar
_AG включено в состав коммита
47
{
Filip Gawin's avatar
Filip Gawin включено в состав коммита
48
	if(!FindPlayerVehicle())
Sergeanur's avatar
Sergeanur включено в состав коммита
49
		return FALSE;
_AG's avatar
_AG включено в состав коммита
50

Sergeanur's avatar
Sergeanur включено в состав коммита
51
	int32 State = FindPlayerPed()->m_nPedState;
_AG's avatar
_AG включено в состав коммита
52

Sergeanur's avatar
Sergeanur включено в состав коммита
53
	if(State == PED_DRAG_FROM_CAR || State == PED_EXIT_CAR || State == PED_ARRESTED)
Sergeanur's avatar
Sergeanur включено в состав коммита
54
		return FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
55

Nikolay Korolev's avatar
Nikolay Korolev включено в состав коммита
56
	if (!FindPlayerVehicle())
Sergeanur's avatar
Sergeanur включено в состав коммита
57
		return TRUE;
Nikolay Korolev's avatar
Nikolay Korolev включено в состав коммита
58

Sergeanur's avatar
Sergeanur включено в состав коммита
59
	if (FindPlayerVehicle()->GetStatus() == STATUS_WRECKED)
Sergeanur's avatar
Sergeanur включено в состав коммита
60
		return FALSE;
Nikolay Korolev's avatar
Nikolay Korolev включено в состав коммита
61

Sergeanur's avatar
Sergeanur включено в состав коммита
62
	switch (FindPlayerVehicle()->GetModelIndex()) {
Sergeanur's avatar
Sergeanur включено в состав коммита
63
64
65
66
67
68
69
	case MI_FIRETRUCK:
	case MI_AMBULAN:
	case MI_MRWHOOP:
	case MI_PREDATOR:
	case MI_TRAIN:
	case MI_SPEEDER:
	case MI_REEFER:
Sergeanur's avatar
Sergeanur включено в состав коммита
70
71
	case MI_GHOST: return FALSE;
	default: return TRUE;
_AG's avatar
_AG включено в состав коммита
72
73
74
	}
}

Filip Gawin's avatar
Filip Gawin включено в состав коммита
75
76
void
cMusicManager::DisplayRadioStationName()
_AG's avatar
_AG включено в состав коммита
77
{
_AG's avatar
_AG включено в состав коммита
78
79
80
	int8 pRetune;
	int8 gStreamedSound;
	int8 gRetuneCounter;
Sergeanur's avatar
fixes    
Sergeanur включено в состав коммита
81
82
	static wchar *pCurrentStation = nil;
	static uint8 cDisplay = 0;
_AG's avatar
_AG включено в состав коммита
83

Sergeanur's avatar
Sergeanur включено в состав коммита
84
	if(!CTimer::GetIsPaused() && !TheCamera.m_WideScreenOn && PlayerInCar() &&
Filip Gawin's avatar
Filip Gawin включено в состав коммита
85
	   !CReplay::IsPlayingBack()) {
Sergeanur's avatar
Sergeanur включено в состав коммита
86
		if(m_bPlayerInCar && !m_bPreviousPlayerInCar)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
87
			pCurrentStation = nil;
_AG's avatar
_AG включено в состав коммита
88

erorcun's avatar
erorcun включено в состав коммита
89
90
91
92
93
94
#ifdef FIX_BUGS
		const int curRadio = GetCarTuning();
#else
		const int curRadio = m_nNextTrack;
#endif

erorcun's avatar
erorcun включено в состав коммита
95
96
#ifdef RADIO_SCROLL_TO_PREV_STATION
		if(gNumRetunePresses < 0) {
erorcun's avatar
erorcun включено в состав коммита
97
			gStreamedSound = curRadio;
erorcun's avatar
erorcun включено в состав коммита
98
99
100

			gRetuneCounter = gNumRetunePresses;
			pRetune = gStreamedSound;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
101

erorcun's avatar
erorcun включено в состав коммита
102
103
104
			while(gRetuneCounter < 0) {
				if(pRetune == HEAD_RADIO) {
					pRetune = RADIO_OFF;
erorcun's avatar
erorcun включено в состав коммита
105
				} else if(pRetune == RADIO_OFF || pRetune == NUM_RADIOS) {
erorcun's avatar
erorcun включено в состав коммита
106
107
108
109
110
					pRetune =  SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1;
				} else
					pRetune--;

				++gRetuneCounter;
_AG's avatar
_AG включено в состав коммита
111
			}
erorcun's avatar
erorcun включено в состав коммита
112
113
		} else
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
114
		if(SampleManager.IsMP3RadioChannelAvailable()) {
erorcun's avatar
erorcun включено в состав коммита
115
			gStreamedSound = curRadio;
_AG's avatar
_AG включено в состав коммита
116

Filip Gawin's avatar
Filip Gawin включено в состав коммита
117
			if(gStreamedSound == STREAMED_SOUND_CITY_AMBIENT ||
erorcun's avatar
erorcun включено в состав коммита
118
119
			   gStreamedSound == STREAMED_SOUND_WATER_AMBIENT) { // which means OFF
				gStreamedSound = NUM_RADIOS;
erorcun's avatar
erorcun включено в состав коммита
120
121
			} else if(gStreamedSound > STREAMED_SOUND_RADIO_MP3_PLAYER)
				return;
_AG's avatar
_AG включено в состав коммита
122
123
124

			pRetune = gNumRetunePresses + gStreamedSound;

erorcun's avatar
erorcun включено в состав коммита
125
126
127
128
129
#ifdef FIX_BUGS
			while(pRetune > NUM_RADIOS)
				pRetune -= (NUM_RADIOS + 1);
#endif
			if(pRetune == NUM_RADIOS) {
_AG's avatar
_AG включено в состав коммита
130
131
				pRetune = RADIO_OFF;
			}
erorcun's avatar
erorcun включено в состав коммита
132
133
134
135
136
#ifndef FIX_BUGS
			else if(pRetune > NUM_RADIOS) {
				pRetune = pRetune - (NUM_RADIOS + 1);
			}
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
137
		} else {
erorcun's avatar
erorcun включено в состав коммита
138
			gStreamedSound = curRadio;
_AG's avatar
_AG включено в состав коммита
139
140
			pRetune = gNumRetunePresses + gStreamedSound;

Filip Gawin's avatar
Filip Gawin включено в состав коммита
141
			if(pRetune >= USERTRACK) {
_AG's avatar
_AG включено в состав коммита
142
				gRetuneCounter = gNumRetunePresses;
erorcun's avatar
erorcun включено в состав коммита
143
				pRetune = curRadio;
_AG's avatar
_AG включено в состав коммита
144

Filip Gawin's avatar
Filip Gawin включено в состав коммита
145
				if(gStreamedSound == STREAMED_SOUND_WATER_AMBIENT)
erorcun's avatar
erorcun включено в состав коммита
146
					pRetune = STREAMED_SOUND_CITY_AMBIENT; // which is RADIO_OFF
_AG's avatar
_AG включено в состав коммита
147

Filip Gawin's avatar
Filip Gawin включено в состав коммита
148
149
				while(gRetuneCounter) {
					if(pRetune == RADIO_OFF) {
_AG's avatar
_AG включено в состав коммита
150
						pRetune = HEAD_RADIO;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
151
					} else if(pRetune < USERTRACK) {
_AG's avatar
_AG включено в состав коммита
152
						pRetune = pRetune + 1;
_AG's avatar
_AG включено в состав коммита
153
					}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
154
					if(pRetune == USERTRACK) pRetune = RADIO_OFF;
_AG's avatar
_AG включено в состав коммита
155
156

					--gRetuneCounter;
_AG's avatar
_AG включено в состав коммита
157
158
				}
			}
_AG's avatar
_AG включено в состав коммита
159
		}
_AG's avatar
_AG включено в состав коммита
160

erorcun's avatar
erorcun включено в состав коммита
161
		wchar *string;
_AG's avatar
_AG включено в состав коммита
162

Filip Gawin's avatar
Filip Gawin включено в состав коммита
163
164
165
166
167
168
169
170
171
172
		switch(pRetune) {
		case HEAD_RADIO: string = TheText.Get("FEA_FM0"); break;
		case DOUBLE_CLEF: string = TheText.Get("FEA_FM1"); break;
		case JAH_RADIO: string = TheText.Get("FEA_FM2"); break;
		case RISE_FM: string = TheText.Get("FEA_FM3"); break;
		case LIPS_106: string = TheText.Get("FEA_FM4"); break;
		case GAME_FM: string = TheText.Get("FEA_FM5"); break;
		case MSX_FM: string = TheText.Get("FEA_FM6"); break;
		case FLASHBACK: string = TheText.Get("FEA_FM7"); break;
		case CHATTERBOX: string = TheText.Get("FEA_FM8"); break;
erorcun's avatar
erorcun включено в состав коммита
173
174
175
176
		case USERTRACK:
			if (!SampleManager.IsMP3RadioChannelAvailable())
				return;
			string = TheText.Get("FEA_FM9"); break;
erorcun's avatar
erorcun включено в состав коммита
177
#ifdef RADIO_OFF_TEXT
erorcun's avatar
erorcun включено в состав коммита
178
179
180
181
182
183
184
185
186
187
		case RADIO_OFF: {
			extern wchar WideErrorString[];

			string = TheText.Get("FEA_FMN");
			if(string == WideErrorString) {
				pCurrentStation = nil;
				return;
			}
			break;
		}
erorcun's avatar
erorcun включено в состав коммита
188
#endif
Filip Gawin's avatar
Filip Gawin включено в состав коммита
189
		default: return;
_AG's avatar
_AG включено в состав коммита
190
		};
_AG's avatar
_AG включено в состав коммита
191

erorcun's avatar
erorcun включено в состав коммита
192
193
		if(pCurrentStation != string ||
			m_nNextTrack == STREAMED_SOUND_RADIO_MP3_PLAYER && m_nPlayingTrack != STREAMED_SOUND_RADIO_MP3_PLAYER) {
_AG's avatar
_AG включено в состав коммита
194
195
			pCurrentStation = string;
			cDisplay = 60;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
196
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
197
			if(cDisplay == 0) return;
Sergeanur's avatar
Sergeanur включено в состав коммита
198
199
200
#ifdef FIX_BUGS
			cDisplay -= CTimer::GetLogicalFramesPassed();
#else
Sergeanur's avatar
Sergeanur включено в состав коммита
201
			cDisplay--;
Sergeanur's avatar
Sergeanur включено в состав коммита
202
#endif
_AG's avatar
_AG включено в состав коммита
203
		}
_AG's avatar
_AG включено в состав коммита
204
205
206
207
208
209
210

		CFont::SetJustifyOff();
		CFont::SetBackgroundOff();
		CFont::SetScale(SCREEN_SCALE_X(0.8f), SCREEN_SCALE_Y(1.35f));
		CFont::SetPropOn();
		CFont::SetFontStyle(FONT_HEADING);
		CFont::SetCentreOn();
erorcun's avatar
erorcun включено в состав коммита
211
212
		// Reminder: Game doesn't have "scaling" at all, it just stretches, and it's team's decision here to not let centered text occupy all the screen.
		//				Disable ASPECT_RATIO_SCALE and it'll go back to default behaviour; stretching.
Fire-Head's avatar
Fire-Head включено в состав коммита
213
		CFont::SetCentreSize(SCREEN_SCALE_X(DEFAULT_SCREEN_WIDTH));
_AG's avatar
_AG включено в состав коммита
214
		CFont::SetColor(CRGBA(0, 0, 0, 255));
Fire-Head's avatar
Fire-Head включено в состав коммита
215
#ifdef FIX_BUGS
Sergeanur's avatar
Sergeanur включено в состав коммита
216
		CFont::PrintString(SCREEN_WIDTH / 2 + SCREEN_SCALE_X(2.0f), SCREEN_SCALE_Y(22.0f) + SCREEN_SCALE_Y(2.0f), pCurrentStation);
Fire-Head's avatar
Fire-Head включено в состав коммита
217
218
219
#else
		CFont::PrintString(SCREEN_WIDTH / 2 + 2.0f, SCREEN_SCALE_Y(22.0f) + 2.0f, pCurrentStation);
#endif
_AG's avatar
_AG включено в состав коммита
220

Filip Gawin's avatar
Filip Gawin включено в состав коммита
221
		if(gNumRetunePresses)
_AG's avatar
_AG включено в состав коммита
222
223
224
225
226
227
			CFont::SetColor(CRGBA(102, 133, 143, 255));
		else
			CFont::SetColor(CRGBA(147, 196, 211, 255));

		CFont::PrintString(SCREEN_WIDTH / 2, SCREEN_SCALE_Y(22.0f), pCurrentStation);
		CFont::DrawFonts();
_AG's avatar
_AG включено в состав коммита
228
	}
_AG's avatar
_AG включено в состав коммита
229
}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
230

Sergeanur's avatar
Sergeanur включено в состав коммита
231
bool8
Filip Gawin's avatar
Filip Gawin включено в состав коммита
232
233
cMusicManager::Initialise()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
234
235
236
237
238
	int pos;

	if (!IsInitialised()) {
		time_t timevalue = time(0);
		if (timevalue == -1) {
Sergeanur's avatar
Sergeanur включено в состав коммита
239
			pos = AudioManager.m_anRandomTable[0];
Sergeanur's avatar
Sergeanur включено в состав коммита
240
241
242
		} else {
			tm *pTm = localtime(&timevalue);
			if (pTm->tm_sec == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
243
				pTm->tm_sec = AudioManager.m_anRandomTable[0];
Sergeanur's avatar
Sergeanur включено в состав коммита
244
			if (pTm->tm_min == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
245
				pTm->tm_min = AudioManager.m_anRandomTable[1];
Sergeanur's avatar
Sergeanur включено в состав коммита
246
			if (pTm->tm_hour == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
247
				pTm->tm_hour = AudioManager.m_anRandomTable[2];
Sergeanur's avatar
Sergeanur включено в состав коммита
248
			if (pTm->tm_mday == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
249
				pTm->tm_mday = AudioManager.m_anRandomTable[3];
Sergeanur's avatar
Sergeanur включено в состав коммита
250
			if (pTm->tm_mon == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
251
				pTm->tm_mon = AudioManager.m_anRandomTable[4];
Sergeanur's avatar
Sergeanur включено в состав коммита
252
			if (pTm->tm_year == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
253
				pTm->tm_year = AudioManager.m_anRandomTable[3];
Sergeanur's avatar
Sergeanur включено в состав коммита
254
			if (pTm->tm_wday == 0)
Sergeanur's avatar
Sergeanur включено в состав коммита
255
				pTm->tm_wday = AudioManager.m_anRandomTable[2];
Sergeanur's avatar
Sergeanur включено в состав коммита
256
257
258
259
260
261
262
263
264
265
266
267
			pos = pTm->tm_yday
				* pTm->tm_wday
				* pTm->tm_year
				* pTm->tm_mon
				* pTm->tm_mday
				* pTm->tm_hour * pTm->tm_hour
				* pTm->tm_min * pTm->tm_min
				* pTm->tm_sec * pTm->tm_sec * pTm->tm_sec * pTm->tm_sec;
		}

		for (int i = 0; i < TOTAL_STREAMED_SOUNDS; i++) {
			m_aTracks[i].m_nLength = SampleManager.GetStreamedFileLength(i);
Sergeanur's avatar
Sergeanur включено в состав коммита
268
			m_aTracks[i].m_nPosition = pos * AudioManager.m_anRandomTable[i % 5] % m_aTracks[i].m_nLength;
Sergeanur's avatar
Sergeanur включено в состав коммита
269
270
271
			m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
		}

Sergeanur's avatar
Sergeanur включено в состав коммита
272
		m_bResetTimers = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
273
274
		m_nResetTime = 0;
		m_nTimer = m_nLastTrackServiceTime = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
275
276
277
		m_bDoTrackService = FALSE;
		m_bIgnoreTimeDelay = FALSE;
		m_bRadioSetByScript = FALSE;
erorcun's avatar
erorcun включено в состав коммита
278
		m_nRadioStationScript = HEAD_RADIO;
Sergeanur's avatar
Sergeanur включено в состав коммита
279
		m_nRadioPosition = -1;
Sergeanur's avatar
Sergeanur включено в состав коммита
280
		m_nRadioInCar = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
281
282
		gNumRetunePresses = 0;
		gRetuneCounter = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
283
		m_bIsInitialised = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
284
285
	}
	return m_bIsInitialised;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
286
287
288
289
290
}

void
cMusicManager::Terminate()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
291
292
	if (!IsInitialised()) return;

Sergeanur's avatar
Sergeanur включено в состав коммита
293
294
	if (SampleManager.IsStreamPlaying()) {
		SampleManager.StopStreamedFile();
erorcun's avatar
erorcun включено в состав коммита
295
296
		m_nNextTrack = NO_TRACK;
		m_nPlayingTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
297
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
298
	m_bIsInitialised = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
299
300
301
302
303
304
305
306
307
308
}

void
cMusicManager::ChangeMusicMode(uint8 mode)
{
	if (!IsInitialised()) return;

	uint8 mode2;
	switch (mode)
	{
Sergeanur's avatar
Sergeanur включено в состав коммита
309
310
311
312
313
314
315
316
317
318
	case MUSICMODE_FRONTEND:
		mode2 = MUSICMODE_FRONTEND;
#ifdef PAUSE_RADIO_IN_FRONTEND
		// rewind those streams we weren't listening right now
		for (uint32 i = STREAMED_SOUND_RADIO_HEAD; i < STREAMED_SOUND_CUTSCENE_LUIGI1_LG; i++) {
			m_aTracks[i].m_nPosition = GetTrackStartPos(i);
			m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
		}
#endif
		break;
Sergeanur's avatar
Sergeanur включено в состав коммита
319
320
321
322
323
324
325
326
327
328
329
330
331
	case MUSICMODE_GAME: mode2 = MUSICMODE_GAME; break;
	case MUSICMODE_CUTSCENE: mode2 = MUSICMODE_CUTSCENE; break;
	case MUSICMODE_DISABLE: mode2 = MUSICMODE_DISABLED; break;
	default: return;
	}

	if (mode2 != m_nMusicMode || mode == MUSICMODE_FRONTEND && mode2 == MUSICMODE_FRONTEND) {
		switch (mode)
		{
		case MUSICMODE_FRONTEND:
		case MUSICMODE_GAME:
		case MUSICMODE_CUTSCENE:
		case MUSICMODE_DISABLED:
Sergeanur's avatar
Sergeanur включено в состав коммита
332
			if (SampleManager.IsStreamPlaying()) {
erorcun's avatar
erorcun включено в состав коммита
333
				if (m_nNextTrack < TOTAL_STREAMED_SOUNDS) {
Sergeanur's avatar
Sergeanur включено в состав коммита
334
					m_aTracks[m_nNextTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
335
					m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
336
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
337
				SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
338
			}
erorcun's avatar
erorcun включено в состав коммита
339
340
			m_nNextTrack = NO_TRACK;
			m_nPlayingTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
341
342
343
344
345
346
			m_bFrontendTrackFinished = FALSE;
			m_bPlayInFrontend = FALSE;
			m_bSetNextStation = FALSE;
			m_bPreviousPlayerInCar = FALSE;
			m_bPlayerInCar = FALSE;
			m_bAnnouncementInProgress = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
347
			m_nTimer = m_nLastTrackServiceTime = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
348
349
350
			m_bDoTrackService = FALSE;
			m_bIgnoreTimeDelay = TRUE;
			m_bVerifyAmbienceTrackStartedToPlay = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
			m_nMusicMode = mode2;
			break;
		default: return;
		}
	}
}

uint8
cMusicManager::GetRadioInCar(void)
{
	if (!m_bIsInitialised) return HEAD_RADIO;
	if (PlayerInCar()) {
		CVehicle *veh = FindPlayerVehicle();
		if (veh != nil){
			if (UsesPoliceRadio(veh)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
366
				if (m_nRadioInCar == NO_TRACK || (CReplay::IsPlayingBack() && !AudioManager.m_bIsPaused))
Sergeanur's avatar
Sergeanur включено в состав коммита
367
368
369
370
371
372
					return POLICE_RADIO;
				return m_nRadioInCar;
			} else return veh->m_nRadioStation;
		}
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
373
	if (m_nRadioInCar == NO_TRACK || (CReplay::IsPlayingBack() && !AudioManager.m_bIsPaused))
Sergeanur's avatar
Sergeanur включено в состав коммита
374
375
		return RADIO_OFF;
	return m_nRadioInCar;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
376
}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
377
378

void
Sergeanur's avatar
Sergeanur включено в состав коммита
379
cMusicManager::SetRadioInCar(uint32 station)
Filip Gawin's avatar
Filip Gawin включено в состав коммита
380
{
Sergeanur's avatar
Sergeanur включено в состав коммита
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
	if (m_bIsInitialised) {
		if (!PlayerInCar()) {
			m_nRadioInCar = station;
			return;
		}
		CVehicle *veh = FindPlayerVehicle();
		if (veh == nil) return;
		if (UsesPoliceRadio(veh))
			m_nRadioInCar = station;
		else
			veh->m_nRadioStation = station;
	}
}

void
cMusicManager::SetRadioChannelByScript(uint8 station, int32 pos)
{
	if (m_bIsInitialised && station < RADIO_OFF) {
Sergeanur's avatar
Sergeanur включено в состав коммита
399
		m_bRadioSetByScript = TRUE;
erorcun's avatar
erorcun включено в состав коммита
400
		m_nRadioStationScript = station;
Sergeanur's avatar
Sergeanur включено в состав коммита
401
402
403
404
405
406
407
408
		m_nRadioPosition = pos == -1 ? -1 : pos % m_aTracks[station].m_nLength;
	}
}


void
cMusicManager::ResetMusicAfterReload()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
409
	m_bRadioSetByScript = FALSE;
erorcun's avatar
erorcun включено в состав коммита
410
	m_nRadioStationScript = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
411
	m_nRadioPosition = -1;
Sergeanur's avatar
Sergeanur включено в состав коммита
412
	m_nAnnouncement = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
413
414
	m_bAnnouncementInProgress = FALSE;
	m_bSetNextStation = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
415
416
417
418
419
420
	gRetuneCounter = 0;
	gNumRetunePresses = 0;
}


void
Sergeanur's avatar
Sergeanur включено в состав коммита
421
cMusicManager::ResetTimers(uint32 time)
Sergeanur's avatar
Sergeanur включено в состав коммита
422
{
Sergeanur's avatar
Sergeanur включено в состав коммита
423
	m_bResetTimers = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
424
425
426
427
428
429
430
	m_nResetTime = time;
}

void
cMusicManager::Service()
{
	if (m_bResetTimers) {
Sergeanur's avatar
Sergeanur включено в состав коммита
431
		m_bResetTimers = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
432
433
434
435
436
437
		m_nLastTrackServiceTime = m_nResetTime;
	}

	if (!m_bIsInitialised || m_bDisabled) return;

	if (m_nMusicMode == MUSICMODE_CUTSCENE) {
Sergeanur's avatar
Sergeanur включено в состав коммита
438
		SampleManager.SetStreamedVolumeAndPan(MAX_VOLUME, 63, TRUE);
Sergeanur's avatar
Sergeanur включено в состав коммита
439
440
441
442
443
		return;
	}

	m_nTimer = CTimer::GetTimeInMillisecondsPauseMode();
	if (m_nTimer > (m_nLastTrackServiceTime + 2000) || m_bIgnoreTimeDelay) {
Sergeanur's avatar
Sergeanur включено в состав коммита
444
445
		m_bIgnoreTimeDelay = FALSE;
		m_bDoTrackService = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
446
		m_nLastTrackServiceTime = m_nTimer;
Sergeanur's avatar
Sergeanur включено в состав коммита
447
	} else m_bDoTrackService = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
448

Sergeanur's avatar
Sergeanur включено в состав коммита
449
450
	if (m_nNextTrack == NO_TRACK && SampleManager.IsStreamPlaying())
		SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
451
452
453
454
455
456
457
458
459
	else switch (m_nMusicMode) {
		case MUSICMODE_FRONTEND: ServiceFrontEndMode(); break;
		case MUSICMODE_GAME: ServiceGameMode(); break;
		}
}

void
cMusicManager::ServiceFrontEndMode()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
460
461
462
463
464
465
#ifdef PAUSE_RADIO_IN_FRONTEND
	// pause radio
	for (uint32 i = STREAMED_SOUND_RADIO_HEAD; i < STREAMED_SOUND_CUTSCENE_LUIGI1_LG; i++)
		m_aTracks[i].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
#endif

erorcun's avatar
erorcun включено в состав коммита
466
	if (m_nNextTrack < TOTAL_STREAMED_SOUNDS) {
Sergeanur's avatar
Sergeanur включено в состав коммита
467
		if (m_bFrontendTrackFinished) {
Sergeanur's avatar
Sergeanur включено в состав коммита
468
			if (!SampleManager.IsStreamPlaying()) {
erorcun's avatar
erorcun включено в состав коммита
469
				switch (m_nNextTrack)
Sergeanur's avatar
Sergeanur включено в состав коммита
470
471
				{
				case STREAMED_SOUND_MISSION_COMPLETED:
Sergeanur's avatar
Sergeanur включено в состав коммита
472
					if (!AudioManager.m_bIsPaused)
Sergeanur's avatar
Sergeanur включено в состав коммита
473
474
475
476
477
478
479
480
						ChangeMusicMode(MUSICMODE_GAME);
					break;
				case STREAMED_SOUND_GAME_COMPLETED:
					ChangeMusicMode(MUSICMODE_GAME);
					break;
				default:
					break;
				}
erorcun's avatar
erorcun включено в состав коммита
481
482
				m_nNextTrack = NO_TRACK;
				m_nPlayingTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
483
484
			}
		} else if (bHasStarted) {
Sergeanur's avatar
Sergeanur включено в состав коммита
485
486
			if (!SampleManager.IsStreamPlaying())
				SampleManager.StartStreamedFile(m_nNextTrack, 0);
Sergeanur's avatar
Sergeanur включено в состав коммита
487
		} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
488
489
			SampleManager.SetStreamedVolumeAndPan(0, 63, FALSE);
			if (!SampleManager.StartStreamedFile(m_nNextTrack, m_nNextTrack < NUM_RADIOS ? GetTrackStartPos(m_nNextTrack) : 0))
Sergeanur's avatar
Sergeanur включено в состав коммита
490
				return;
Sergeanur's avatar
Sergeanur включено в состав коммита
491
			SampleManager.SetStreamedVolumeAndPan(100, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
492
493
			if (m_bPlayInFrontend) bHasStarted = TRUE;
			else m_bFrontendTrackFinished = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
494
495
		}
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
496
497
	if (SampleManager.IsStreamPlaying())
		SampleManager.SetStreamedVolumeAndPan((CPad::GetPad(0)->bDisplayNoControllerMessage || CPad::GetPad(0)->bObsoleteControllerMessage) ? 0 : 100, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
498
499
500
501
502
}

void
cMusicManager::ServiceGameMode()
{
Sergeanur's avatar
Sergeanur включено в состав коммита
503
	bool8 bRadioOff = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
504
	static int8 nFramesSinceCutsceneEnded = -1;
Sergeanur's avatar
Sergeanur включено в состав коммита
505
	uint8 volume;
Sergeanur's avatar
Sergeanur включено в состав коммита
506
507
508

	m_bPreviousPlayerInCar = m_bPlayerInCar;
	m_bPlayerInCar = PlayerInCar();
erorcun's avatar
erorcun включено в состав коммита
509
	m_nPlayingTrack = m_nNextTrack;
Sergeanur's avatar
Sergeanur включено в состав коммита
510
511
512
513
514
515
	if (m_bPlayerInCar) {
		if (FindPlayerPed() != nil
			&& !FindPlayerPed()->DyingOrDead()
			&& !CReplay::IsPlayingBack()
			&& FindPlayerVehicle() != nil
			&& !UsesPoliceRadio(FindPlayerVehicle())) {
erorcun's avatar
erorcun включено в состав коммита
516
517
518
519
520

				if (CPad::GetPad(0)->ChangeStationJustDown()) {
					gRetuneCounter = 30;
					gNumRetunePresses++;
					AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
erorcun's avatar
erorcun включено в состав коммита
521
522
					// This needs loop, and this is not the right place. Now done elsewhere.
#ifndef FIX_BUGS
erorcun's avatar
erorcun включено в состав коммита
523
524
525
526
					if (SampleManager.IsMP3RadioChannelAvailable()) {
						if (gNumRetunePresses > RADIO_OFF)
							gNumRetunePresses -= RADIO_OFF;
					}
erorcun's avatar
erorcun включено в состав коммита
527
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
528
				}
erorcun's avatar
erorcun включено в состав коммита
529
#ifdef RADIO_SCROLL_TO_PREV_STATION
erorcun's avatar
erorcun включено в состав коммита
530
				else if(!CPad::GetPad(0)->ArePlayerControlsDisabled() && (CPad::GetPad(0)->GetMouseWheelDownJustDown() || CPad::GetPad(0)->GetMouseWheelUpJustDown())) {
erorcun's avatar
erorcun включено в состав коммита
531
532
533
534
535
536
537
538
539
540
					int scrollNext = ControlsManager.GetControllerKeyAssociatedWithAction(VEHICLE_CHANGE_RADIO_STATION, MOUSE);
					int scrollPrev = scrollNext == rsMOUSEWHEELUPBUTTON ? rsMOUSEWHEELDOWNBUTTON : scrollNext == rsMOUSEWHEELDOWNBUTTON ? rsMOUSEWHEELUPBUTTON : -1;

					if (scrollPrev != -1 && !ControlsManager.IsAnyVehicleActionAssignedToMouseKey(scrollPrev)) {
						gRetuneCounter = 30;
						gNumRetunePresses--;
						AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
					}
				}
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
541
542
543
544
545
		}
	} else {
		nFramesSinceCutsceneEnded = -1;
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
546
	if (AudioManager.m_bWasPaused)
Sergeanur's avatar
Sergeanur включено в состав коммита
547
		m_bPreviousPlayerInCar = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
548
549
	if (!m_bPlayerInCar) {
		if (m_bPreviousPlayerInCar) {
erorcun's avatar
erorcun включено в состав коммита
550
551
			if (m_nNextTrack != STREAMED_SOUND_RADIO_POLICE)
				m_nRadioInCar = m_nNextTrack;
Sergeanur's avatar
Sergeanur включено в состав коммита
552
553
554
555
556
557
558
		}
		ServiceAmbience();
		return;
	}

	if (m_bPreviousPlayerInCar) {
		if (m_nAnnouncement < TOTAL_STREAMED_SOUNDS
erorcun's avatar
erorcun включено в состав коммита
559
			&& (m_nNextTrack < RADIO_OFF || m_bAnnouncementInProgress)
Sergeanur's avatar
Sergeanur включено в состав коммита
560
561
562
			&& ServiceAnnouncement())
		{
			if (m_bAnnouncementInProgress) {
Sergeanur's avatar
Sergeanur включено в состав коммита
563
				m_bSetNextStation = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
564
565
				return;
			}
erorcun's avatar
erorcun включено в состав коммита
566
567
			m_nPlayingTrack = m_nNextTrack;
			m_nNextTrack = GetCarTuning();
Sergeanur's avatar
Sergeanur включено в состав коммита
568
569
		}
		if (SampleManager.IsMP3RadioChannelAvailable()
erorcun's avatar
erorcun включено в состав коммита
570
			&& m_nNextTrack != STREAMED_SOUND_RADIO_MP3_PLAYER
Sergeanur's avatar
Sergeanur включено в состав коммита
571
572
			&& ControlsManager.GetIsKeyboardKeyJustDown(rsF9))
		{
erorcun's avatar
erorcun включено в состав коммита
573
574
			m_nPlayingTrack = m_nNextTrack;
			m_nNextTrack = STREAMED_SOUND_RADIO_MP3_PLAYER;
Sergeanur's avatar
Sergeanur включено в состав коммита
575
576
577
578
579
			if (FindPlayerVehicle() != nil)
				FindPlayerVehicle()->m_nRadioStation = STREAMED_SOUND_RADIO_MP3_PLAYER;
			AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 1.0f);
			gRetuneCounter = 0;
			gNumRetunePresses = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
580
			m_bSetNextStation = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
581
		}
erorcun's avatar
erorcun включено в состав коммита
582
583
584
585
586
587
		// Because when you switch radio back and forth, gNumRetunePresses will be 0 but gRetuneCounter won't.
#ifdef RADIO_SCROLL_TO_PREV_STATION
		if (gRetuneCounter != 0) {
			if (gRetuneCounter > 1) gRetuneCounter--;
			else if (gRetuneCounter == 1) gRetuneCounter = -1;
			else if (gRetuneCounter == -1) {
Sergeanur's avatar
Sergeanur включено в состав коммита
588
				m_bSetNextStation = TRUE;
erorcun's avatar
erorcun включено в состав коммита
589
590
591
592
				gRetuneCounter = 0;
			}
		}
#else
Sergeanur's avatar
Sergeanur включено в состав коммита
593
594
		if (gNumRetunePresses) {
			if (gRetuneCounter != 0) gRetuneCounter--;
Sergeanur's avatar
Sergeanur включено в состав коммита
595
			else m_bSetNextStation = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
596
		}
erorcun's avatar
erorcun включено в состав коммита
597
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
598
599
600
		if (gRetuneCounter)
			AudioManager.DoPoliceRadioCrackle();
		if (m_bSetNextStation) {
Sergeanur's avatar
Sergeanur включено в состав коммита
601
			m_bSetNextStation = FALSE;
erorcun's avatar
erorcun включено в состав коммита
602
603
604
			m_nPlayingTrack = m_nNextTrack;
			m_nNextTrack = GetNextCarTuning();
			if (m_nNextTrack == STREAMED_SOUND_CITY_AMBIENT || m_nNextTrack == STREAMED_SOUND_WATER_AMBIENT)
Sergeanur's avatar
Sergeanur включено в состав коммита
605
				bRadioOff = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
606

erorcun's avatar
erorcun включено в состав коммита
607
			if (m_nPlayingTrack == STREAMED_SOUND_CITY_AMBIENT || m_nPlayingTrack == STREAMED_SOUND_WATER_AMBIENT)
Sergeanur's avatar
Sergeanur включено в состав коммита
608
609
				AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_CHANGE, 0.0f);
		}
erorcun's avatar
erorcun включено в состав коммита
610
		if (m_nNextTrack < RADIO_OFF) {
Sergeanur's avatar
Sergeanur включено в состав коммита
611
612
613
			if (ChangeRadioChannel()) {
				ServiceTrack();
			} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
614
				m_bPlayerInCar = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
615
				if (FindPlayerVehicle())
erorcun's avatar
erorcun включено в состав коммита
616
617
					FindPlayerVehicle()->m_nRadioStation = m_nNextTrack;
				m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
618
619
620
			}
			if (CTimer::GetIsSlowMotionActive()) {
				if (TheCamera.pTargetEntity != nil) {
Sergeanur's avatar
Sergeanur включено в состав коммита
621
622
					float DistToTargetSq = (TheCamera.pTargetEntity->GetPosition() - TheCamera.GetPosition()).MagnitudeSqr();
					if (DistToTargetSq >= SQR(55.0f)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
623
						SampleManager.SetStreamedVolumeAndPan(0, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
624
625
626
627
					} else if (DistToTargetSq >= SQR(10.0f)) {
						volume = ((45.0f - (Sqrt(DistToTargetSq) - 10.0f)) / 45.0f * 100.0f);
						uint8 pan;
						if (AudioManager.ShouldDuckMissionAudio())
Sergeanur's avatar
Sergeanur включено в состав коммита
628
							volume /= 4;
Sergeanur's avatar
Sergeanur включено в состав коммита
629
630
631
632
						if (volume > 0) {
							CVector panVec;
							AudioManager.TranslateEntity(&TheCamera.pTargetEntity->GetPosition(), &panVec);
							pan = AudioManager.ComputePan(55.0f, &panVec);
Sergeanur's avatar
Sergeanur включено в состав коммита
633
634
635
636
637
						} else {
							pan = 0;
						}
						if (gRetuneCounter)
							volume /= 4;
Sergeanur's avatar
Sergeanur включено в состав коммита
638
						SampleManager.SetStreamedVolumeAndPan(volume, pan, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
639
					} else if (AudioManager.ShouldDuckMissionAudio()) {
Sergeanur's avatar
Sergeanur включено в состав коммита
640
						SampleManager.SetStreamedVolumeAndPan(25, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
641
					} else if (gRetuneCounter) {
Sergeanur's avatar
Sergeanur включено в состав коммита
642
						SampleManager.SetStreamedVolumeAndPan(25, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
643
					} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
644
						SampleManager.SetStreamedVolumeAndPan(100, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
645
646
					}
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
647
			} else if (AudioManager.ShouldDuckMissionAudio()) {
Sergeanur's avatar
Sergeanur включено в состав коммита
648
				SampleManager.SetStreamedVolumeAndPan(25, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
649
650
651
652
				nFramesSinceCutsceneEnded = 0;
			} else {
				if (nFramesSinceCutsceneEnded == -1) {
					volume = 100;
Sergeanur's avatar
Sergeanur включено в состав коммита
653
				} else if (nFramesSinceCutsceneEnded < 20) {
Sergeanur's avatar
Sergeanur включено в состав коммита
654
655
					nFramesSinceCutsceneEnded++;
					volume = 25;
Sergeanur's avatar
Sergeanur включено в состав коммита
656
657
658
659
660
661
				} else if (nFramesSinceCutsceneEnded < 40) {
					volume = 3 * (nFramesSinceCutsceneEnded - 20) + 25;
					nFramesSinceCutsceneEnded++;
				} else {
					nFramesSinceCutsceneEnded = -1;
					volume = 100;
Sergeanur's avatar
Sergeanur включено в состав коммита
662
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
663
664
				if (gRetuneCounter != 0)
					volume /= 4;
Sergeanur's avatar
Sergeanur включено в состав коммита
665
				SampleManager.SetStreamedVolumeAndPan(volume, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
666
667
668
669
			}
			return;
		}
		if (bRadioOff) {
erorcun's avatar
erorcun включено в состав коммита
670
			m_nNextTrack = m_nPlayingTrack;
Sergeanur's avatar
Sergeanur включено в состав коммита
671
672
			if (FindPlayerVehicle() != nil)
				FindPlayerVehicle()->m_nRadioStation = RADIO_OFF;
erorcun's avatar
erorcun включено в состав коммита
673
			AudioManager.PlayOneShot(AudioManager.m_nFrontEndEntity, SOUND_FRONTEND_RADIO_TURN_OFF, 0.0f);
Sergeanur's avatar
Sergeanur включено в состав коммита
674
675
676
677
678
679
		}
		ServiceAmbience();
		return;
	}
	if (m_bRadioSetByScript) {
		if (UsesPoliceRadio(FindPlayerVehicle())) {
erorcun's avatar
erorcun включено в состав коммита
680
			m_nNextTrack = STREAMED_SOUND_RADIO_POLICE;
Sergeanur's avatar
Sergeanur включено в состав коммита
681
		} else {
erorcun's avatar
erorcun включено в состав коммита
682
683
684
			m_nNextTrack = m_nRadioStationScript;
			if (FindPlayerVehicle()->m_nRadioStation == m_nNextTrack) {
				m_nPlayingTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
685
686
				SampleManager.SetStreamedVolumeAndPan(0, 63, FALSE);
				SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
687
688
			}
			if (m_nRadioPosition != -1) {
erorcun's avatar
erorcun включено в состав коммита
689
690
				m_aTracks[m_nNextTrack].m_nPosition = m_nRadioPosition;
				m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
691
692
693
			}
		}
	} else {
erorcun's avatar
erorcun включено в состав коммита
694
		m_nNextTrack = GetCarTuning();
Sergeanur's avatar
Sergeanur включено в состав коммита
695
	}
erorcun's avatar
erorcun включено в состав коммита
696
	if (m_nNextTrack >= RADIO_OFF) {
Sergeanur's avatar
Sergeanur включено в состав коммита
697
698
699
700
701
		ServiceAmbience();
		return;
	}
	if (ChangeRadioChannel()) {
		if (m_bRadioSetByScript) {
Sergeanur's avatar
Sergeanur включено в состав коммита
702
			m_bRadioSetByScript = FALSE;
erorcun's avatar
erorcun включено в состав коммита
703
			FindPlayerVehicle()->m_nRadioStation = m_nNextTrack;
Sergeanur's avatar
Sergeanur включено в состав коммита
704
705
		}
	} else {
Sergeanur's avatar
Sergeanur включено в состав коммита
706
		m_bPlayerInCar = FALSE;
erorcun's avatar
erorcun включено в состав коммита
707
		m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
708
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
709
710
711
712
713
}

void
cMusicManager::StopFrontEndTrack()
{
erorcun's avatar
erorcun включено в состав коммита
714
	if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_FRONTEND && m_nNextTrack != NO_TRACK) {
Sergeanur's avatar
Sergeanur включено в состав коммита
715
		m_aTracks[m_nNextTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
716
		m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
717
		SampleManager.StopStreamedFile();
erorcun's avatar
erorcun включено в состав коммита
718
719
		m_nPlayingTrack = NO_TRACK;
		m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
720
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
721
}
Fire-Head's avatar
Fire-Head включено в состав коммита
722

Sergeanur's avatar
Sergeanur включено в состав коммита
723
724
void
cMusicManager::PlayAnnouncement(uint8 announcement)
Fire-Head's avatar
Fire-Head включено в состав коммита
725
{
Sergeanur's avatar
Sergeanur включено в состав коммита
726
727
	if (IsInitialised() && !m_bDisabled && !m_bAnnouncementInProgress)
		m_nAnnouncement = announcement;
Fire-Head's avatar
Fire-Head включено в состав коммита
728
729
}

Sergeanur's avatar
Sergeanur включено в состав коммита
730
void
Sergeanur's avatar
Sergeanur включено в состав коммита
731
cMusicManager::PlayFrontEndTrack(uint8 track, bool8 bPlayInFrontend)
Fire-Head's avatar
Fire-Head включено в состав коммита
732
{
Sergeanur's avatar
Sergeanur включено в состав коммита
733
734
	if (IsInitialised() && !m_bDisabled && track < TOTAL_STREAMED_SOUNDS) {
		if (m_nMusicMode == MUSICMODE_GAME) {
erorcun's avatar
erorcun включено в состав коммита
735
			if (m_nNextTrack != NO_TRACK) {
Sergeanur's avatar
Sergeanur включено в состав коммита
736
				if (m_bAnnouncementInProgress) {
Sergeanur's avatar
Sergeanur включено в состав коммита
737
					m_nAnnouncement = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
738
					m_bAnnouncementInProgress = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
739
				}
Sergeanur's avatar
Sergeanur включено в состав коммита
740
				m_aTracks[m_nNextTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
741
				m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
742
			}
Sergeanur's avatar
Sergeanur включено в состав коммита
743
			SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
744
		} else if (m_nMusicMode == MUSICMODE_FRONTEND) {
erorcun's avatar
erorcun включено в состав коммита
745
			if (m_nNextTrack != NO_TRACK) {
Sergeanur's avatar
Sergeanur включено в состав коммита
746
				m_aTracks[m_nNextTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
747
				m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
748
			}
Sergeanur's avatar
Sergeanur включено в состав коммита
749
			SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
750
751
		}

erorcun's avatar
erorcun включено в состав коммита
752
753
		m_nPlayingTrack = m_nNextTrack;
		m_nNextTrack = track;
Sergeanur's avatar
Sergeanur включено в состав коммита
754
755
756
757
		m_bPlayInFrontend = bPlayInFrontend;
		m_bFrontendTrackFinished = FALSE;
		m_bDoTrackService = TRUE;
		bHasStarted = FALSE;
erorcun's avatar
erorcun включено в состав коммита
758
		if (m_nNextTrack < NUM_RADIOS) {
Sergeanur's avatar
Sergeanur включено в состав коммита
759
760
761
762
			gRetuneCounter = 0;
			gNumRetunePresses = 0;
		}
	}
Fire-Head's avatar
Fire-Head включено в состав коммита
763
764
}

Sergeanur's avatar
Sergeanur включено в состав коммита
765
766
void
cMusicManager::PreloadCutSceneMusic(uint8 track)
Fire-Head's avatar
Fire-Head включено в состав коммита
767
{
Sergeanur's avatar
Sergeanur включено в состав коммита
768
769
	if (IsInitialised() && !m_bDisabled && track < TOTAL_STREAMED_SOUNDS && m_nMusicMode == MUSICMODE_CUTSCENE) {
		AudioManager.ResetPoliceRadio();
Sergeanur's avatar
Sergeanur включено в состав коммита
770
771
772
773
		while (SampleManager.IsStreamPlaying())
			SampleManager.StopStreamedFile();
		SampleManager.PreloadStreamedFile(track);
		SampleManager.SetStreamedVolumeAndPan(MAX_VOLUME, 63, TRUE);
erorcun's avatar
erorcun включено в состав коммита
774
		m_nNextTrack = track;
Sergeanur's avatar
Sergeanur включено в состав коммита
775
	}
Fire-Head's avatar
Fire-Head включено в состав коммита
776
777
}

Sergeanur's avatar
Sergeanur включено в состав коммита
778
void
Filip Gawin's avatar
Filip Gawin включено в состав коммита
779
cMusicManager::PlayPreloadedCutSceneMusic(void)
Fire-Head's avatar
Fire-Head включено в состав коммита
780
{
Sergeanur's avatar
Sergeanur включено в состав коммита
781
	if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_CUTSCENE)
Sergeanur's avatar
Sergeanur включено в состав коммита
782
		SampleManager.StartPreloadedStreamedFile();
Fire-Head's avatar
Fire-Head включено в состав коммита
783
784
}

Sergeanur's avatar
Sergeanur включено в состав коммита
785
void
Filip Gawin's avatar
Filip Gawin включено в состав коммита
786
cMusicManager::StopCutSceneMusic(void)
Fire-Head's avatar
Fire-Head включено в состав коммита
787
{
Sergeanur's avatar
Sergeanur включено в состав коммита
788
	if (IsInitialised() && !m_bDisabled && m_nMusicMode == MUSICMODE_CUTSCENE) {
Sergeanur's avatar
Sergeanur включено в состав коммита
789
		SampleManager.StopStreamedFile();
erorcun's avatar
erorcun включено в состав коммита
790
		m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
791
	}
Fire-Head's avatar
Fire-Head включено в состав коммита
792
793
}

Sergeanur's avatar
Sergeanur включено в состав коммита
794
795
uint32
cMusicManager::GetTrackStartPos(uint8 track)
Fire-Head's avatar
Fire-Head включено в состав коммита
796
{
Sergeanur's avatar
Sergeanur включено в состав коммита
797
798
799
800
	uint32 pos = m_aTracks[track].m_nPosition;
	if (CTimer::GetTimeInMillisecondsPauseMode() > m_aTracks[track].m_nLastPosCheckTimer)
		pos += Min(CTimer::GetTimeInMillisecondsPauseMode() - m_aTracks[track].m_nLastPosCheckTimer, 90000);
	else
Sergeanur's avatar
Sergeanur включено в состав коммита
801
802
		m_aTracks[track].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();

Sergeanur's avatar
Sergeanur включено в состав коммита
803
804
805
	if (pos > m_aTracks[track].m_nLength)
		pos %= m_aTracks[track].m_nLength;
	return pos;
Fire-Head's avatar
Fire-Head включено в состав коммита
806
807
}

Sergeanur's avatar
Sergeanur включено в состав коммита
808

Sergeanur's avatar
Sergeanur включено в состав коммита
809
bool8
Sergeanur's avatar
Sergeanur включено в состав коммита
810
cMusicManager::UsesPoliceRadio(CVehicle *veh)
Fire-Head's avatar
Fire-Head включено в состав коммита
811
{
Sergeanur's avatar
Sergeanur включено в состав коммита
812
813
814
815
816
817
818
819
	switch (veh->GetModelIndex())
	{
	case MI_FBICAR:
	case MI_POLICE:
	case MI_ENFORCER:
	case MI_PREDATOR:
	case MI_RHINO:
	case MI_BARRACKS:
Sergeanur's avatar
Sergeanur включено в состав коммита
820
		return TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
821
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
822
	return FALSE;
Fire-Head's avatar
Fire-Head включено в состав коммита
823
824
}

Sergeanur's avatar
Sergeanur включено в состав коммита
825
826
void
cMusicManager::ServiceAmbience()
Fire-Head's avatar
Fire-Head включено в состав коммита
827
{
Sergeanur's avatar
Sergeanur включено в состав коммита
828
829
830
	uint8 volume;

	if (m_bAnnouncementInProgress) {
Sergeanur's avatar
Sergeanur включено в состав коммита
831
		m_nAnnouncement = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
832
		m_bAnnouncementInProgress = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
833
	}
erorcun's avatar
erorcun включено в состав коммита
834
	if (m_nNextTrack < RADIO_OFF) {
Sergeanur's avatar
Sergeanur включено в состав коммита
835
836
		if (SampleManager.IsStreamPlaying()) {
			m_aTracks[m_nNextTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
837
			m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
838
			SampleManager.StopStreamedFile();
erorcun's avatar
erorcun включено в состав коммита
839
			m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
840
841
			return;
		}
erorcun's avatar
erorcun включено в состав коммита
842
		m_nNextTrack = RADIO_OFF;
Sergeanur's avatar
Sergeanur включено в состав коммита
843
	}
Sergeanur's avatar
Sergeanur включено в состав коммита
844
	if (CWorld::Players[CWorld::PlayerInFocus].m_WBState != WBSTATE_PLAYING && !SampleManager.IsStreamPlaying()) {
erorcun's avatar
erorcun включено в состав коммита
845
		m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
846
847
848
		return;
	}

erorcun's avatar
erorcun включено в состав коммита
849
850
	m_nPlayingTrack = m_nNextTrack;
	m_nNextTrack = TheCamera.DistanceToWater <= 45.0f ? STREAMED_SOUND_WATER_AMBIENT : STREAMED_SOUND_CITY_AMBIENT;
Sergeanur's avatar
Sergeanur включено в состав коммита
851

erorcun's avatar
erorcun включено в состав коммита
852
	if (m_nNextTrack == m_nPlayingTrack) {
Sergeanur's avatar
Sergeanur включено в состав коммита
853
		ComputeAmbienceVol(FALSE, volume);
Sergeanur's avatar
Sergeanur включено в состав коммита
854
		SampleManager.SetStreamedVolumeAndPan(volume, 63, TRUE);
erorcun's avatar
erorcun включено в состав коммита
855
		if (m_bVerifyAmbienceTrackStartedToPlay) {
Sergeanur's avatar
Sergeanur включено в состав коммита
856
			if (SampleManager.IsStreamPlaying())
Sergeanur's avatar
Sergeanur включено в состав коммита
857
				m_bVerifyAmbienceTrackStartedToPlay = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
858
859
		} else ServiceTrack();
	} else {
erorcun's avatar
erorcun включено в состав коммита
860
		if (m_nPlayingTrack < TOTAL_STREAMED_SOUNDS) {
Sergeanur's avatar
Sergeanur включено в состав коммита
861
			m_aTracks[m_nPlayingTrack].m_nPosition = SampleManager.GetStreamedFilePosition();
erorcun's avatar
erorcun включено в состав коммита
862
			m_aTracks[m_nPlayingTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
863
			SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
864
		}
erorcun's avatar
erorcun включено в состав коммита
865
		uint32 pos = GetTrackStartPos(m_nNextTrack);
Sergeanur's avatar
Sergeanur включено в состав коммита
866
867
		SampleManager.SetStreamedVolumeAndPan(0, 63, TRUE);
		if (SampleManager.StartStreamedFile(m_nNextTrack, pos)) {
Sergeanur's avatar
Sergeanur включено в состав коммита
868
			ComputeAmbienceVol(TRUE, volume);
Sergeanur's avatar
Sergeanur включено в состав коммита
869
			SampleManager.SetStreamedVolumeAndPan(volume, 63, TRUE);
Sergeanur's avatar
Sergeanur включено в состав коммита
870
			m_bVerifyAmbienceTrackStartedToPlay = TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
871
		} else
erorcun's avatar
erorcun включено в состав коммита
872
			m_nNextTrack = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
873
	}
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
874
875
876
}

void
Sergeanur's avatar
Sergeanur включено в состав коммита
877
cMusicManager::ComputeAmbienceVol(bool8 reset, uint8 &outVolume)
Filip Gawin's avatar
audio7    
Filip Gawin включено в состав коммита
878
{
Sergeanur's avatar
Sergeanur включено в состав коммита
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
	static float fVol = 0.0f;

	if (reset)
		fVol = 0.0f;
	else if (fVol < 60.0f)
		fVol += 1.0f;

	if (TheCamera.DistanceToWater > 70.0f)
		outVolume = fVol;
	else if (TheCamera.DistanceToWater > 45.0f)
		outVolume = (TheCamera.DistanceToWater - 45.0f) / 25.0f * fVol;
	else if (TheCamera.DistanceToWater > 20.0f)
		outVolume = (45.0f - TheCamera.DistanceToWater) / 25.0f * fVol;
	else
		outVolume = fVol;
Filip Gawin's avatar
Filip Gawin включено в состав коммита
894
895
896
}

void
Sergeanur's avatar
Sergeanur включено в состав коммита
897
cMusicManager::ServiceTrack()
Filip Gawin's avatar
Filip Gawin включено в состав коммита
898
{
Sergeanur's avatar
Sergeanur включено в состав коммита
899
	if (m_bDoTrackService) {
Sergeanur's avatar
Sergeanur включено в состав коммита
900
901
		if (!SampleManager.IsStreamPlaying())
			SampleManager.StartStreamedFile(m_nNextTrack, 0);
Sergeanur's avatar
Sergeanur включено в состав коммита
902
	}
Filip Gawin's avatar
Filip Gawin включено в состав коммита
903
}
Sergeanur's avatar
Sergeanur включено в состав коммита
904

Sergeanur's avatar
Sergeanur включено в состав коммита
905
bool8
Sergeanur's avatar
Sergeanur включено в состав коммита
906
907
908
909
cMusicManager::ServiceAnnouncement()
{
	static int8 cCheck = 0;
	if (m_bAnnouncementInProgress) {
Sergeanur's avatar
Sergeanur включено в состав коммита
910
		if (!SampleManager.IsStreamPlaying()) {
Sergeanur's avatar
Sergeanur включено в состав коммита
911
			m_nAnnouncement = NO_TRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
912
			m_bAnnouncementInProgress = FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
913
		}
Sergeanur's avatar
Sergeanur включено в состав коммита
914
		return TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
915
916
917
918
	}

	if (++cCheck >= 30) {
		cCheck = 0;
Sergeanur's avatar
Sergeanur включено в состав коммита
919
920
		int pos = SampleManager.GetStreamedFilePosition();
		if (SampleManager.IsStreamPlaying()) {
erorcun's avatar
erorcun включено в состав коммита
921
922
923
			if (m_nNextTrack != NO_TRACK) {
				m_aTracks[m_nNextTrack].m_nPosition = pos;
				m_aTracks[m_nNextTrack].m_nLastPosCheckTimer = CTimer::GetTimeInMillisecondsPauseMode();
Sergeanur's avatar
Sergeanur включено в состав коммита
924
				SampleManager.StopStreamedFile();
Sergeanur's avatar
Sergeanur включено в состав коммита
925
926
927
			}
		}

Sergeanur's avatar
Sergeanur включено в состав коммита
928
929
930
		SampleManager.SetStreamedVolumeAndPan(0, 63, FALSE);
		if (SampleManager.StartStreamedFile(m_nAnnouncement, 0)) {
			SampleManager.SetStreamedVolumeAndPan(AudioManager.ShouldDuckMissionAudio() ? 25 : 100, 63, FALSE);
Sergeanur's avatar
Sergeanur включено в состав коммита
931
			m_bAnnouncementInProgress = TRUE;
erorcun's avatar
erorcun включено в состав коммита
932
933
			m_nPlayingTrack = m_nNextTrack;
			m_nNextTrack = m_nAnnouncement;
Sergeanur's avatar
Sergeanur включено в состав коммита
934
			return TRUE;
Sergeanur's avatar
Sergeanur включено в состав коммита
935
936
937
938
		}

		if (cCheck != 0) cCheck--;
		else cCheck = 30;
Sergeanur's avatar
Sergeanur включено в состав коммита
939
		return FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
940
941
	}

Sergeanur's avatar
Sergeanur включено в состав коммита
942
	return FALSE;
Sergeanur's avatar
Sergeanur включено в состав коммита
943
944
945
946
947
948
949
950
951
}

uint8
cMusicManager::GetCarTuning()
{
	CVehicle *veh = FindPlayerVehicle();
	if (veh == nil) return RADIO_OFF;
	if (UsesPoliceRadio(veh)) return POLICE_RADIO;
	if (veh->m_nRadioStation == USERTRACK && !SampleManager.IsMP3RadioChannelAvailable())
Sergeanur's avatar
Sergeanur включено в состав коммита
952
		veh->m_nRadioStation = AudioManager.m_anRandomTable[2] % USERTRACK;
Sergeanur's avatar
Sergeanur включено в состав коммита
953
954
955
956
957
958
959
960
961
962
	return veh->m_nRadioStation;
}

uint8
cMusicManager::GetNextCarTuning()
{
	CVehicle *veh = FindPlayerVehicle();
	if (veh == nil) return RADIO_OFF;
	if (UsesPoliceRadio(veh)) return POLICE_RADIO;
	if (gNumRetunePresses != 0) {
erorcun's avatar
erorcun включено в состав коммита
963
964
965
966
967
#ifdef RADIO_SCROLL_TO_PREV_STATION
		if (gNumRetunePresses < 0) {
			while (gNumRetunePresses < 0) {
				if(veh->m_nRadioStation == HEAD_RADIO) {
					veh->m_nRadioStation = RADIO_OFF;
erorcun's avatar
erorcun включено в состав коммита
968
				} else if(veh->m_nRadioStation == RADIO_OFF || veh->m_nRadioStation == NUM_RADIOS) {
erorcun's avatar
erorcun включено в состав коммита
969
970
971
972
973
974
975
976
					veh->m_nRadioStation = SampleManager.IsMP3RadioChannelAvailable() ? USERTRACK : USERTRACK - 1;
				} else
					veh->m_nRadioStation--;

				++gNumRetunePresses;
			}
		} else
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
977
978
		if (SampleManager.IsMP3RadioChannelAvailable()) {
			if (veh->m_nRadioStation == RADIO_OFF)
erorcun's avatar
erorcun включено в состав коммита
979
				veh->m_nRadioStation = NUM_RADIOS;
Sergeanur's avatar
Sergeanur включено в состав коммита
980
			veh->m_nRadioStation += gNumRetunePresses;
erorcun's avatar
erorcun включено в состав коммита
981
982
983
984
985
#ifdef FIX_BUGS
			while (veh->m_nRadioStation > NUM_RADIOS)
				veh->m_nRadioStation -= (NUM_RADIOS + 1);
#endif
			if (veh->m_nRadioStation == NUM_RADIOS)
Sergeanur's avatar
Sergeanur включено в состав коммита
986
				veh->m_nRadioStation = RADIO_OFF;
erorcun's avatar
erorcun включено в состав коммита
987
988
989
990
#ifndef FIX_BUGS
			else if (veh->m_nRadioStation > NUM_RADIOS)
				veh->m_nRadioStation -= (NUM_RADIOS + 1);
#endif
Sergeanur's avatar
Sergeanur включено в состав коммита
991
992
993
994
995
996
997
998
999
1000
		} else if (gNumRetunePresses + veh->m_nRadioStation >= USERTRACK) {
			while (gNumRetunePresses) {
				if (veh->m_nRadioStation == RADIO_OFF)
					veh->m_nRadioStation = HEAD_RADIO;
				else if (veh->m_nRadioStation < USERTRACK)
					++veh->m_nRadioStation;

				if (veh->m_nRadioStation == USERTRACK)
					veh->m_nRadioStation = RADIO_OFF;
				--gNumRetunePresses;
Для ускорения просмотра не вся история отображается Просмотреть всю вину