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