From 102dd462734f0baa67ae4f8439094f6aa50b42fa Mon Sep 17 00:00:00 2001 From: Eric Fry Date: Sun, 17 Jun 2018 00:07:36 +1000 Subject: ILLUSIONS: Wire up audio sliders on option menu. Set volumes based on scummvm config --- engines/illusions/duckman/menusystem_duckman.cpp | 57 +++++++++++++++--------- engines/illusions/duckman/menusystem_duckman.h | 14 +++++- engines/illusions/sound.cpp | 35 ++++++++++++++- engines/illusions/sound.h | 9 ++++ 4 files changed, 89 insertions(+), 26 deletions(-) diff --git a/engines/illusions/duckman/menusystem_duckman.cpp b/engines/illusions/duckman/menusystem_duckman.cpp index 7cadd7ebf5..502a0ac865 100644 --- a/engines/illusions/duckman/menusystem_duckman.cpp +++ b/engines/illusions/duckman/menusystem_duckman.cpp @@ -22,6 +22,7 @@ #include "illusions/illusions.h" #include "illusions/actor.h" +#include "illusions/sound.h" #include "illusions/duckman/illusions_duckman.h" #include "illusions/duckman/menusystem_duckman.h" #include "illusions/resources/scriptresource.h" @@ -106,29 +107,34 @@ BaseMenu *DuckmanMenuSystem::createLoadGameMenu() { return 0; // TODO } +MenuItem *DuckmanMenuSystem::createOptionsSliderMenuItem(const Common::String &text, SliderActionType type, BaseMenu *baseMenu) { + int sliderValue = 0; + Common::String sliderText = "{~~~~~~~~~~~~~~~~}"; + switch (type) { + case SFX : sliderValue = _vm->_soundMan->getSfxVolume()/(255/15); break; + case MUSIC : sliderValue = _vm->_soundMan->getMusicVolume()/(255/15); break; + case VOICE : sliderValue = _vm->_soundMan->getSpeechVolume()/(255/15); break; + case TEXT_DURATION : sliderValue = 128/(255/15); break; // TODO wire up text duration config + default: break; + } + + sliderText.setChar('|', sliderValue + 1); + + MenuActionUpdateSlider *action = new MenuActionUpdateSlider(this, baseMenu, type, _vm); + MenuItem *menuItem = new MenuItem(text + sliderText, action); + action->setMenuItem(menuItem); + return menuItem; +} + BaseMenu *DuckmanMenuSystem::createOptionsMenu() { BaseMenu *menu = new BaseMenu(this, 0x00120003, 12, 17, 11, 27, 6); menu->addText(" GAME OPTIONS @@@@"); menu->addText("--------------------------------------"); - MenuActionUpdateSlider *action = new MenuActionUpdateSlider(this, menu); - MenuItem *menuItem = new MenuItem("SFX Volume @@{~~~~~~~~~~~~|~~~} @@@", action); - action->setMenuItem(menuItem); - menu->addMenuItem(menuItem); - action = new MenuActionUpdateSlider(this, menu); - menuItem = new MenuItem("Music Volume @@@{~~~~~~~~~~~~|~~~} @@@", action); - action->setMenuItem(menuItem); - menu->addMenuItem(menuItem); - - action = new MenuActionUpdateSlider(this, menu); - menuItem = new MenuItem("Speech Volume {~~~~~~~~~~~~|~~~} @@@", action); - action->setMenuItem(menuItem); - menu->addMenuItem(menuItem); - - action = new MenuActionUpdateSlider(this, menu); - menuItem = new MenuItem("Text Duration @@@{~~~~~~~~~~~~|~~~} @@@", action); - action->setMenuItem(menuItem); - menu->addMenuItem(menuItem); + menu->addMenuItem(createOptionsSliderMenuItem("SFX Volume @@", SFX, menu)); + menu->addMenuItem(createOptionsSliderMenuItem("Music Volume @@@", MUSIC, menu)); + menu->addMenuItem(createOptionsSliderMenuItem("Speech Volume ", VOICE, menu)); + menu->addMenuItem(createOptionsSliderMenuItem("Text Duration @@@", TEXT_DURATION, menu)); menu->addMenuItem(new MenuItem("Restore Defaults", new MenuActionLeaveMenu(this))); @@ -289,7 +295,7 @@ void DuckmanMenuSystem::playSoundEffect(int sfxId) { _vm->playSoundEffect(sfxId); } -MenuActionInventoryAddRemove::MenuActionInventoryAddRemove(BaseMenuSystem *menuSystem, IllusionsEngine_Duckman *vm, uint choiceIndex) + MenuActionInventoryAddRemove::MenuActionInventoryAddRemove(BaseMenuSystem *menuSystem, IllusionsEngine_Duckman *vm, uint choiceIndex) : BaseMenuAction(menuSystem), _choiceIndex(choiceIndex), _vm(vm) { } @@ -307,8 +313,8 @@ void MenuActionInventoryAddRemove::execute() { _menuSystem->leaveMenu(); } -MenuActionUpdateSlider::MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *menu) - : BaseMenuAction(menuSystem), menu(menu) { +MenuActionUpdateSlider::MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu, SliderActionType type, IllusionsEngine_Duckman *vm) + : BaseMenuAction(menuSystem), menu(baseMenu), _type(type), _vm(vm) { menuItem = NULL; } @@ -324,7 +330,14 @@ void MenuActionUpdateSlider::execute() { menuItem->setText(text); _menuSystem->redrawMenuText(menu); - // TODO update slider here set value callback. + + switch(_type) { + case SFX : _vm->_soundMan->setSfxVolume(newSliderValue * (255/15)); break; + case MUSIC : _vm->_soundMan->setMusicVolume(newSliderValue * (255/15)); break; + case VOICE : _vm->_soundMan->setSpeechVolume(newSliderValue * (255/15)); break; + case TEXT_DURATION : break; // TODO + default: break; + } } int MenuActionUpdateSlider::calcNewSliderValue(Common::String &text, int newOffset) { diff --git a/engines/illusions/duckman/menusystem_duckman.h b/engines/illusions/duckman/menusystem_duckman.h index 22bfefa794..3ebab4dea4 100644 --- a/engines/illusions/duckman/menusystem_duckman.h +++ b/engines/illusions/duckman/menusystem_duckman.h @@ -27,7 +27,14 @@ namespace Illusions { -enum { + enum SliderActionType { + SFX, + MUSIC, + VOICE, + TEXT_DURATION + }; + + enum { kDuckmanMainMenu, kDuckmanLoadGameMenu, kDuckmanOptionsMenu, @@ -59,6 +66,7 @@ public://protected: BaseMenu *createMainMenu(); BaseMenu *createLoadGameMenu(); BaseMenu *createOptionsMenu(); + MenuItem *createOptionsSliderMenuItem(const Common::String &text, SliderActionType type, BaseMenu *baseMenu); BaseMenu *createPauseMenu(); BaseMenu *createQueryRestartMenu(); BaseMenu *createQueryQuitMenu(); @@ -85,13 +93,15 @@ protected: class MenuActionUpdateSlider : public BaseMenuAction { public: - MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu); + MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu, SliderActionType type, IllusionsEngine_Duckman *vm); void setMenuItem(MenuItem *newMmenuItem) { menuItem = newMmenuItem; } virtual void execute(); protected: + IllusionsEngine_Duckman *_vm; + SliderActionType _type; MenuItem *menuItem; BaseMenu *menu; int calcNewSliderValue(Common::String &text, int newOffset); diff --git a/engines/illusions/sound.cpp b/engines/illusions/sound.cpp index cf6e4f8748..bbcf8ad75b 100644 --- a/engines/illusions/sound.cpp +++ b/engines/illusions/sound.cpp @@ -20,6 +20,7 @@ * */ +#include "common/config-manager.h" #include "illusions/illusions.h" #include "illusions/sound.h" #include "audio/midiparser.h" @@ -296,7 +297,7 @@ void SoundMan::stopCueingVoice() { } void SoundMan::startVoice(int16 volume, int16 pan) { - _voicePlayer->start(volume, pan); + _voicePlayer->start(calcAdjustedVolume("speech_volume", (uint8)volume), pan); } void SoundMan::stopVoice() { @@ -323,7 +324,7 @@ void SoundMan::loadSound(uint32 soundEffectId, uint32 soundGroupId, bool looping void SoundMan::playSound(uint32 soundEffectId, int16 volume, int16 pan) { Sound *sound = getSound(soundEffectId); if (sound) - sound->play(volume, pan); + sound->play(calcAdjustedVolume("sfx_volume", (uint8)volume), pan); } void SoundMan::stopSound(uint32 soundEffectId) { @@ -364,4 +365,34 @@ void SoundMan::fadeMidiMusic(int16 finalVolume, int16 duration) { _midiPlayer->fade(finalVolume, duration); } +void SoundMan::setMusicVolume(uint8 volume) { + ConfMan.setInt("music_volume", volume); + _midiPlayer->syncVolume(); +} + +void SoundMan::setSfxVolume(uint8 volume) { + ConfMan.setInt("sfx_volume", volume); +} + +void SoundMan::setSpeechVolume(uint8 volume) { + ConfMan.setInt("speech_volume", volume); +} + +uint8 SoundMan::calcAdjustedVolume(const Common::String &volumeConfigKey, uint8 volume) { + uint8 masterVolume = (uint8)ConfMan.getInt(volumeConfigKey); + return (uint8)(((float)masterVolume/255) * (float)volume); +} + +uint8 SoundMan::getMusicVolume() { + return (uint8)ConfMan.getInt("music_volume"); +} + +uint8 SoundMan::getSfxVolume() { + return (uint8)ConfMan.getInt("sfx_volume"); +} + +uint8 SoundMan::getSpeechVolume() { + return (uint8)ConfMan.getInt("speech_volume"); +} + } // End of namespace Illusions diff --git a/engines/illusions/sound.h b/engines/illusions/sound.h index d2da8ed48e..f0786b2e4d 100644 --- a/engines/illusions/sound.h +++ b/engines/illusions/sound.h @@ -117,6 +117,14 @@ public: void stopMidiMusic(); void fadeMidiMusic(int16 finalVolume, int16 duration); + uint8 getMusicVolume(); + uint8 getSfxVolume(); + uint8 getSpeechVolume(); + + void setMusicVolume(uint8 volume); + void setSfxVolume(uint8 volume); + void setSpeechVolume(uint8 volume); + bool cueVoice(const char *voiceName); void stopCueingVoice(); void startVoice(int16 volume, int16 pan); @@ -140,6 +148,7 @@ protected: VoicePlayer *_voicePlayer; SoundList _sounds; Sound *getSound(uint32 soundEffectId); + uint8 calcAdjustedVolume(const Common::String &volumeConfigKey, uint8 volume); }; } // End of namespace Illusions -- cgit v1.2.3