diff --git a/audio/Audio.cc b/audio/Audio.cc index ba13da941..532bc1de9 100644 --- a/audio/Audio.cc +++ b/audio/Audio.cc @@ -539,55 +539,6 @@ bool Audio::start_music( return false; } -void Audio::start_music_combat(Combat_song song, bool continuous) { -#ifdef DEBUG - cout << formatTicks() << "Audio subsystem request: Combat Music start " - << int(song) << endl; -#endif - if (!audio_enabled || !music_enabled || !mixer || !mixer->getMidiPlayer()) { - return; - } - - int num = -1; - - switch (song) { - case CSBattle_Over: - num = Audio::game_music(9); - break; - - case CSAttacked1: - num = Audio::game_music(11); - break; - - case CSAttacked2: - num = Audio::game_music(12); - break; - - case CSVictory: - num = Audio::game_music(15); - break; - - case CSRun_Away: - num = Audio::game_music(16); - break; - - case CSDanger: - num = Audio::game_music(10); - break; - - case CSHidden_Danger: - num = Audio::game_music(18); - break; - - default: - CERR("Error: Unable to Find combat track for song " << song << "."); - break; - } - - mixer->getMidiPlayer()->start_music( - num, continuous && music_looping != LoopingType::Never); -} - void Audio::stop_music() { #ifdef DEBUG cout << formatTicks() << "Audio subsystem request: Music stop" << endl; diff --git a/audio/Audio.h b/audio/Audio.h index 6f9ea5371..3a02d9e12 100644 --- a/audio/Audio.h +++ b/audio/Audio.h @@ -54,19 +54,6 @@ class Tile_coord; #define MAX_SOUND_FALLOFF 24 -/* - * Music: - */ -enum Combat_song { - CSBattle_Over, - CSAttacked1, - CSAttacked2, - CSVictory, - CSRun_Away, - CSDanger, - CSHidden_Danger -}; - /* * This is a resource-management class for SFX. Maybe make it a * template class and use for other resources also? @@ -167,7 +154,6 @@ class Audio : nonreplicatable { bool start_music( const std::string& fname, int num, bool continuous = false, MyMidiPlayer::ForceType force = MyMidiPlayer::Force_None); - void start_music_combat(Combat_song song, bool continuous); void stop_music(); int play_sound_effect( int num, int volume = AUDIO_MAX_VOLUME, int balance = 0, diff --git a/combat.cc b/combat.cc index 320c4e67a..61182ee7d 100644 --- a/combat.cc +++ b/combat.cc @@ -93,6 +93,65 @@ bool In_ammo_family(int shnum, int family) { return ainf != nullptr && ainf->get_family_shape() == family; } +/* + * Start music for combat. + * If continuous is true, the music will not be stopped when combat ends. + */ + +void Combat_schedule::start_music_combat(Combat_song song, bool continuous) { +#ifdef DEBUG + cout << "Audio subsystem request: Combat Music start " << int(song) << endl; +#endif + if (!Audio::get_ptr()) { + return; + } + + int num = -1; + + switch (song) { + case CSBattle_Over: + num = Audio::game_music(9); + break; + + case CSAttacked1: + num = Audio::game_music(11); + break; + + case CSAttacked2: + num = Audio::game_music(12); + break; + + case CSVictory: + num = Audio::game_music(15); + break; + + case CSRun_Away: + num = Audio::game_music(16); + break; + + case CSDanger: + num = Audio::game_music(10); + break; + + case CSHidden_Danger: + // ++++ FIXME: This should play when the party successfully flees either + // in or out combat. + num = Audio::game_music(18); + break; + + case CSAvatar_died: + // ++++ FIXME: This should play when the Avatar dies in combat. + num = Audio::game_music(17); + break; + + default: + CERR("Error: Unable to Find combat track for song " << song << "."); + return; // Unknown song + } + + Audio::get_ptr()->start_music(num, continuous); +} + /* * Start music if battle has recently started. */ @@ -111,8 +170,7 @@ void Combat_schedule::start_battle() { Game_object* target = npc->get_target(); if (npc == gwin->get_main_actor() && curtime - battle_time >= 30000 && (!opponents.empty() || (target && target->as_actor()))) { - Audio::get_ptr()->start_music_combat( - (rand() % 2) ? CSAttacked1 : CSAttacked2, false); + start_music_combat((rand() % 2) ? CSAttacked1 : CSAttacked2, false); battle_time = curtime; battle_end_time = curtime - 1; } @@ -141,8 +199,7 @@ void Combat_schedule::monster_died() { // Figure #seconds battle lasted. const unsigned long len = (battle_end_time - battle_time) / 1000; const bool hard = len > 15u && (rand() % 60u < len); - Audio::get_ptr()->start_music_combat( - hard ? CSBattle_Over : CSVictory, false); + start_music_combat(hard ? CSBattle_Over : CSVictory, false); } /* @@ -1752,7 +1809,7 @@ void Combat_schedule::ending(int /* newtype */ } } if (found) { - Audio::get_ptr()->start_music_combat(CSRun_Away, false); + start_music_combat(CSRun_Away, false); } } } diff --git a/combat.h b/combat.h index 356ebf78b..41a1370d0 100644 --- a/combat.h +++ b/combat.h @@ -29,6 +29,20 @@ class Actor; class Game_object; class Spellbook_object; +/* + * Combat Music: + */ +enum Combat_song { + CSBattle_Over, + CSAttacked1, + CSAttacked2, + CSVictory, + CSRun_Away, + CSDanger, + CSHidden_Danger, + CSAvatar_died +}; + /* * Combat schedule: */ @@ -100,6 +114,7 @@ class Combat_schedule : public Schedule { static void stop_attacking_invisible(Game_object* npc); void now_what() override; // Npc calls this when it's done void im_dormant() override; // Npc calls this when it goes dormant. + static void start_music_combat(Combat_song song, bool continuous); void ending(int newtype) override; // Switching to another schedule. void set_weapon(bool removed = false) override; // Set weapon info. void set_hand_to_hand();