#include "menu_system.h" #include "game.h" #include "script_system.h" void MenuSystem::tick(double dt) { pauseAnimation_.tick(dt); menuChangeAnimation_.tick(dt); if (openState_ == OpenState::Animating && pauseAnimation_.isComplete()) { if (pauseAnimation_.getProgress() == 0.0) { openState_ = OpenState::Closed; menus_.clear(); game_.unpauseGameplay(); game_.getMixer().unpauseSounds(); } else if (pauseAnimation_.getProgress() == 1.0) { openState_ = OpenState::Open; } } else if (openState_ == OpenState::Open) { if (!isMenuChanging_) { cursorBobTimer_.accumulate(dt); while (cursorBobTimer_.step()) { if (cursorBobDown_) { cursorBob_++; if (cursorBob_ >= 4) { cursorBobDown_ = false; } } else { cursorBob_--; if (cursorBob_ <= 0) { cursorBobDown_ = true; } } } } else if (menuChangeAnimation_.isComplete()) { isMenuChanging_ = false; if (menuChangeAnimation_.getProgress() == 0.0) { menus_.pop_back(); } } } } void MenuSystem::openPauseMenu() { pauseAnimation_.start(125, 1.0); openState_ = OpenState::Animating; game_.pauseGameplay(); std::vector builders = { MenuBuilder().Command("Settings") .ActivationFunction([this] (Game&) { openSubmenu(Menu({ MenuBuilder().Slider("Music Volume: ") .InitialValue(game_.getMixer().isMusicMuted() ? 0 : game_.getMixer().getMusicVolume()) .MaxValue(10) .SelectionChangedFunction([this] (MenuItem& menuItem) { if (game_.getMixer().isMusicMuted()) { menuItem.value = game_.getMixer().getMusicVolume(); } game_.getMixer().setMusicVolume(menuItem.value); }), MenuBuilder().Slider("Sound Volume: ") .InitialValue(game_.getMixer().getSoundVolume()) .MaxValue(10) .SelectionChangedFunction([this] (MenuItem& menuItem) { game_.getMixer().setSoundVolume(menuItem.value); }), MenuBuilder().Command("Back") .ActivationFunction([this] (Game& game) { closePauseMenu(); }) .SkipSoundEffect() })); }), MenuBuilder().Command("Resume Game") .ActivationFunction([] (Game& game) { game.getSystem().closePauseMenu(); }) .SkipSoundEffect(), MenuBuilder().Command("Quit") .ActivationFunction([] (Game& game) { game.quit(); }) }; if (game_.getMap().hasExitArea()) { builders.push_back(MenuBuilder().Command("Exit Area") .ActivationFunction([] (Game& game) { game.getSystem().closePauseMenu(false); game.getSystem().runScript(game.getMap().getName(), "exit_area"); })); } menus_.emplace_back(builders); game_.getMixer().pauseSounds(); game_.getMixer().playSound("../res/sfx/menu_open.wav"); } void MenuSystem::closePauseMenu(bool playSfx) { if (menus_.size() > 1) { isMenuChanging_ = true; menuChangeAnimation_.start(250, 0.0); if (playSfx) { game_.getMixer().playSound("../res/sfx/menu_deselect.wav"); } } else { pauseAnimation_.start(125, 0.0); openState_ = OpenState::Animating; if (playSfx) { game_.getMixer().playSound("../res/sfx/menu_close.wav"); } } } void MenuSystem::pressedUp() { menus_.back().moveCursorUp(); cursorBob_ = 0; cursorBobDown_ = true; game_.getMixer().playSound("../res/sfx/vertical_menu.wav"); } void MenuSystem::pressedDown() { menus_.back().moveCursorDown(); cursorBob_ = 0; cursorBobDown_ = true; game_.getMixer().playSound("../res/sfx/vertical_menu.wav"); } void MenuSystem::pressedLeft() { Menu& curMenu = menus_.back(); MenuItem& menuItem = curMenu.getItems()[curMenu.getCursorPosition()]; if (menuItem.type == MenuType::Slider && menuItem.value > 0) { menuItem.value--; if (menuItem.selectionChanged) { menuItem.selectionChanged(menuItem); } game_.getMixer().playSound("../res/sfx/horizontal_menu.wav"); } } void MenuSystem::pressedRight() { Menu& curMenu = menus_.back(); MenuItem& menuItem = curMenu.getItems()[curMenu.getCursorPosition()]; if (menuItem.type == MenuType::Slider && menuItem.value < menuItem.maxValue) { menuItem.value++; if (menuItem.selectionChanged) { menuItem.selectionChanged(menuItem); } game_.getMixer().playSound("../res/sfx/horizontal_menu.wav"); } } void MenuSystem::activateOption() { Menu& curMenu = menus_.back(); const MenuItem& menuItem = curMenu.getItems()[curMenu.getCursorPosition()]; if (menuItem.type == MenuType::Command) { if (menuItem.playSfx) { game_.getMixer().playSound("../res/sfx/menu_activate.wav"); } if (menuItem.activationFunction) { menuItem.activationFunction(game_); } } } void MenuSystem::openSubmenu(Menu submenu) { menus_.push_back(std::move(submenu)); isMenuChanging_ = true; menuChangeAnimation_.start(250, 1.0); }