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