1 /*
2 Copyright (C) 2009-2021 Parallel Realities
3 
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8 
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 
13 See the GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18 */
19 
20 #include "../headers.h"
21 
22 #include "../map.h"
23 #include "../system/pak.h"
24 #include "music.h"
25 
26 extern Game game;
27 
28 static void playGameOverMusic(void);
29 
30 static Mix_Music *music;
31 static char musicName[MAX_VALUE_LENGTH];
32 static char *getSongName(char *, int);
33 
34 static char *oldMusicTracks[] = {
35 			"TITLE_MUSIC", "music/march13.it",
36 			"MAP01_MUSIC", "music/jk_village.xm",
37 			"MAP02_MUSIC", "music/cavesii.xm",
38 			"MAP03_MUSIC", "music/countryside.mod",
39 			"MAP04_MUSIC", "music/forbidden_zone.mod",
40 			"MAP05_MUSIC", "music/caverns_of_time.xm",
41 			"MAP06_MUSIC", "music/town4.xm",
42 			"MAP07_MUSIC", "music/exploring_new_worlds.xm",
43 			"MAP08_MUSIC", "music/aow-macabre.xm",
44 			"MAP09_MUSIC", "music/battle_of_the_fireflies.s3m",
45 			"MAP10_MUSIC", "music/technology.xm",
46 			"MAP11_MUSIC", "music/bookofshadows.xm",
47 			"MAP12_MUSIC", "music/cavesii.xm",
48 			"MAP13_MUSIC", "music/mystery.it",
49 			"MAP14_MUSIC", "NO_MUSIC",
50 			"MAP15_MUSIC", "music/cavern.it",
51 			"MAP16_MUSIC", "music/climax.it",
52 			"MAP17_MUSIC", "music/trapped.xm",
53 			"MAP18_MUSIC", "music/fb-snow.it",
54 			"MAP19_MUSIC", "music/book_of_desire_2.xm",
55 			"MAP20_MUSIC", "music/bj_unkow.s3m",
56 			"MAP21_MUSIC", "music/horror.it",
57 			"MAP22_MUSIC", "music/mystery.xm",
58 			"MAP23_MUSIC", "music/battle_cry.mod",
59 			"MAP24_MUSIC", "music/climax.it",
60 			"MAP25_MUSIC", "music/crypt.xm",
61 			"MAP26_MUSIC", "music/szc2_-_fight_for_your_lives.xm",
62 			"TUTORIAL_MUSIC", "music/jk_village.xm",
63 			"CREDITS_MUSIC", "music/credits.mod",
64 			"GAMEOVER_MUSIC", "music/oxide_-_sadness.xm",
65 			"BOSS_MUSIC", "music/terrortech_inc_.xm",
66 			"EVIL_EDGAR_MUSIC", "music/battle_for_life.xm",
67 			"SORCEROR_MUSIC", "music/dgt_enemy.it",
68 			"REUNION_MUSIC", "music/GSLINGER.MOD"
69 };
70 
71 static char *newMusicTracks[] = {
72 			"TITLE_MUSIC", "music/Menu_loop.ogg",
73 			"MAP01_MUSIC", "music/Lazy Day v0_9.ogg",
74 			"MAP02_MUSIC", "music/Ruinous Laments(5.6).ogg",
75 			"MAP03_MUSIC", "music/Danza del bosque.ogg",
76 			"MAP04_MUSIC", "music/Avgvst - Mushrooms_1.ogg",
77 			"MAP05_MUSIC", "music/MysticalCaverns.ogg",
78 			"MAP06_MUSIC", "music/Red Curtain.ogg",
79 			"MAP07_MUSIC", "music/ratsrats_0.ogg",
80 			"MAP08_MUSIC", "music/beauty_of_chaos.ogg",
81 			"MAP09_MUSIC", "music/Battle in the winter.ogg",
82 			"MAP10_MUSIC", "music/A tricky puzzle.ogg",
83 			"MAP11_MUSIC", "music/Decision.ogg",
84 			"MAP12_MUSIC", "music/Ruinous Laments(5.6).ogg",
85 			"MAP13_MUSIC", "music/Heroic Minority.ogg",
86 			"MAP14_MUSIC", "NO_MUSIC",
87 			"MAP15_MUSIC", "music/Mystical Theme.ogg",
88 			"MAP16_MUSIC", "music/Battle.ogg",
89 			"MAP17_MUSIC", "music/Szymon Matuszewski - Hope.ogg",
90 			"MAP18_MUSIC", "music/A wintertale_0.ogg",
91 			"MAP19_MUSIC", "music/MysticalCaverns.ogg",
92 			"MAP20_MUSIC", "music/Steeps of Destiny.ogg",
93 			"MAP21_MUSIC", "music/Medicine.ogg",
94 			"MAP22_MUSIC", "music/Decision.ogg",
95 			"MAP23_MUSIC", "music/Heroic Minority.ogg",
96 			"MAP24_MUSIC", "music/Battle.ogg",
97 			"MAP25_MUSIC", "music/Medicine.ogg",
98 			"MAP26_MUSIC", "music/Undead Rising.ogg",
99 			"TUTORIAL_MUSIC", "music/Lazy Day v0_9.ogg",
100 			"CREDITS_MUSIC", "music/Heroes Theme_0.ogg",
101 			"GAMEOVER_MUSIC", "music/Without.ogg",
102 			"BOSS_MUSIC", "music/So, let see, what you can_0.ogg",
103 			"EVIL_EDGAR_MUSIC", "music/So, let see, what you can_0.ogg",
104 			"SORCEROR_MUSIC", "music/Zander Noriega - Fight Them Until We Cant.ogg",
105 			"REUNION_MUSIC", "music/Lazy Day v0_9.ogg"
106 };
107 static int musicTracksLength = sizeof(newMusicTracks) / sizeof(char *);
108 
loadMusic(char * musicToLoad)109 void loadMusic(char *musicToLoad)
110 {
111 	char *name;
112 
113 	if (strcmpignorecase(musicName, musicToLoad) != 0)
114 	{
115 		STRNCPY(musicName, musicToLoad, MAX_VALUE_LENGTH);
116 	}
117 
118 	if (game.audio == FALSE || game.musicDefaultVolume == 0)
119 	{
120 		return;
121 	}
122 
123 	freeMusic();
124 
125 	name = getSongName(musicToLoad, 0);
126 
127 	if (name == NULL || strcmpignorecase(name, "NO_MUSIC") == 0)
128 	{
129 		return;
130 	}
131 
132 	music = loadMusicFromPak(name);
133 
134 	if (music != NULL)
135 	{
136 		return;
137 	}
138 
139 	name = getSongName(musicToLoad, 1);
140 
141 	if (name == NULL || strcmpignorecase(name, "NO_MUSIC") == 0)
142 	{
143 		return;
144 	}
145 
146 	music = loadMusicFromPak(name);
147 }
148 
freeMusic()149 void freeMusic()
150 {
151 	stopMusic();
152 
153 	if (music != NULL)
154 	{
155 		Mix_FreeMusic(music);
156 
157 		music = NULL;
158 	}
159 }
160 
playLoadedMusic()161 void playLoadedMusic()
162 {
163 	if (strcmpignorecase(musicName, "NO_MUSIC") == 0)
164 	{
165 		return;
166 	}
167 
168 	loadMusic(musicName);
169 
170 	Mix_PlayMusic(music, -1);
171 
172 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
173 }
174 
playMapMusic()175 void playMapMusic()
176 {
177 	loadMusic(getMapMusic());
178 
179 	Mix_PlayMusic(music, -1);
180 
181 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
182 
183 	Mix_ResumeMusic();
184 }
185 
stopMusic()186 void stopMusic()
187 {
188 	Mix_HaltMusic();
189 }
190 
fadeOutMusic(int time)191 void fadeOutMusic(int time)
192 {
193 	Mix_HookMusicFinished(NULL);
194 
195 	Mix_FadeOutMusic(time);
196 }
197 
fadeInMusic(int time)198 void fadeInMusic(int time)
199 {
200 	Mix_FadeInMusic(music, -1, time);
201 }
202 
pauseMusic(int pause)203 void pauseMusic(int pause)
204 {
205 	if (music != NULL)
206 	{
207 		if (pause == FALSE)
208 		{
209 			Mix_ResumeMusic();
210 		}
211 
212 		else
213 		{
214 			Mix_PauseMusic();
215 		}
216 	}
217 }
218 
updateMusicVolume()219 void updateMusicVolume()
220 {
221 	Mix_ResumeMusic();
222 
223 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
224 }
225 
playDefaultBossMusic()226 void playDefaultBossMusic()
227 {
228 	loadMusic("BOSS_MUSIC");
229 
230 	#if DEV == 1
231 	if (game.gameType == REPLAYING)
232 	{
233 		printf("%f BOSS_MUSIC\n", (float)game.frames / 60);
234 	}
235 	#endif
236 
237 	Mix_PlayMusic(music, -1);
238 
239 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
240 }
241 
playBossMusic(char * name)242 void playBossMusic(char *name)
243 {
244 	loadMusic(name);
245 
246 	#if DEV == 1
247 	if (game.gameType == REPLAYING)
248 	{
249 		printf("%f %s\n", (float)game.frames / 60, name);
250 	}
251 	#endif
252 
253 	Mix_PlayMusic(music, -1);
254 
255 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
256 }
257 
resumeMusic()258 void resumeMusic()
259 {
260 	Mix_HookMusicFinished(NULL);
261 
262 	playMapMusic();
263 }
264 
fadeBossMusic()265 void fadeBossMusic()
266 {
267 	fadeOutMusic(4000);
268 
269 	Mix_HookMusicFinished(resumeMusic);
270 }
271 
loadGameOverMusic()272 void loadGameOverMusic()
273 {
274 	fadeOutMusic(2000);
275 
276 	Mix_HookMusicFinished(playGameOverMusic);
277 }
278 
playGameOverMusic()279 static void playGameOverMusic()
280 {
281 	STRNCPY(musicName, "GAMEOVER_MUSIC", MAX_VALUE_LENGTH);
282 
283 	if (game.audio == FALSE || game.musicDefaultVolume == 0)
284 	{
285 		return;
286 	}
287 
288 	Mix_HookMusicFinished(NULL);
289 
290 	loadMusic("GAMEOVER_MUSIC");
291 
292 	Mix_PlayMusic(music, -1);
293 
294 	Mix_VolumeMusic(game.musicDefaultVolume * VOLUME_STEPS);
295 }
296 
getSongName(char * name,int oldSong)297 static char *getSongName(char *name, int oldSong)
298 {
299 	int i;
300 
301 	if (oldSong == 1)
302 	{
303 		for (i=0;i<musicTracksLength;i+=2)
304 		{
305 			if (strcmpignorecase(name, oldMusicTracks[i]) == 0)
306 			{
307 				return oldMusicTracks[i + 1];
308 			}
309 		}
310 	}
311 
312 	else
313 	{
314 		for (i=0;i<musicTracksLength;i+=2)
315 		{
316 			if (strcmpignorecase(name, newMusicTracks[i]) == 0)
317 			{
318 				return newMusicTracks[i + 1];
319 			}
320 		}
321 	}
322 
323 	printf("Could not match song: %s\n", name);
324 
325 	return NULL;
326 }
327