diff options
-rw-r--r-- | saga/actor.cpp | 23 | ||||
-rw-r--r-- | saga/game.cpp | 3 | ||||
-rw-r--r-- | saga/interface.cpp | 106 | ||||
-rw-r--r-- | saga/music.cpp | 5 | ||||
-rw-r--r-- | saga/saga.cpp | 19 | ||||
-rw-r--r-- | saga/saga.h | 7 | ||||
-rw-r--r-- | saga/sound.cpp | 11 | ||||
-rw-r--r-- | saga/sound.h | 5 |
8 files changed, 118 insertions, 61 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp index 416f3d1aa6..b8e84ec979 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -918,7 +918,6 @@ void Actor::handleSpeech(int msec) { int sampleLength; bool removeFirst; int i; - int talkspeed; ActorData *actor; int width, height, height2; Point posPoint; @@ -976,20 +975,29 @@ void Actor::handleSpeech(int msec) { stringLength = strlen(_activeSpeech.strings[0]); - talkspeed = ConfMan.getInt("talkspeed"); if (_activeSpeech.speechFlags & kSpeakSlow) { if (_activeSpeech.slowModeCharIndex >= stringLength) error("Wrong string index"); warning("Slow string encountered!"); - _activeSpeech.playingTime = 10 * talkspeed; - // 10 - fix it + _activeSpeech.playingTime = stringLength * 1000 / 4; } else { - sampleLength = _vm->_sndRes->getVoiceLength(_activeSpeech.sampleResourceId); //fixme - too fast + sampleLength = _vm->_sndRes->getVoiceLength(_activeSpeech.sampleResourceId); if (sampleLength < 0) { - _activeSpeech.playingTime = stringLength * talkspeed; + _activeSpeech.playingTime = stringLength * 1000 / 22; + switch (_vm->_readingSpeed) { + case 1: + _activeSpeech.playingTime *= 2; + break; + case 2: + _activeSpeech.playingTime *= 4; + break; + case 3: + _activeSpeech.playingTime = 0x7fffff; + break; + } } else { _activeSpeech.playingTime = sampleLength; } @@ -1599,7 +1607,8 @@ void Actor::drawActors() { } void Actor::drawSpeech(void) { - if (!isSpeaking() || !_activeSpeech.playing || _vm->_script->_skipSpeeches) + if (!isSpeaking() || !_activeSpeech.playing || _vm->_script->_skipSpeeches + || !_vm->_subtitlesEnabled) return; int i; diff --git a/saga/game.cpp b/saga/game.cpp index ea9f3515ed..2e413d8192 100644 --- a/saga/game.cpp +++ b/saga/game.cpp @@ -95,7 +95,8 @@ static PanelButton ITE_OptionPanelButtons[] = { {kPanelButtonOptionSaveFiles, 166,20, 112,74, 0,'-',0, 0,0,0}, //savefiles {kPanelButtonOptionText,106,4, 0,0, kTextGameOptions,'-',0, 0,0,0}, // text: game options - {kPanelButtonOptionText,10,22, 0,0, kTextReadingSpeed,'-',0, 0,0,0}, // text: read speed + {kPanelButtonOptionText,11,22, 0,0, kTextReadingSpeed,'-',0, 0,0,0}, // text: read speed + {kPanelButtonOptionText,28,22, 0,0, kTextShowDialog,'-',0, 0,0,0}, // text: read speed {kPanelButtonOptionText,73,41, 0,0, kTextMusic,'-',0, 0,0,0}, // text: music {kPanelButtonOptionText,69,60, 0,0, kTextSound,'-',0, 0,0,0}, // text: noise }; diff --git a/saga/interface.cpp b/saga/interface.cpp index e7026f45da..d26456c12b 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -32,16 +32,19 @@ #include "saga/objectmap.h" #include "saga/isomap.h" #include "saga/itedata.h" +#include "saga/music.h" #include "saga/puzzle.h" #include "saga/render.h" #include "saga/scene.h" #include "saga/script.h" +#include "saga/sound.h" #include "saga/sprite.h" #include "saga/rscfile.h" #include "saga/resnames.h" #include "saga/interface.h" +#include "common/config-manager.h" #include "common/system.h" #include "common/timer.h" @@ -650,15 +653,14 @@ void Interface::drawPanelText(Surface *ds, InterfacePanel *panel, PanelButton *p int textWidth; Rect rect; Point textPoint; - int textId = panelButton->id; - switch (panelButton->id) { - case kTextReadingSpeed: - if (_vm->getFeatures() & GF_CD_FX) - textId = kTextShowDialog; - break; - } - text = _vm->getTextString(textId); + // Button differs for CD version + if (panelButton->id == kTextReadingSpeed && _vm->getFeatures() & GF_CD_FX) + return; + if (panelButton->id == kTextShowDialog && !(_vm->getFeatures() & GF_CD_FX)) + return; + + text = _vm->getTextString(panelButton->id); panel->calcPanelButtonRect(panelButton, rect); if (panelButton->xOffset < 0) { textWidth = _vm->_font->getStringWidth(kMediumFont, text, 0, kFontNormal); @@ -1234,29 +1236,49 @@ void Interface::setOption(PanelButton *panelButton) { char * fileName; _optionPanel.currentButton = NULL; switch (panelButton->id) { - case kTextContinuePlaying: - setMode(kPanelMain); - break; - case kTextQuitGame: - setMode(kPanelQuit); - break; - case kTextLoad: - if (_vm->getSaveFilesCount() > 0) { - if (_vm->isSaveListFull() || (_optionSaveFileTitleNumber > 0)) { - fileName = _vm->calcSaveFileName(_vm->getSaveFile(_optionSaveFileTitleNumber)->slotNumber); - setMode(kPanelMain); - _vm->load(fileName); - } - } - break; - case kTextSave: - if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0)) { - _textInputString[0] = 0; - } else { - strcpy(_textInputString, _vm->getSaveFile(_optionSaveFileTitleNumber)->name); + case kTextContinuePlaying: + ConfMan.flushToDisk(); + setMode(kPanelMain); + break; + case kTextQuitGame: + setMode(kPanelQuit); + break; + case kTextLoad: + if (_vm->getSaveFilesCount() > 0) { + if (_vm->isSaveListFull() || (_optionSaveFileTitleNumber > 0)) { + fileName = _vm->calcSaveFileName(_vm->getSaveFile(_optionSaveFileTitleNumber)->slotNumber); + setMode(kPanelMain); + _vm->load(fileName); } - setMode(kPanelSave); - break; + } + break; + case kTextSave: + if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0)) { + _textInputString[0] = 0; + } else { + strcpy(_textInputString, _vm->getSaveFile(_optionSaveFileTitleNumber)->name); + } + setMode(kPanelSave); + break; + case kTextReadingSpeed: + if (_vm->getFeatures() & GF_CD_FX) { + _vm->_subtitlesEnabled = !_vm->_subtitlesEnabled; + ConfMan.set("subtitles", _vm->_subtitlesEnabled); + } else { + _vm->_readingSpeed = (_vm->_readingSpeed + 1) % 4; + ConfMan.set("talkspeed", _vm->_readingSpeed); + } + break; + case kTextMusic: + _vm->_musicVolume = (_vm->_musicVolume + 1) % 11; + _vm->_music->setVolume(_vm->_musicVolume == 10 ? -1 : _vm->_musicVolume * 25, 1); + ConfMan.set("music_volume", _vm->_musicVolume * 25); + break; + case kTextSound: + _vm->_soundVolume = (_vm->_soundVolume + 1) % 11; + _vm->_sound->setVolume(_vm->_soundVolume == 10 ? 255 : _vm->_soundVolume * 25); + ConfMan.set("sfx_volume", _vm->_soundVolume * 25); + break; } } @@ -1766,6 +1788,8 @@ void Interface::drawButtonBox(Surface *ds, const Rect& rect, ButtonKind kind, bo ds->fillRect(fill, solidColor); } +static const int readingSpeeds[] = { kTextFast, kTextMid, kTextSlow, kTextClick }; + void Interface::drawPanelButtonText(Surface *ds, InterfacePanel *panel, PanelButton *panelButton) { const char *text; int textId; @@ -1778,16 +1802,26 @@ void Interface::drawPanelButtonText(Surface *ds, InterfacePanel *panel, PanelBut textId = panelButton->id; switch(panelButton->id) { case kTextReadingSpeed: - if (_vm->getFeatures() & GF_CD_FX) - textId = kTextOn; - else - textId = kTextFast; + if (_vm->getFeatures() & GF_CD_FX) { + if (_vm->_subtitlesEnabled) + textId = kTextOn; + else + textId = kTextOff; + } else { + textId = readingSpeeds[_vm->_readingSpeed]; + } break; case kTextMusic: - textId = kTextOn; + if (_vm->_musicVolume) + textId = kText10Percent + _vm->_musicVolume - 1; + else + textId = kTextOff; break; case kTextSound: - textId = kTextOn; + if (_vm->_soundVolume) + textId = kText10Percent + _vm->_soundVolume - 1; + else + textId = kTextOff; break; } text = _vm->getTextString(textId); diff --git a/saga/music.cpp b/saga/music.cpp index 028af66141..2bc49f0ba0 100644 --- a/saga/music.cpp +++ b/saga/music.cpp @@ -322,10 +322,11 @@ void Music::setVolume(int volume, int time) { _currentVolumePercent = 0; if (volume == -1) // Set Full volume - volume = ConfMan.getInt("music_volume"); + volume = 255; if (time == 1) { _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, volume); + _player->setVolume(volume); Common::g_timer->removeTimerProc(&musicVolumeGaugeCallback); _currentVolume = volume; return; @@ -447,7 +448,7 @@ void Music::play(uint32 resourceId, MusicFlags flags) { parser->setTimerRate(_player->getBaseTempo()); _player->_parser = parser; - _player->setVolume(ConfMan.getInt("music_volume")); + _player->setVolume(_vm->_musicVolume == 10 ? 255 : _vm->_musicVolume * 25); if (flags & MUSIC_LOOP) _player->setLoop(true); diff --git a/saga/saga.cpp b/saga/saga.cpp index 0d6b73b12e..6536ffa951 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -138,8 +138,6 @@ SagaEngine::SagaEngine(GameDetector *detector, OSystem *syst) warning("Sound initialization failed."); } - _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); - _displayClip.left = _displayClip.top = 0; } @@ -176,8 +174,13 @@ void SagaEngine::errorString(const char *buf1, char *buf2) { } int SagaEngine::init(GameDetector &detector) { - _soundEnabled = 1; - _musicEnabled = 1; + _soundVolume = ConfMan.getInt("sfx_volume") / 25; + _musicVolume = ConfMan.getInt("music_volume") / 25; + _subtitlesEnabled = ConfMan.getBool("subtitles"); + _readingSpeed = ConfMan.getInt("talkspeed"); + + if (_readingSpeed > 3) + _readingSpeed = 0; _resource = new Resource(this); @@ -237,11 +240,11 @@ int SagaEngine::init(GameDetector &detector) { } else if (native_mt32) driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - _music = new Music(this, _mixer, driver, _musicEnabled); + _music = new Music(this, _mixer, driver, _musicVolume); _music->setNativeMT32(native_mt32); _music->setAdlib(adlib); - if (!_musicEnabled) { + if (!_musicVolume) { debug(1, "Music disabled."); } @@ -252,8 +255,8 @@ int SagaEngine::init(GameDetector &detector) { } // Initialize system specific sound - _sound = new Sound(this, _mixer, _soundEnabled); - if (!_soundEnabled) { + _sound = new Sound(this, _mixer, _soundVolume); + if (!_soundVolume) { debug(1, "Sound disabled."); } diff --git a/saga/saga.h b/saga/saga.h index 1ffb0e6697..603ccff171 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -569,9 +569,10 @@ public: return isSaveListFull() ? _saveFilesCount : _saveFilesCount + 1; } - int _soundEnabled; - int _musicEnabled; - + int _soundVolume; + int _musicVolume; + bool _subtitlesEnabled; + int _readingSpeed; SndRes *_sndRes; Sound *_sound; diff --git a/saga/sound.cpp b/saga/sound.cpp index a115947fcd..26249abcea 100644 --- a/saga/sound.cpp +++ b/saga/sound.cpp @@ -30,11 +30,13 @@ namespace Saga { -Sound::Sound(SagaEngine *vm, Audio::Mixer *mixer, int enabled) : - _vm(vm), _mixer(mixer), _enabled(enabled), _voxStream(0) { +Sound::Sound(SagaEngine *vm, Audio::Mixer *mixer, int volume) : + _vm(vm), _mixer(mixer), _voxStream(0) { for (int i = 0; i < SOUND_HANDLES; i++) _handles[i].type = kFreeHandle; + + setVolume(volume == 10 ? 255 : volume * 25); } Sound::~Sound() { @@ -138,4 +140,9 @@ void Sound::stopAll() { stopSound(); } +void Sound::setVolume(int volume) { + _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume); + _mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume); +} + } // End of namespace Saga diff --git a/saga/sound.h b/saga/sound.h index 9cb7584067..7ddeef4c22 100644 --- a/saga/sound.h +++ b/saga/sound.h @@ -61,7 +61,7 @@ struct SndHandle { class Sound { public: - Sound(SagaEngine *vm, Audio::Mixer *mixer, int enabled); + Sound(SagaEngine *vm, Audio::Mixer *mixer, int volume); ~Sound(); void playSound(SoundBuffer &buffer, int volume, bool loop); @@ -76,12 +76,13 @@ public: void stopAll(); + void setVolume(int volume); + private: void playSoundBuffer(Audio::SoundHandle *handle, SoundBuffer &buffer, int volume, bool loop); SndHandle *getHandle(); - int _enabled; SagaEngine *_vm; Audio::Mixer *_mixer; |