Add support for compressed files for some simon games, rest of patch #629555
svn-id: r5347
This commit is contained in:
parent
ace6c43b39
commit
fa9634673f
2 changed files with 110 additions and 38 deletions
|
@ -131,9 +131,11 @@ struct GameSpecificSettings {
|
||||||
uint SOUND_INDEX_BASE;
|
uint SOUND_INDEX_BASE;
|
||||||
const char *gme_filename;
|
const char *gme_filename;
|
||||||
const char *wav_filename;
|
const char *wav_filename;
|
||||||
const char *wav_filename2;
|
const char *voc_filename;
|
||||||
const char *effects_filename;
|
const char *mp3_filename;
|
||||||
const char *gamepc_filename;
|
const char *voc_effects_filename;
|
||||||
|
const char *mp3_effects_filename;
|
||||||
|
const char *gamepc_filename;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
140
simon/simon.cpp
140
simon/simon.cpp
|
@ -49,8 +49,10 @@ static const GameSpecificSettings simon1_settings = {
|
||||||
0, /* SOUND_INDEX_BASE */
|
0, /* SOUND_INDEX_BASE */
|
||||||
"SIMON.GME", /* gme_filename */
|
"SIMON.GME", /* gme_filename */
|
||||||
"SIMON.WAV", /* wav_filename */
|
"SIMON.WAV", /* wav_filename */
|
||||||
"SIMON.VOC", /* wav_filename2 */
|
"SIMON.VOC", /* voc_filename */
|
||||||
"EFFECTS.VOC", /* effects_filename */
|
"SIMON.MP3", /* mp3_filename */
|
||||||
|
"EFFECTS.VOC", /* voc_effects_filename */
|
||||||
|
"EFFECTS.MP3", /* mp3_effects_filename */
|
||||||
"GAMEPC", /* gamepc_filename */
|
"GAMEPC", /* gamepc_filename */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,8 +70,10 @@ static const GameSpecificSettings simon1demo_settings = {
|
||||||
0, /* SOUND_INDEX_BASE */
|
0, /* SOUND_INDEX_BASE */
|
||||||
"", /* gme_filename */
|
"", /* gme_filename */
|
||||||
"", /* wav_filename */
|
"", /* wav_filename */
|
||||||
"", /* wav_filename2 */
|
"", /* voc_filename */
|
||||||
"", /* effects_filename */
|
"", /* mp3_filename */
|
||||||
|
"", /* voc_effects_filename */
|
||||||
|
"", /* mp3_effects_filename */
|
||||||
"GDEMO", /* gamepc_filename */
|
"GDEMO", /* gamepc_filename */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -87,8 +91,10 @@ static const GameSpecificSettings simon2win_settings = {
|
||||||
1660 / 4, /* SOUND_INDEX_BASE */
|
1660 / 4, /* SOUND_INDEX_BASE */
|
||||||
"SIMON2.GME", /* gme_filename */
|
"SIMON2.GME", /* gme_filename */
|
||||||
"SIMON2.WAV", /* wav_filename */
|
"SIMON2.WAV", /* wav_filename */
|
||||||
"SIMON2.VOC", /* wav_filename2 */
|
"SIMON2.VOC", /* voc_filename */
|
||||||
"",
|
"SIMON2.MP3", /* mp3_filename */
|
||||||
|
"", /* voc_effects_filename */
|
||||||
|
"", /* mp3_effects_filename */
|
||||||
"GSPTR30", /* gamepc_filename */
|
"GSPTR30", /* gamepc_filename */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -106,8 +112,10 @@ static const GameSpecificSettings simon2dos_settings = {
|
||||||
1660 / 4, /* SOUND_INDEX_BASE */
|
1660 / 4, /* SOUND_INDEX_BASE */
|
||||||
"SIMON2.GME", /* gme_filename */
|
"SIMON2.GME", /* gme_filename */
|
||||||
"", /* wav_filename */
|
"", /* wav_filename */
|
||||||
"",
|
"", /* voc_filename */
|
||||||
"",
|
"", /* mp3_filename */
|
||||||
|
"", /* voc_effects_filename */
|
||||||
|
"", /* mp3_effects_filename */
|
||||||
"GAME32", /* gamepc_filename */
|
"GAME32", /* gamepc_filename */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4649,25 +4657,37 @@ void SimonState::initSound()
|
||||||
{
|
{
|
||||||
/* only read voice file in windows game */
|
/* only read voice file in windows game */
|
||||||
if (_game & GAME_WIN) {
|
if (_game & GAME_WIN) {
|
||||||
|
const char *m = gss->mp3_filename;
|
||||||
const char *s = gss->wav_filename;
|
const char *s = gss->wav_filename;
|
||||||
const char *s2 = gss->wav_filename2;
|
const char *s2 = gss->voc_filename;
|
||||||
const char *e = gss->effects_filename;
|
const char *e = gss->voc_effects_filename;
|
||||||
|
const char *me = gss->mp3_effects_filename;
|
||||||
|
|
||||||
_voice_offsets = NULL;
|
_voice_offsets = NULL;
|
||||||
|
|
||||||
_voice_file = new File();
|
_voice_file = new File();
|
||||||
_voice_file->open(s, _gameDataPath);
|
#ifdef USE_MAD
|
||||||
|
_voice_file->open(m, _gameDataPath);
|
||||||
if (_voice_file->isOpen() == false) {
|
if (_voice_file->isOpen() == false) {
|
||||||
warning("Cannot open voice file %s, trying %s", s, s2);
|
#endif
|
||||||
if (s2) {
|
_voice_file->open(s, _gameDataPath);
|
||||||
_voice_file->open(s2, _gameDataPath);
|
if (_voice_file->isOpen() == false) {
|
||||||
if (_voice_file->isOpen() == false) {
|
warning("Cannot open voice file %s, trying %s", s, s2);
|
||||||
warning("Cannot open voice file %s", s2);
|
if (s2) {
|
||||||
|
_voice_file->open(s2, _gameDataPath);
|
||||||
|
if (_voice_file->isOpen() == false) {
|
||||||
|
warning("Cannot open voice file %s", s2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else
|
#ifdef USE_MAD
|
||||||
|
else
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32));
|
_voice_offsets = (uint32 *)malloc(gss->NUM_VOICE_RESOURCES * sizeof(uint32));
|
||||||
if (_voice_offsets == NULL)
|
if (_voice_offsets == NULL)
|
||||||
|
@ -4678,7 +4698,15 @@ void SimonState::initSound()
|
||||||
|
|
||||||
_effects_offsets = NULL;
|
_effects_offsets = NULL;
|
||||||
_effects_file = new File();
|
_effects_file = new File();
|
||||||
_effects_file->open(e, _gameDataPath);
|
|
||||||
|
#ifdef USE_MAD
|
||||||
|
_effects_file->open(me, _gameDataPath);
|
||||||
|
if (_effects_file->isOpen() == false ) {
|
||||||
|
#endif
|
||||||
|
_effects_file->open(e, _gameDataPath);
|
||||||
|
#ifdef USE_MAD
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (_effects_file->isOpen() == true)
|
if (_effects_file->isOpen() == true)
|
||||||
{
|
{
|
||||||
_effects_offsets = (uint32 *)malloc(gss->NUM_EFFECTS_RESOURCES * sizeof(uint32));
|
_effects_offsets = (uint32 *)malloc(gss->NUM_EFFECTS_RESOURCES * sizeof(uint32));
|
||||||
|
@ -4750,9 +4778,24 @@ void SimonState::playVoice(uint voice)
|
||||||
_mixer->stop(_voice_sound);
|
_mixer->stop(_voice_sound);
|
||||||
_voice_file->seek(_voice_offsets[voice], SEEK_SET);
|
_voice_file->seek(_voice_offsets[voice], SEEK_SET);
|
||||||
|
|
||||||
const char *s2 = gss->wav_filename2;
|
#ifdef USE_MAD
|
||||||
|
const char *m = gss->mp3_filename;
|
||||||
|
File music_file;
|
||||||
|
music_file.open(m, _gameDataPath);
|
||||||
|
if (music_file.isOpen() == true) {
|
||||||
|
|
||||||
|
uint32 size = _voice_offsets[voice+1] - _voice_offsets[voice];
|
||||||
|
|
||||||
|
byte *sound = (byte *)malloc(size);
|
||||||
|
_voice_file->read(sound, size);
|
||||||
|
|
||||||
|
_mixer->playMP3(&_voice_sound, sound, size, SoundMixer::FLAG_AUTOFREE);
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
|
const char *s2 = gss->voc_filename;
|
||||||
File music_file;
|
File music_file;
|
||||||
music_file.open(s2, _gameDataPath);
|
music_file.open(s2, _gameDataPath);
|
||||||
|
|
||||||
if (music_file.isOpen() == false) { /* WAVE audio */
|
if (music_file.isOpen() == false) { /* WAVE audio */
|
||||||
WaveHeader wave_hdr;
|
WaveHeader wave_hdr;
|
||||||
uint32 data[2];
|
uint32 data[2];
|
||||||
|
@ -4802,6 +4845,9 @@ void SimonState::playVoice(uint voice)
|
||||||
|
|
||||||
_mixer->playRaw(&_voice_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
|
_mixer->playRaw(&_voice_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
|
||||||
}
|
}
|
||||||
|
#ifdef USE_MAD
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4809,6 +4855,20 @@ void SimonState::playSound(uint sound)
|
||||||
{
|
{
|
||||||
if (_game & GAME_WIN) {
|
if (_game & GAME_WIN) {
|
||||||
if (_effects_offsets) { /* VOC sound file */
|
if (_effects_offsets) { /* VOC sound file */
|
||||||
|
#ifdef USE_MAD
|
||||||
|
const char *m = gss->mp3_filename;
|
||||||
|
File music_file;
|
||||||
|
music_file.open(m, _gameDataPath);
|
||||||
|
if (music_file.isOpen() == true) {
|
||||||
|
_effects_file->seek(_effects_offsets[sound], SEEK_SET);
|
||||||
|
uint32 size = _effects_offsets[sound+1] - _effects_offsets[sound];
|
||||||
|
|
||||||
|
byte *buffer = (byte *)malloc(size);
|
||||||
|
_effects_file->read(buffer, size);
|
||||||
|
|
||||||
|
_mixer->playMP3(&_effects_sound, buffer, size, SoundMixer::FLAG_AUTOFREE);
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
VocHeader voc_hdr;
|
VocHeader voc_hdr;
|
||||||
VocBlockHeader voc_block_hdr;
|
VocBlockHeader voc_block_hdr;
|
||||||
uint32 size;
|
uint32 size;
|
||||||
|
@ -4832,11 +4892,14 @@ void SimonState::playSound(uint sound)
|
||||||
_effects_file->read(buffer, size);
|
_effects_file->read(buffer, size);
|
||||||
|
|
||||||
_mixer->playRaw(&_effects_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
|
_mixer->playRaw(&_effects_sound, buffer, size, samples_per_sec, SoundMixer::FLAG_UNSIGNED);
|
||||||
|
#ifdef USE_MAD
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* FIXME: not properly implemented */
|
/* FIXME: not properly implemented */
|
||||||
/* Simon 2 dos talkie sfx aren't supported */
|
/* Simon 2 dos talkie sfx aren't supported */
|
||||||
/* Simon 2 dos sfx isn't supported */
|
/* Simon 2 dos sfx isn't supported */
|
||||||
const char *s2 = gss->wav_filename2;
|
const char *s2 = gss->voc_filename;
|
||||||
File music_file;
|
File music_file;
|
||||||
music_file.open(s2, _gameDataPath);
|
music_file.open(s2, _gameDataPath);
|
||||||
if (music_file.isOpen() == false) {
|
if (music_file.isOpen() == false) {
|
||||||
|
@ -4877,35 +4940,42 @@ void SimonState::playSound(uint sound)
|
||||||
void SimonState::playMusic(uint music)
|
void SimonState::playMusic(uint music)
|
||||||
{
|
{
|
||||||
/* FIXME: not properly implemented */
|
/* FIXME: not properly implemented */
|
||||||
|
/* Simon 1 dos talkie music doesn't detect correct size of music data */
|
||||||
/* Simon 2 dos talkie music isn't supported */
|
/* Simon 2 dos talkie music isn't supported */
|
||||||
/* Simon 2 dos music isn't supported */
|
/* Simon 2 dos music isn't supported */
|
||||||
const char *s2 = gss->wav_filename2;
|
const char *s2 = gss->voc_filename;
|
||||||
File music_file;
|
File music_file;
|
||||||
music_file.open(s2, _gameDataPath);
|
music_file.open(s2, _gameDataPath);
|
||||||
if (music_file.isOpen() == false) {
|
if (music_file.isOpen() == true) {
|
||||||
|
|
||||||
midi.shutdown();
|
midi.shutdown();
|
||||||
|
|
||||||
if (_game & GAME_WIN) {
|
if (_game & GAME_WIN) {
|
||||||
_game_file->seek(_game_offsets_ptr[gss->MUSIC_INDEX_BASE + music], SEEK_SET);
|
_game_file->seek(_game_offsets_ptr[gss->MUSIC_INDEX_BASE + music], SEEK_SET);
|
||||||
File *f = _game_file;
|
File *f = _game_file;
|
||||||
midi.read_all_songs(f);
|
midi.read_all_songs(f);
|
||||||
} else {
|
|
||||||
char buf[50];
|
|
||||||
File *f = new File();
|
|
||||||
sprintf(buf, "MOD%d.MUS", music);
|
|
||||||
f->open(buf, _gameDataPath);
|
|
||||||
if (f->isOpen() == false) {
|
|
||||||
warning("Cannot load music from '%s'", buf);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
midi.read_all_songs_old(f);
|
|
||||||
delete f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
midi.initialize();
|
midi.initialize();
|
||||||
midi.play();
|
midi.play();
|
||||||
} else {
|
} else {
|
||||||
|
if (_game == GAME_SIMON1DOS) {
|
||||||
|
|
||||||
|
midi.shutdown();
|
||||||
|
|
||||||
|
char buf[50];
|
||||||
|
File *f = new File();
|
||||||
|
sprintf(buf, "MOD%d.MUS", music);
|
||||||
|
f->open(buf, _gameDataPath);
|
||||||
|
if (f->isOpen() == false) {
|
||||||
|
warning("Cannot load music from '%s'", buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
midi.read_all_songs_old(f);
|
||||||
|
delete f;
|
||||||
|
|
||||||
|
midi.initialize();
|
||||||
|
midi.play();
|
||||||
|
}
|
||||||
if (_game == GAME_SIMON1WIN) {
|
if (_game == GAME_SIMON1WIN) {
|
||||||
|
|
||||||
midi.shutdown();
|
midi.shutdown();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue