From c8b17da61c84c57516025b5d250885bceee343d6 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Fri, 6 May 2005 03:09:53 +0000 Subject: Auto detect music and voice types, where possible. Use correct set of MIDI tracks for MT32 in Simon the Sorcerer 2. svn-id: r17925 --- simon/intern.h | 29 +++++++++--------- simon/simon.cpp | 93 +++++++++++++++++++++++++++++++-------------------------- simon/sound.cpp | 28 +++++++++-------- simon/vga.cpp | 2 +- 4 files changed, 83 insertions(+), 69 deletions(-) diff --git a/simon/intern.h b/simon/intern.h index 04d579e4c0..1d919eb188 100644 --- a/simon/intern.h +++ b/simon/intern.h @@ -149,26 +149,27 @@ struct GameSpecificSettings { } // End of namespace Simon enum { - GF_SIMON2 = 1 << 0, - GF_WIN = 1 << 1, - GF_TALKIE = 1 << 2, - GF_DEMO = 1 << 3, - GF_AMIGA = 1 << 4, - GF_ACORN = 1 << 5, - GF_OLD_BUNDLE = 1 << 6 + GF_SIMON1 = 1 << 0, + GF_SIMON2 = 1 << 1, + GF_WIN = 1 << 2, + GF_TALKIE = 1 << 3, + GF_DEMO = 1 << 4, + GF_AMIGA = 1 << 5, + GF_ACORN = 1 << 6, + GF_OLD_BUNDLE = 1 << 7 }; enum { - GAME_SIMON1DOS = GF_OLD_BUNDLE, + GAME_SIMON1DOS = GF_SIMON1 | GF_OLD_BUNDLE, GAME_SIMON2DOS = GF_SIMON2, - GAME_SIMON1TALKIE = GF_TALKIE, + GAME_SIMON1TALKIE = GF_SIMON1 | GF_TALKIE, GAME_SIMON2TALKIE = GF_SIMON2 | GF_TALKIE, - GAME_SIMON1WIN = GF_WIN | GF_TALKIE, + GAME_SIMON1WIN = GF_SIMON1 | GF_WIN | GF_TALKIE, GAME_SIMON2WIN = GF_SIMON2 | GF_WIN | GF_TALKIE, - GAME_SIMON1DEMO = GF_DEMO | GF_OLD_BUNDLE, - GAME_SIMON1AMIGA = GF_AMIGA | GF_OLD_BUNDLE, - GAME_SIMON1CD32 = GF_TALKIE | GF_AMIGA | GF_OLD_BUNDLE, - GAME_SIMON1ACORN = GF_TALKIE | GF_ACORN + GAME_SIMON1DEMO = GF_SIMON1 | GF_DEMO | GF_OLD_BUNDLE, + GAME_SIMON1AMIGA = GF_SIMON1 | GF_AMIGA | GF_OLD_BUNDLE, + GAME_SIMON1CD32 = GF_SIMON1 | GF_TALKIE | GF_AMIGA | GF_OLD_BUNDLE, + GAME_SIMON1ACORN = GF_SIMON1 | GF_TALKIE | GF_ACORN }; #endif diff --git a/simon/simon.cpp b/simon/simon.cpp index 42c5d33666..a08415b08b 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -345,7 +345,8 @@ SimonEngine::SimonEngine(GameDetector *detector, OSystem *syst) VGA_MEM_SIZE = gVars->memory[kMemSimon2Games]; #endif TABLES_MEM_SIZE = 100000; - if ((_game & GF_SIMON2) && ConfMan.getBool("native_mt32")) + // Check whether to use MT-32 MIDI tracks in Simon the Sorcerer 2 + if ((_game & GF_SIMON2) && (ConfMan.getBool("native_mt32") || (_midiDriver == MD_MT32))) MUSIC_INDEX_BASE = (1128 + 612) / 4; else MUSIC_INDEX_BASE = 1128 / 4; @@ -4152,60 +4153,68 @@ void SimonEngine::delay(uint amount) { } void SimonEngine::loadMusic (uint music) { - if (_game & GF_SIMON2) { // Simon 2 music + char buf[4]; + + if (_game & GF_AMIGA) { + if (_game != GAME_SIMON1CD32) { + // TODO Add support for decruncher + debug(5,"loadMusic - Decrunch %dtune attempt", music); + } + // TODO Add Protracker support for simon1amiga/cd32 + debug(5,"playMusic - Load %dtune attempt", music); + } else if (_game & GF_SIMON2) { // Simon 2 music midi.stop(); _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music - 1], SEEK_SET); - if (_game & GF_WIN && !(ConfMan.getBool("native_mt32") && (_midiDriver != MD_MT32))) { - midi.loadMultipleSMF (_game_file); - } else { + _game_file->read(buf, 4); + if (!memcmp(buf, "FORM", 4)) { + _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music - 1], SEEK_SET); midi.loadXMIDI (_game_file); + } else { + _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music - 1], SEEK_SET); + midi.loadMultipleSMF (_game_file); } _last_music_played = music; _next_music_to_play = -1; - } else { // Simon 1 music - if (_game & GF_AMIGA) { - if (_game != GAME_SIMON1CD32) { - // TODO Add support for decruncher - debug(5,"loadMusic - Decrunch %dtune attempt", music); - } - // TODO Add Protracker support for simon1amiga/cd32 - debug(5,"playMusic - Load %dtune attempt", music); - } else { - midi.stop(); - midi.setLoop (true); // Must do this BEFORE loading music. (GMF may have its own override.) - - if (_game & GF_WIN) { - // FIXME: The very last music resource, a cymbal crash for when the - // two demons crash into each other, should NOT be looped like the - // other music tracks. In simon1dos/talkie the GMF resource includes - // a loop override that acomplishes this, but there seems to be nothing - // for this in the SMF resources. - if (music == 35) - midi.setLoop (false); - - _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music], SEEK_SET); - midi.loadMultipleSMF (_game_file); - } else if (_game & GF_TALKIE) { + } else if (_game & GF_SIMON1) { // Simon 1 music + midi.stop(); + midi.setLoop (true); // Must do this BEFORE loading music. (GMF may have its own override.) + + if (_game & GF_TALKIE) { + // FIXME: The very last music resource, a cymbal crash for when the + // two demons crash into each other, should NOT be looped like the + // other music tracks. In simon1dos/talkie the GMF resource includes + // a loop override that acomplishes this, but there seems to be nothing + // for this in the SMF resources. + if (music == 35) + midi.setLoop (false); + + _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music], SEEK_SET); + _game_file->read(buf, 4); + if (!memcmp(buf, "GMF\x1", 4)) { _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music], SEEK_SET); midi.loadSMF (_game_file, music); } else { - char buf[15]; - File f; - sprintf(buf, "MOD%d.MUS", music); - f.open(buf); - if (f.isOpen() == false) { - warning("Can't load music from '%s'", buf); - return; - } - if (_game & GF_DEMO) - midi.loadS1D (&f); - else - midi.loadSMF (&f, music); + _game_file->seek(_game_offsets_ptr[MUSIC_INDEX_BASE + music], SEEK_SET); + midi.loadMultipleSMF (_game_file); } - midi.startTrack (0); + } else { + char filename[15]; + File f; + sprintf(filename, "MOD%d.MUS", music); + f.open(filename); + if (f.isOpen() == false) { + warning("Can't load music from '%s'", filename); + return; + } + if (_game & GF_DEMO) + midi.loadS1D (&f); + else + midi.loadSMF (&f, music); } + + midi.startTrack (0); } } diff --git a/simon/sound.cpp b/simon/sound.cpp index 93dc9fddf9..2ccea96f05 100644 --- a/simon/sound.cpp +++ b/simon/sound.cpp @@ -244,6 +244,11 @@ Sound::Sound(const byte game, const GameSpecificSettings *gss, SoundMixer *mixer _voice_file = false; _ambient_playing = 0; + if (_game == GAME_SIMON1CD32) { + // Uses separate voice files + return; + } + File *file = new File(); const char *s; @@ -274,7 +279,7 @@ Sound::Sound(const byte game, const GameSpecificSettings *gss, SoundMixer *mixer } } #endif - if (!_voice) { + if (!_voice && (_game & GF_SIMON2)) { // for simon2 mac/amiga, only read index file file->open("voices.idx"); if (file->isOpen() == true) { @@ -287,27 +292,26 @@ Sound::Sound(const byte game, const GameSpecificSettings *gss, SoundMixer *mixer for (int i = 1; i <= end / 6; i++) { _filenums[i] = file->readUint16BE(); _offsets[i] = file->readUint32BE(); - } - _voice_file = true; - delete file; - } else if (_game & GF_WIN) { + } + _voice_file = true; + delete file; + } + if (!_voice && gss->wav_filename && gss->wav_filename[0]) { s = gss->wav_filename; file->open(s); if (file->isOpen() == false) { - warning("Can't open voice file %s", s); + debug(0, "Can't open voice file %s", s); delete file; } else { _voice_file = true; _voice = new WavSound(_mixer, file); } - } else if (_game == GAME_SIMON1CD32) { - // simon1cd32 uses separate voice files - return; - } else if (_game & GF_TALKIE) { + } + if (!_voice && gss->voc_filename && gss->voc_filename[0]) { s = gss->voc_filename; file->open(s); if (file->isOpen() == false) { - warning("Can't open voice file %s", s); + debug(0, "Can't open voice file %s", s); delete file; } else { _voice_file = true; @@ -316,7 +320,7 @@ Sound::Sound(const byte game, const GameSpecificSettings *gss, SoundMixer *mixer } } - if (_game == GAME_SIMON1ACORN || _game == GAME_SIMON1TALKIE) { + if ((_game & GF_SIMON1) && (_game & GF_TALKIE)) { file = new File(); #ifdef USE_MAD if (!_effects && gss->mp3_effects_filename && gss->mp3_effects_filename[0]) { diff --git a/simon/vga.cpp b/simon/vga.cpp index 3f2e44a6c4..f5925fe46b 100644 --- a/simon/vga.cpp +++ b/simon/vga.cpp @@ -1024,7 +1024,7 @@ void SimonEngine::vc_12_delay() { // Work around to allow inventory arrows to be // shown in some versions of Simon the Sorcerer 1 - if (!(_game & GF_SIMON2) && !(_game & GF_WIN) && vsp->id == 0x80) + if ((_game & GF_SIMON1) && vsp->id == 0x80) num = 0; else num += VGA_DELAY_BASE; -- cgit v1.2.3