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
This commit is contained in:
Travis Howell 2003-01-03 12:06:30 +00:00
parent f1365f4f2b
commit 3a4782f166
6 changed files with 91 additions and 11 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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();

View File

@ -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;

View File

@ -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) {