diff options
author | Travis Howell | 2003-01-03 12:06:30 +0000 |
---|---|---|
committer | Travis Howell | 2003-01-03 12:06:30 +0000 |
commit | 3a4782f16656c180b48be4afa1270a7ec351ed72 (patch) | |
tree | 063280408ebd9536376aae69d6f2e7a9108a96ab | |
parent | f1365f4f2b861ecfed42dea4b534ee14eca245ac (diff) | |
download | scummvm-rg350-3a4782f16656c180b48be4afa1270a7ec351ed72.tar.gz scummvm-rg350-3a4782f16656c180b48be4afa1270a7ec351ed72.tar.bz2 scummvm-rg350-3a4782f16656c180b48be4afa1270a7ec351ed72.zip |
Add olki's patch for sound effects in simon1dos
Plus hack to allow choice between midi music and sound effects via 's' key
svn-id: r6326
-rw-r--r-- | simon/items.cpp | 7 | ||||
-rw-r--r-- | simon/midi.cpp | 23 | ||||
-rw-r--r-- | simon/midi.h | 6 | ||||
-rw-r--r-- | simon/simon.cpp | 55 | ||||
-rw-r--r-- | simon/simon.h | 7 | ||||
-rw-r--r-- | simon/vga.cpp | 4 |
6 files changed, 91 insertions, 11 deletions
diff --git a/simon/items.cpp b/simon/items.cpp index c9903d6e68..8cd5ff67df 100644 --- a/simon/items.cpp +++ b/simon/items.cpp @@ -1045,7 +1045,7 @@ int SimonState::runScript() case 185:{ if (_game & GAME_SIMON2) goto invalid_opcode; - getVarOrWord(); + _midi_sfx = getVarOrWord(); } break; @@ -1527,7 +1527,10 @@ void SimonState::o_unk_120(uint a) void SimonState::o_unk_163(uint a) { - _sound->playEffects(a); + if (_game == GAME_SIMON1DOS) + playSting(a); + else + _sound->playEffects(a); } void SimonState::o_unk_160(uint a) diff --git a/simon/midi.cpp b/simon/midi.cpp index ad9c7d24f8..306cbca6ee 100644 --- a/simon/midi.cpp +++ b/simon/midi.cpp @@ -61,7 +61,16 @@ void MidiPlayer::read_all_songs_old(File *in, uint music) } } -void MidiPlayer::read_mthd(File *in, Song *s, bool old, uint music) +void MidiPlayer::read_all_songs_old(File *in, uint music, uint16 size) +{ + _currentSong = _songs; + + _lastDelay = 0; + + read_one_song(in, &_songs[0], music, size); +} + +void MidiPlayer::read_mthd(File *in, Song *s, bool old, uint music, uint16 size) { Track *t; uint i; @@ -98,6 +107,9 @@ void MidiPlayer::read_mthd(File *in, Song *s, bool old, uint music) 6570, 5384, 8909, 6457, 16321, 2742, 8968, 4804, 8442, 7717, 9444, 5800, 1381, 5660, 6684, 2456, 4744, 2455, 1177, 1232, 17256, 5103, 8794, 4884, 16}; + if (size) + t->data_size = size - 8; + else t->data_size = music_data_size[music] - 8; } @@ -123,7 +135,7 @@ void MidiPlayer::read_mthd(File *in, Song *s, bool old, uint music) } } -void MidiPlayer::read_one_song(File *in, Song *s, uint music) +void MidiPlayer::read_one_song(File *in, Song *s, uint music, uint16 size) { _lastDelay = 0; @@ -136,11 +148,11 @@ void MidiPlayer::read_one_song(File *in, Song *s, uint music) switch (id) { case 'MThd': - read_mthd(in, s, false, music); + read_mthd(in, s, false, music, size); break; case 'GMF\x1': - read_mthd(in, s, true, music); + read_mthd(in, s, true, music, size); break; default: @@ -281,6 +293,9 @@ bool MidiPlayer::fill_helper(NoteRec *nr, MidiEvent *me) void MidiPlayer::reset_tracks() { + if (_midi_sfx_toggle) + return; + Track *t; uint i; diff --git a/simon/midi.h b/simon/midi.h index 9b3cfc7a6a..d3ab7bd1fd 100644 --- a/simon/midi.h +++ b/simon/midi.h @@ -31,7 +31,9 @@ class MidiPlayer { public: MidiPlayer(); + bool _midi_sfx_toggle; void read_all_songs (File *in, uint music); + void read_all_songs_old (File *in, uint music, uint16 size); void read_all_songs_old (File *in, uint music); void initialize(); void shutdown(); @@ -76,9 +78,9 @@ private: byte _masterVolume; // 0-255 bool _paused; - void read_mthd(File *in, Song *s, bool old, uint music); + void read_mthd(File *in, Song *s, bool old, uint music, uint16 size); - void read_one_song(File *in, Song *s, uint music); + void read_one_song(File *in, Song *s, uint music, uint16 size = 0); static uint32 track_read_gamma(Track *t); static byte track_read_byte(Track *t); diff --git a/simon/simon.cpp b/simon/simon.cpp index e1b3325e06..b91b907f0a 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -806,7 +806,7 @@ void SimonState::loadTablesIntoMem(uint subr_id) closeTablesFile(in); memcpy(filename, "SFXXXX", 6); - if (_game == GAME_SIMON1WIN ) + if (_game == GAME_SIMON1WIN) _sound->readSfxFile(filename, _gameDataPath); else if (_game & GAME_SIMON2) { _sound->loadSfxTable(_game_file, _game_offsets_ptr[atoi(filename + 6) - 1 + gss->SOUND_INDEX_BASE]); @@ -828,6 +828,45 @@ void SimonState::loadTablesIntoMem(uint subr_id) warning("loadTablesIntoMem: didn't find %d", subr_id); } +void SimonState::readSting(uint a) +{ + char filename[11]; + uint16 size; + + _mus_file = new File(); + + sprintf(filename, "stings%i.mus", a); + + _mus_file->open(filename, _gameDataPath); + + if (!_mus_file->isOpen()) + return; + + size = _mus_file->readUint16LE(); + + _mus_offsets = (uint16 *)malloc(size); + + _mus_file->seek(0, SEEK_SET); + + if (_mus_file->read(_mus_offsets, size) != size) + error("Cannot read offsets"); +} + +void SimonState::playSting(uint a) +{ + if (!midi._midi_sfx_toggle) + return; + + readSting(_midi_sfx); + + midi.shutdown(); + _mus_file->seek(_mus_offsets[a], SEEK_SET); + midi.read_all_songs_old(_mus_file, a, _mus_offsets[a+1] - _mus_offsets[a]); + + midi.initialize(); + midi.play(); +} + Subroutine *SimonState::getSubroutineByID(uint subroutine_id) { Subroutine *cur; @@ -3099,7 +3138,14 @@ void SimonState::processSpecialKeys() break; case 's': - _sound->effectsPause(_effects_paused ^= 1); + if (_game == GAME_SIMON1DOS) { + midi._midi_sfx_toggle ^= 1; + if (midi._midi_sfx_toggle) + midi.shutdown(); + else + playMusic(0, _last_music_played); + } else + _sound->effectsPause(_effects_paused ^= 1); break; case 'b': @@ -4502,6 +4548,8 @@ void SimonState::go() } else { _vk_t_toggle = true; } + + midi._midi_sfx_toggle = false; while (1) { hitarea_stuff(); @@ -4810,6 +4858,9 @@ bool SimonState::load_game(uint slot) void SimonState::playMusic(uint music_unk, uint music) { + if (midi._midi_sfx_toggle) + return; + if (_game & GAME_SIMON2) { // Simon 2 music if (_game & GAME_WIN) { midi.shutdown(); diff --git a/simon/simon.h b/simon/simon.h index 4b62082fd8..aa488a407d 100644 --- a/simon/simon.h +++ b/simon/simon.h @@ -100,6 +100,12 @@ struct GameSpecificSettings; class SimonState : public Engine { public: + File *_mus_file; + uint16 *_mus_offsets; + + void SimonState::readSting(uint a); + void SimonState::playSting(uint a); + byte *_vc_ptr; /* video code ptr */ uint32 *_game_offsets_ptr; @@ -246,6 +252,7 @@ public: bool _skip_speech; byte _video_var_9; + uint _midi_sfx; uint _last_music_played; bool _show_preposition; diff --git a/simon/vga.cpp b/simon/vga.cpp index 7d5b271d37..50a7d56406 100644 --- a/simon/vga.cpp +++ b/simon/vga.cpp @@ -1594,7 +1594,9 @@ void SimonState::vc_52_play_sound() { uint16 a = vc_read_next_word(); - if (!(_game & GAME_SIMON2)) { + if (_game == GAME_SIMON1DOS) { + playSting(a); + } else if (!(_game & GAME_SIMON2)) { _sound->playEffects(a); } else { if (a >= 0x8000) { |