1 #include "Directories.h"
2 #include "Types.h"
3 #include "Music_Control.h"
4 #include "Random.h"
5 #include "GameScreen.h"
6 #include "JAScreens.h"
7 #include "Creature_Spreading.h"
8 #include "Timer_Control.h"
9 #include "StrategicMap.h"
10 #include "ContentMusic.h"
11 #include "Debug.h"
12 #include "ScreenIDs.h"
13 #include "Logger.h"
14 
15 #include "ContentManager.h"
16 #include "GameInstance.h"
17 
18 static UINT32  uiMusicHandle   = NO_SAMPLE;
19 static UINT32  uiMusicVolume   = 50;
20 static BOOLEAN fMusicPlaying   = FALSE;
21 static BOOLEAN fMusicFadingOut = FALSE;
22 static BOOLEAN fMusicFadingIn  = FALSE;
23 
24 static BOOLEAN gfMusicEnded = FALSE;
25 
26 MusicMode        gubMusicMode    = MUSIC_NONE;
27 static MusicMode gubOldMusicMode = MUSIC_NONE;
28 
29 static INT8 gbVictorySongCount = 0;
30 static INT8 gbDeathSongCount   = 0;
31 
32 static INT8 gbFadeSpeed = 1;
33 
34 
35 BOOLEAN        gfForceMusicToTense = FALSE;
36 static BOOLEAN gfDontRestartSong   = FALSE;
37 
38 
39 static BOOLEAN MusicFadeIn(void);
40 static void MusicStop(void);
41 static void MusicStopCallback(void* pData);
42 
43 
MusicPlay(const ST::string * pFilename)44 void MusicPlay(const ST::string* pFilename)
45 {
46 	MusicStop();
47 
48 	uiMusicHandle = SoundPlay(pFilename->c_str(), 0, 64, 1, MusicStopCallback, NULL);
49 
50 	if(uiMusicHandle!=SOUND_ERROR)
51 	{
52 		SLOGD("Music Play %d %d", uiMusicHandle, gubMusicMode);
53 
54 		gfMusicEnded	= FALSE;
55 		fMusicPlaying	= TRUE;
56 		MusicFadeIn();
57 		return;
58 	}
59 
60 	SLOGE("Music Play Error %d %d", uiMusicHandle, gubMusicMode);
61 }
62 
63 
64 static void StartMusicBasedOnMode(void);
65 
66 
MusicSetVolume(UINT32 uiVolume)67 void MusicSetVolume(UINT32 uiVolume)
68 {
69 	INT32 uiOldMusicVolume = uiMusicVolume;
70 
71 	uiMusicVolume = __min(uiVolume, MAXVOLUME);
72 
73 	if(uiMusicHandle!=NO_SAMPLE)
74 	{
75 		// get volume and if 0 stop music!
76 		if ( uiMusicVolume == 0 )
77 		{
78 			gfDontRestartSong = TRUE;
79 			MusicStop( );
80 		}
81 		else
82 		{
83 			SoundSetVolume(uiMusicHandle, uiMusicVolume);
84 		}
85 	}
86 	else
87 	{
88 		// If here, check if we need to re-start music
89 		// Have we re-started?
90 		if ( uiMusicVolume > 0 && uiOldMusicVolume == 0 )
91 		{
92 			StartMusicBasedOnMode( );
93 		}
94 	}
95 }
96 
97 
98 //********************************************************************************
99 // MusicGetVolume
100 //
101 //		Gets the volume on the currently playing music.
102 //
103 //	Returns:	TRUE if the volume was set, FALSE if an error occurred
104 //
105 //********************************************************************************
MusicGetVolume(void)106 UINT32 MusicGetVolume(void)
107 {
108 		return(uiMusicVolume);
109 }
110 
111 
112 //		Stops the currently playing music.
MusicStop(void)113 static void MusicStop(void)
114 {
115 	SLOGD("Music Stop %d %d %d", fMusicPlaying, uiMusicHandle, gubMusicMode);
116 	if(!fMusicPlaying)
117 	{
118 		return;
119 	}
120 
121 	if(uiMusicHandle!=NO_SAMPLE)
122 	{
123 		SoundStop(uiMusicHandle);
124 		uiMusicHandle = NO_SAMPLE;
125 	}
126 	else if(!gfMusicEnded)
127 	{
128 		SLOGW("expected either music data or the end of the music (mode=%d, handle=%d, ended=%d)", gubMusicMode, uiMusicHandle, gfMusicEnded);
129 	}
130 	fMusicPlaying = FALSE;
131 }
132 
133 
134 //		Fades out the current song.
135 //
136 //	Returns:	TRUE if the music has begun fading, FALSE if an error occurred
MusicFadeOut(void)137 static BOOLEAN MusicFadeOut(void)
138 {
139 	if(uiMusicHandle!=NO_SAMPLE)
140 	{
141 		fMusicFadingOut=TRUE;
142 		return(TRUE);
143 	}
144 	return(FALSE);
145 }
146 
147 
148 //		Fades in the current song.
149 //
150 //	Returns:	TRUE if the music has begun fading in, FALSE if an error occurred
MusicFadeIn(void)151 static BOOLEAN MusicFadeIn(void)
152 {
153 	if(uiMusicHandle!=NO_SAMPLE)
154 	{
155 		fMusicFadingIn=TRUE;
156 		return(TRUE);
157 	}
158 	return(FALSE);
159 }
160 
MusicPoll(void)161 void MusicPoll(void)
162 {
163 	INT32 iVol;
164 
165 	SoundServiceStreams();
166 	SoundServiceRandom();
167 
168 	// Handle Sound every sound overhead time....
169 	if ( COUNTERDONE( MUSICOVERHEAD )  )
170 	{
171 		// Reset counter
172 		RESETCOUNTER( MUSICOVERHEAD );
173 
174 		if(fMusicFadingIn)
175 		{
176 			if(uiMusicHandle!=NO_SAMPLE)
177 			{
178 				iVol=SoundGetVolume(uiMusicHandle);
179 				iVol=__min( (INT32)uiMusicVolume, iVol+gbFadeSpeed );
180 				SoundSetVolume(uiMusicHandle, iVol);
181 				if(iVol==(INT32)uiMusicVolume)
182 				{
183 					fMusicFadingIn=FALSE;
184 					gbFadeSpeed = 1;
185 				}
186 			}
187 		}
188 		else if(fMusicFadingOut)
189 		{
190 			if(uiMusicHandle!=NO_SAMPLE)
191 			{
192 				iVol=SoundGetVolume(uiMusicHandle);
193 				iVol=(iVol >=1)? iVol-gbFadeSpeed : 0;
194 
195 				iVol=__max( (INT32)iVol, 0 );
196 
197 				SoundSetVolume(uiMusicHandle, iVol);
198 				if(iVol==0)
199 				{
200 					MusicStop();
201 					fMusicFadingOut=FALSE;
202 					gbFadeSpeed = 1;
203 				}
204 			}
205 		}
206 
207 	//#endif
208 
209 		if ( gfMusicEnded )
210 		{
211 			// OK, based on our music mode, play another!
212 			SLOGD("Music End Loop %d %d", uiMusicHandle, gubMusicMode);
213 
214 			// If we were in victory mode, change!
215 			if ( gbVictorySongCount == 1 || gbDeathSongCount == 1 )
216 			{
217 				if ( gbDeathSongCount == 1 && guiCurrentScreen == GAME_SCREEN )
218 				{
219 					CheckAndHandleUnloadingOfCurrentWorld();
220 				}
221 
222 				if ( gbVictorySongCount == 1 )
223 				{
224 						SetMusicMode( MUSIC_TACTICAL_NOTHING );
225 				}
226 			}
227 			else
228 			{
229 				if ( !gfDontRestartSong )
230 				{
231 					StartMusicBasedOnMode( );
232 				}
233 			}
234 
235 			gfMusicEnded = FALSE;
236 			gfDontRestartSong = FALSE;
237 		}
238 	}
239 }
240 
241 
SetMusicMode(MusicMode ubMusicMode)242 void SetMusicMode(MusicMode ubMusicMode)
243 {
244 	static MusicMode bPreviousMode = MUSIC_NONE;
245 
246 
247 	// OK, check if we want to restore
248 	if ( ubMusicMode == MUSIC_RESTORE )
249 	{
250 		if ( bPreviousMode == MUSIC_TACTICAL_VICTORY || bPreviousMode == MUSIC_TACTICAL_DEFEAT )
251 		{
252 			bPreviousMode = MUSIC_TACTICAL_NOTHING;
253 		}
254 
255 		ubMusicMode = bPreviousMode;
256 	}
257 	else
258 	{
259 		// Save previous mode...
260 		bPreviousMode = gubOldMusicMode;
261 	}
262 
263 	// if different, start a new music song
264 	if ( gubOldMusicMode != ubMusicMode )
265 	{
266 		// Set mode....
267 		gubMusicMode = ubMusicMode;
268 
269 		SLOGD("Music New Mode %d %d", uiMusicHandle, gubMusicMode);
270 
271 		gbVictorySongCount = 0;
272 		gbDeathSongCount = 0;
273 
274 		if(uiMusicHandle!=NO_SAMPLE  )
275 		{
276 			// Fade out old music
277 			MusicFadeOut( );
278 		}
279 		else
280 		{
281 			// Change music!
282 			StartMusicBasedOnMode( );
283 		}
284 
285 	}
286 	gubOldMusicMode = gubMusicMode;
287 }
288 
289 
StartMusicBasedOnMode(void)290 static void StartMusicBasedOnMode(void)
291 {
292 	SLOGD("StartMusicBasedOnMode() %d %d", uiMusicHandle, gubMusicMode);
293 	MusicMode next = gubMusicMode;
294 
295 	switch (gubMusicMode) {
296 		case MUSIC_TACTICAL_NOTHING:
297 			if (gfUseCreatureMusic) {
298 				next = MUSIC_TACTICAL_CREATURE_NOTHING;
299 			}
300 			break;
301 		case MUSIC_TACTICAL_ENEMYPRESENT:
302 			if (gfUseCreatureMusic) {
303 				next = MUSIC_TACTICAL_CREATURE_ENEMYPRESENT;
304 			}
305 			break;
306 		case MUSIC_TACTICAL_BATTLE:
307 			if (gfUseCreatureMusic) {
308 				next = MUSIC_TACTICAL_CREATURE_BATTLE;
309 			}
310 			break;
311 		default: // ignore other modes
312 			break;
313 	}
314 
315 	switch (gubMusicMode) {
316 		case MUSIC_TACTICAL_VICTORY:
317 			gbVictorySongCount++;
318 			if( gfUseCreatureMusic && !gbWorldSectorZ ) {
319 				//We just killed all the creatures that just attacked the town.
320 				gfUseCreatureMusic = FALSE;
321 			}
322 			break;
323 		case MUSIC_TACTICAL_DEFEAT:
324 			gbDeathSongCount++;
325 			break;
326 		default: // ignore other modes
327 			break;
328 	}
329 
330 	switch (gubMusicMode) {
331 		case MUSIC_MAIN_MENU:
332 		case MUSIC_LAPTOP:
333 		case MUSIC_TACTICAL_NOTHING:
334 		case MUSIC_TACTICAL_ENEMYPRESENT:
335 		case MUSIC_TACTICAL_BATTLE:
336 		case MUSIC_TACTICAL_CREATURE_NOTHING:
337 		case MUSIC_TACTICAL_CREATURE_ENEMYPRESENT:
338 		case MUSIC_TACTICAL_CREATURE_BATTLE:
339 		case MUSIC_TACTICAL_VICTORY:
340 		case MUSIC_TACTICAL_DEFEAT:
341 			// ATE: Don't fade in
342 			gbFadeSpeed = (INT8)uiMusicVolume;
343 			MusicPlay( GCM->getMusicForMode(next) );
344 			break;
345 		default:
346 			MusicFadeOut();
347 	}
348 }
349 
350 
MusicStopCallback(void * pData)351 static void MusicStopCallback(void* pData)
352 {
353 	SLOGD("Music EndCallback %d %d", uiMusicHandle, gubMusicMode);
354 
355 	gfMusicEnded  = TRUE;
356 	uiMusicHandle = NO_SAMPLE;
357 }
358 
359 
SetMusicFadeSpeed(INT8 bFadeSpeed)360 void SetMusicFadeSpeed( INT8 bFadeSpeed )
361 {
362 	gbFadeSpeed = bFadeSpeed;
363 }
364