/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ // Filename : OMUSIC.CPP // Description : music #include #include #include #include #include // -------- define constant --------// // random select 2 - 8 for background music #define LOW_RANDOM_SONG 2 #define HIGH_RANDOM_SONG 8 // -------- define song name --------// #ifdef DEMO static char *music_file[] = { "DEMO.WAV", // opening "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", "DEMO.WAV", }; #else static char *music_file[] = { "WAR.WAV", // opening "NORMAN.WAV", "MAYA.WAV", "GREEK.WAV", "VIKING.WAV", "PERSIAN.WAV", "CHINESE.WAV", "JAPANESE.WAV", "WIN.WAV", "LOSE.WAV", }; #endif // -------- begin of function Music::Music ---------// Music::Music() { init_flag = 0; song_id = 0; music_channel = 0; } // -------- end of function Music::Music ---------// // -------- begin of function Music::~Music ---------// Music::~Music() { deinit(); } // -------- end of function Music::~Music ---------// // -------- begin of function Music::init ---------// // note : call Music::init after audio.init void Music::init() { deinit(); init_flag = audio.init_flag; } // -------- end of function Music::init ---------// // -------- begin of function Music::deinit ---------// // call deinit before audio.deinit void Music::deinit() { if( init_flag ) { stop(); } } // -------- end of function Music::deinit ---------// // -------- begin of function Music::stop ---------// int Music::stop() { if( init_flag ) { if(music_channel) { if( play_type & MUSIC_PLAY_CD ) { audio.stop_cd(); } else { if( play_type & MUSIC_PLAY_LOOPED ) audio.stop_loop_wav(music_channel); else audio.stop_long_wav(music_channel); } music_channel = 0; song_id = 0; } return 1; } else { return -1; } } // -------- end of function Music::stop ---------// // -------- begin of function Music::play ---------// // songId // playType 0 = non-looped, 1 = looped int Music::play(int songId, int playType) { if( !init_flag ) return 0; stop(); #ifdef BUNDLE // disable CD music playType &= ~MUSIC_CD_THEN_WAV & ~MUSIC_PLAY_CD; #endif if( playType & MUSIC_CD_THEN_WAV ) { return play(songId, playType & ~MUSIC_CD_THEN_WAV | MUSIC_PLAY_CD) || play(songId, playType & ~MUSIC_CD_THEN_WAV & ~MUSIC_PLAY_CD); } else if( playType & MUSIC_PLAY_CD ) { if( audio.cd_init_flag && audio.play_cd(songId +1, config.cd_music_volume) ) // skip the first data track { play_type = playType; song_id = songId; music_channel = 1; return 1; } return 0; } else { if( audio.wav_init_flag ) { String waveFileStr(DIR_MUSIC); waveFileStr += music_file[songId-1]; if( !DIR_MUSIC[0] || !m.is_file_exist(waveFileStr) || !audio.wav_init_flag ) return 0; if( playType & MUSIC_PLAY_LOOPED ) { AbsVolume absv(config.wav_music_volume,0); music_channel = audio.play_loop_wav(waveFileStr, 0, absv ); } else { AbsVolume absv(config.wav_music_volume,0); music_channel = audio.play_long_wav(waveFileStr, absv ); } play_type = playType; song_id = songId; return music_channel != 0; } return 0; } } // -------- end of function Music::play ---------// // -------- begin of function Music::is_playing ---------// // [int] songId id of the song (default=0, don't care) int Music::is_playing(int songId) { if( !init_flag ) return 0; if( !music_channel ) return 0; if( play_type & MUSIC_PLAY_CD ) { return audio.is_cd_playing() && (!songId || songId == song_id); } else { if( play_type & MUSIC_PLAY_LOOPED ) { return (!songId || songId == song_id); // loop wav always playing } else { return audio.is_long_wav_playing(music_channel) && (!songId || songId == song_id); } } return 0; } // -------- end of function Music::is_playing ---------// // -------- begin of function Music::max_song --------// // return no. of songs int Music::max_song() { return sizeof(music_file) / sizeof(char *); } // -------- end of function Music::max_song --------// // -------- begin of function Music::random_bgm_track --------// int Music::random_bgm_track(int excludeSong) { int s = LOW_RANDOM_SONG + m.get_time() % (HIGH_RANDOM_SONG - LOW_RANDOM_SONG + 1); if( s == excludeSong ) { // avoid selecting excludeSong if possible if( ++s > HIGH_RANDOM_SONG ) s = LOW_RANDOM_SONG; } err_when(s < 1 || s > max_song() ); return s; } // -------- end of function Music::random_bgm_track --------// // -------- begin of function Music::change_volume --------// void Music::change_volume(int vol) { if( !init_flag ) return; if( is_playing() ) { if( play_type & MUSIC_PLAY_CD ) { audio.set_cd_volume(vol); } else { AbsVolume absv(vol,0); audio.volume_long_wav(music_channel, DsVolume(absv)); } } } //-------- end of function Music::change_volume --------// //-------- begin of function Music::yield --------// void Music::yield() { if( !init_flag ) return; int oldSongId = song_id; if( config.music_flag ) { if( !is_playing() ) play(random_bgm_track(oldSongId), sys.cdrom_drive ? MUSIC_CD_THEN_WAV : 0 ); } else { stop(); // stop any music playing } } //-------- end of function Music::yield --------//