mirror of
https://github.com/scummvm/scummvm.git
synced 2026-06-20 05:45:29 +00:00
Implement option buttons functionality. This fixes bug #1259518 "ITE: Buttons
in Options Dialog not fully functional" svn-id: r18738
This commit is contained in:
+16
-7
@@ -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;
|
||||
|
||||
+2
-1
@@ -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
|
||||
};
|
||||
|
||||
+70
-36
@@ -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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
break;
|
||||
case kTextSave:
|
||||
if (!_vm->isSaveListFull() && (_optionSaveFileTitleNumber == 0)) {
|
||||
_textInputString[0] = 0;
|
||||
} else {
|
||||
strcpy(_textInputString, _vm->getSaveFile(_optionSaveFileTitleNumber)->name);
|
||||
}
|
||||
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);
|
||||
|
||||
+3
-2
@@ -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);
|
||||
|
||||
+11
-8
@@ -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.");
|
||||
}
|
||||
|
||||
|
||||
+4
-3
@@ -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;
|
||||
|
||||
+9
-2
@@ -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
|
||||
|
||||
+3
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user