From 7e4a1c2bf11d18907d4a0a52a0f144eca6ee2bee Mon Sep 17 00:00:00 2001 From: Eric Fry Date: Mon, 18 Jun 2018 22:13:25 +1000 Subject: ILLUSIONS: Add ability to restore options sliders to defaults --- engines/illusions/duckman/menusystem_duckman.cpp | 93 ++++++++++++++++-------- engines/illusions/duckman/menusystem_duckman.h | 34 +++++++-- 2 files changed, 91 insertions(+), 36 deletions(-) (limited to 'engines/illusions/duckman') diff --git a/engines/illusions/duckman/menusystem_duckman.cpp b/engines/illusions/duckman/menusystem_duckman.cpp index 502a0ac865..b5af102bb9 100644 --- a/engines/illusions/duckman/menusystem_duckman.cpp +++ b/engines/illusions/duckman/menusystem_duckman.cpp @@ -107,7 +107,7 @@ BaseMenu *DuckmanMenuSystem::createLoadGameMenu() { return 0; // TODO } -MenuItem *DuckmanMenuSystem::createOptionsSliderMenuItem(const Common::String &text, SliderActionType type, BaseMenu *baseMenu) { +MenuItem *DuckmanMenuSystem::createOptionsSliderMenuItem(MenuActionUpdateSlider **action, const Common::String &text, SliderActionType type, BaseMenu *baseMenu) { int sliderValue = 0; Common::String sliderText = "{~~~~~~~~~~~~~~~~}"; switch (type) { @@ -120,9 +120,9 @@ MenuItem *DuckmanMenuSystem::createOptionsSliderMenuItem(const Common::String &t sliderText.setChar('|', sliderValue + 1); - MenuActionUpdateSlider *action = new MenuActionUpdateSlider(this, baseMenu, type, _vm); - MenuItem *menuItem = new MenuItem(text + sliderText, action); - action->setMenuItem(menuItem); + *action = new MenuActionUpdateSlider(this, baseMenu, type, _vm); + MenuItem *menuItem = new MenuItem(text + sliderText, *action); + (*action)->setMenuItem(menuItem); return menuItem; } @@ -131,12 +131,17 @@ BaseMenu *DuckmanMenuSystem::createOptionsMenu() { menu->addText(" GAME OPTIONS @@@@"); menu->addText("--------------------------------------"); - 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)); + MenuActionUpdateSlider *sfxSlider; + MenuActionUpdateSlider *musicSlider; + MenuActionUpdateSlider *speechSlider; + MenuActionUpdateSlider *textDurationSlider; - menu->addMenuItem(new MenuItem("Restore Defaults", new MenuActionLeaveMenu(this))); + menu->addMenuItem(createOptionsSliderMenuItem(&sfxSlider, "SFX Volume @@", SFX, menu)); + menu->addMenuItem(createOptionsSliderMenuItem(&musicSlider, "Music Volume @@@", MUSIC, menu)); + menu->addMenuItem(createOptionsSliderMenuItem(&speechSlider, "Speech Volume ", VOICE, menu)); + menu->addMenuItem(createOptionsSliderMenuItem(&textDurationSlider, "Text Duration @@@", TEXT_DURATION, menu)); + + menu->addMenuItem(new MenuItem("Restore Defaults", new MenuActionResetOptionSliders(this, sfxSlider, musicSlider, speechSlider, textDurationSlider))); menu->addMenuItem(new MenuItem("Back", new MenuActionLeaveMenu(this))); return menu; @@ -315,32 +320,24 @@ void MenuActionInventoryAddRemove::execute() { MenuActionUpdateSlider::MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu, SliderActionType type, IllusionsEngine_Duckman *vm) : BaseMenuAction(menuSystem), menu(baseMenu), _type(type), _vm(vm) { - menuItem = NULL; + _menuItem = NULL; } void MenuActionUpdateSlider::execute() { - assert(menuItem); - Common::String text = menuItem->getText(); - Common::Point point = menuItem->getMouseClickPoint(); + assert(_menuItem); + Common::String text = _menuItem->getText(); + Common::Point point = _menuItem->getMouseClickPoint(); int offset = 0; _menuSystem->calcMenuItemTextPositionAtPoint(point, offset); - int newSliderValue = calcNewSliderValue(text, offset); + int newSliderValue = calcNewSliderValue(offset); debug(0, "item text: %s, (%d, %d), New slider value: %d", text.c_str(), point.x, point.y, newSliderValue); - menuItem->setText(text); - _menuSystem->redrawMenuText(menu); - - 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; - } + setSliderValue(newSliderValue); } -int MenuActionUpdateSlider::calcNewSliderValue(Common::String &text, int newOffset) { +int MenuActionUpdateSlider::calcNewSliderValue(int newOffset) { + Common::String text = _menuItem->getText(); int newSliderValue = 0; int start = 0; int end = 0; @@ -362,13 +359,51 @@ int MenuActionUpdateSlider::calcNewSliderValue(Common::String &text, int newOffs } else { newSliderValue = newOffset - (start + 1); } - - text.setChar('~', currentPosition); - text.setChar('|', start + 1 + newSliderValue); - return newSliderValue; } return currentPosition - start - 1; } +void MenuActionUpdateSlider::setSliderValue(uint8 newValue) { + int start = 0; + Common::String text = _menuItem->getText(); + for(int i = 0; i < text.size(); i++) { + switch (text[i]) { + case '{' : start = i; break; + case '|' : text.setChar('~', i); break; + default: break; + } + } + + text.setChar('|', start + newValue + 1); + + _menuItem->setText(text); + _menuSystem->redrawMenuText(menu); + + switch(_type) { + case SFX : _vm->_soundMan->setSfxVolume(newValue * (255/15)); break; + case MUSIC : _vm->_soundMan->setMusicVolume(newValue * (255/15)); break; + case VOICE : _vm->_soundMan->setSpeechVolume(newValue * (255/15)); break; + case TEXT_DURATION : break; // TODO + default: break; + } +} + +MenuActionResetOptionSliders::MenuActionResetOptionSliders(BaseMenuSystem *menuSystem, + MenuActionUpdateSlider *sfxSlider, + MenuActionUpdateSlider *musiclider, + MenuActionUpdateSlider *speechSlider, + MenuActionUpdateSlider *textDurationSlider) +: BaseMenuAction(menuSystem), _sfxSlider(sfxSlider), _musiclider(musiclider), + _speechSlider(speechSlider), _textDurationSlider(textDurationSlider) { + +} + +void MenuActionResetOptionSliders::execute() { + _sfxSlider->setSliderValue(11); + _musiclider->setSliderValue(11); + _speechSlider->setSliderValue(15); + _textDurationSlider->setSliderValue(0); +} + } // End of namespace Illusions diff --git a/engines/illusions/duckman/menusystem_duckman.h b/engines/illusions/duckman/menusystem_duckman.h index 3ebab4dea4..5b3cd55758 100644 --- a/engines/illusions/duckman/menusystem_duckman.h +++ b/engines/illusions/duckman/menusystem_duckman.h @@ -49,8 +49,9 @@ namespace Illusions { }; class IllusionsEngine_Duckman; +class MenuActionUpdateSlider; -class DuckmanMenuSystem : public BaseMenuSystem { + class DuckmanMenuSystem : public BaseMenuSystem { public: DuckmanMenuSystem(IllusionsEngine_Duckman *vm); ~DuckmanMenuSystem(); @@ -66,7 +67,6 @@ public://protected: BaseMenu *createMainMenu(); BaseMenu *createLoadGameMenu(); BaseMenu *createOptionsMenu(); - MenuItem *createOptionsSliderMenuItem(const Common::String &text, SliderActionType type, BaseMenu *baseMenu); BaseMenu *createPauseMenu(); BaseMenu *createQueryRestartMenu(); BaseMenu *createQueryQuitMenu(); @@ -80,7 +80,10 @@ public://protected: virtual void setGameState(int gameState); virtual void setMenuCursorNum(int cursorNum); virtual void playSoundEffect(int sfxId); -}; +private: + MenuItem *createOptionsSliderMenuItem(MenuActionUpdateSlider **action, const Common::String &text, + SliderActionType type, BaseMenu *baseMenu); + }; class MenuActionInventoryAddRemove : public BaseMenuAction { public: @@ -94,17 +97,34 @@ protected: class MenuActionUpdateSlider : public BaseMenuAction { public: MenuActionUpdateSlider(BaseMenuSystem *menuSystem, BaseMenu *baseMenu, SliderActionType type, IllusionsEngine_Duckman *vm); - void setMenuItem(MenuItem *newMmenuItem) { - menuItem = newMmenuItem; + void setMenuItem(MenuItem *menuItem) { + _menuItem = menuItem; } virtual void execute(); + void setSliderValue(uint8 newValue); protected: IllusionsEngine_Duckman *_vm; SliderActionType _type; - MenuItem *menuItem; + MenuItem *_menuItem; BaseMenu *menu; - int calcNewSliderValue(Common::String &text, int newOffset); + int calcNewSliderValue(int newOffset); +}; + +class MenuActionResetOptionSliders : public BaseMenuAction { +public: + MenuActionResetOptionSliders(BaseMenuSystem *menuSystem, + MenuActionUpdateSlider *sfxSlider, + MenuActionUpdateSlider *musiclider, + MenuActionUpdateSlider *speechSlider, + MenuActionUpdateSlider *textDurationSlider + ); + virtual void execute(); +protected: + MenuActionUpdateSlider *_sfxSlider; + MenuActionUpdateSlider *_musiclider; + MenuActionUpdateSlider *_speechSlider; + MenuActionUpdateSlider *_textDurationSlider; }; } // End of namespace Illusions -- cgit v1.2.3