void MenuSystem::changeVolumeBar(ItemID itemID, int delta) { int *volume, newVolume; switch (itemID) { case kItemIdMaster: volume = &_cfgMasterVolume; break; case kItemIdVoices: volume = &_cfgVoicesVolume; break; case kItemIdMusic: volume = &_cfgMusicVolume; break; case kItemIdSoundFX: volume = &_cfgSoundFXVolume; break; case kItemIdBackground: volume = &_cfgBackgroundVolume; break; default: return; } newVolume = CLIP(*volume + delta, 0, 20); if (newVolume != *volume) { *volume = newVolume; drawVolumeBar(itemID); } }
void MenuSystem::changeVolumeBar(ItemID itemID, int delta) { byte newVolume; switch (itemID) { case kItemIdVoices: _vm->_cfgVoicesVolume = CLIP(_vm->_cfgVoicesVolume + delta, 0, 20); // Always round volume up instead of down. newVolume = (_vm->_cfgVoicesVolume * Audio::Mixer::kMaxChannelVolume + 19) / 20; _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, newVolume); ConfMan.setInt("speech_volume", newVolume); break; case kItemIdMusic: _vm->_cfgMusicVolume = CLIP(_vm->_cfgMusicVolume + delta, 0, 20); newVolume = (_vm->_cfgMusicVolume * Audio::Mixer::kMaxChannelVolume + 19) / 20; _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, newVolume); ConfMan.setInt("music_volume", newVolume); break; case kItemIdSoundFX: _vm->_cfgSoundFXVolume = CLIP(_vm->_cfgSoundFXVolume + delta, 0, 20); newVolume = (_vm->_cfgSoundFXVolume * Audio::Mixer::kMaxChannelVolume + 19) / 20; _vm->_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, newVolume); ConfMan.setInt("sfx_volume", newVolume); break; case kItemIdMaster: case kItemIdBackground: // unused in ScummVM break; default: return; } _vm->syncSoundSettings(); drawVolumeBar(itemID); }
void MenuSystem::initMenu(MenuID menuID) { int newSlotNum; _items.clear(); memcpy(_vm->_screen->_frontScreen, _background->pixels, 640 * 400); switch (menuID) { case kMenuIdMain: drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrWhatCanIDoForYou)); addClickTextItem(kItemIdLoad, 0, 115, 320, 0, _vm->getSysString(kStrLoad), 229, 255); addClickTextItem(kItemIdSave, 0, 135, 320, 0, _vm->getSysString(kStrSave), 229, 255); addClickTextItem(kItemIdToggleText, 0, 165, 320, 0, _vm->getSysString(kStrTextOn), 229, 255); addClickTextItem(kItemIdToggleVoices, 0, 185, 320, 0, _vm->getSysString(kStrVoicesOn), 229, 255); addClickTextItem(kItemIdVolumesMenu, 0, 215, 320, 0, _vm->getSysString(kStrVolume), 229, 255); addClickTextItem(kItemIdPlay, 0, 245, 320, 0, _vm->getSysString(kStrPlay), 229, 255); addClickTextItem(kItemIdQuit, 0, 275, 320, 0, _vm->getSysString(kStrQuit), 229, 255); break; case kMenuIdLoad: drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrLoadGame)); addClickTextItem(kItemIdSavegameUp, 0, 155, 545, 1, "^", 255, 253); addClickTextItem(kItemIdSavegameDown, 0, 195, 545, 1, "\\", 255, 253); addClickTextItem(kItemIdCancel, 0, 275, 320, 0, _vm->getSysString(kStrCancel), 255, 253); for (int i = 1; i <= 7; i++) { Common::String saveDesc = Common::String::format("SAVEGAME %d", i); addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 115 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); } loadSavegamesList(); setSavegameCaptions(); break; case kMenuIdSave: drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrSaveGame)); addClickTextItem(kItemIdSavegameUp, 0, 155, 545, 1, "^", 255, 253); addClickTextItem(kItemIdSavegameDown, 0, 195, 545, 1, "\\", 255, 253); addClickTextItem(kItemIdCancel, 0, 275, 320, 0, _vm->getSysString(kStrCancel), 255, 253); for (int i = 1; i <= 7; i++) { Common::String saveDesc = Common::String::format("SAVEGAME %d", i); addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 115 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); } newSlotNum = loadSavegamesList() + 1; _savegames.push_back(SavegameItem(newSlotNum, Common::String::format("GAME %03d", _savegames.size() + 1))); setSavegameCaptions(); break; case kMenuIdVolumes: drawString(0, 74, 320, 1, 229, _vm->getSysString(kStrAdjustVolume)); drawString(0, 130, 200, 0, 246, _vm->getSysString(kStrMaster)); drawString(0, 155, 200, 0, 244, _vm->getSysString(kStrVoices)); drawString(0, 180, 200, 0, 244, _vm->getSysString(kStrMusic)); drawString(0, 205, 200, 0, 244, _vm->getSysString(kStrSoundFx)); drawString(0, 230, 200, 0, 244, _vm->getSysString(kStrBackground)); addClickTextItem(kItemIdDone, 0, 275, 200, 0, _vm->getSysString(kStrDone), 229, 253); addClickTextItem(kItemIdCancel, 0, 275, 440, 0, _vm->getSysString(kStrCancel), 229, 253); addClickTextItem(kItemIdMasterDown, 0, 130 + 25 * 0, 348, 1, "[", 229, 253); addClickTextItem(kItemIdVoicesDown, 0, 130 + 25 * 1, 348, 1, "[", 229, 253); addClickTextItem(kItemIdMusicDown, 0, 130 + 25 * 2, 348, 1, "[", 229, 253); addClickTextItem(kItemIdSoundFXDown, 0, 130 + 25 * 3, 348, 1, "[", 229, 253); addClickTextItem(kItemIdBackgroundDown, 0, 130 + 25 * 4, 348, 1, "[", 229, 253); addClickTextItem(kItemIdMasterUp, 0, 130 + 25 * 0, 372, 1, "]", 229, 253); addClickTextItem(kItemIdVoicesUp, 0, 130 + 25 * 1, 372, 1, "]", 229, 253); addClickTextItem(kItemIdMusicUp, 0, 130 + 25 * 2, 372, 1, "]", 229, 253); addClickTextItem(kItemIdSoundFXUp, 0, 130 + 25 * 3, 372, 1, "]", 229, 253); addClickTextItem(kItemIdBackgroundUp, 0, 130 + 25 * 4, 372, 1, "]", 229, 253); drawVolumeBar(kItemIdMaster); drawVolumeBar(kItemIdVoices); drawVolumeBar(kItemIdMusic); drawVolumeBar(kItemIdSoundFX); drawVolumeBar(kItemIdBackground); break; default: break; } for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); iter++) { drawItem((*iter).id, false); } }
void MenuSystem::initMenu(MenuID menuID) { _items.clear(); memcpy(_vm->_screen->_frontScreen, _background->getPixels(), 640 * 400); switch (menuID) { case kMenuIdMain: drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrWhatCanIDoForYou)); addClickTextItem(kItemIdLoad, 0, 116, 320, 0, _vm->getSysString(kStrLoad), 253, 255); addClickTextItem(kItemIdSave, 0, 136, 320, 0, _vm->getSysString(kStrSave), 253, 255); addClickTextItem(kItemIdToggleText, 0, 166, 320, 0, _vm->getSysString(_vm->_cfgText ? kStrTextOn : kStrTextOff), 253, 255); addClickTextItem(kItemIdToggleVoices, 0, 186, 320, 0, _vm->getSysString(_vm->_cfgVoices ? kStrVoicesOn : kStrVoicesOff), 253, 255); addClickTextItem(kItemIdVolumesMenu, 0, 216, 320, 0, _vm->getSysString(kStrVolume), 253, 255); addClickTextItem(kItemIdPlay, 0, 246, 320, 0, _vm->getSysString(kStrPlay), 253, 255); addClickTextItem(kItemIdQuit, 0, 276, 320, 0, _vm->getSysString(kStrQuit), 253, 255); break; case kMenuIdLoad: if (ConfMan.getBool("originalsaveload")) { shadeRect(80, 92, 440, 141, 226, 225); drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrLoadGame)); addClickTextItem(kItemIdSavegameUp, 0, 156, 545, 1, "^", 253, 255); addClickTextItem(kItemIdSavegameDown, 0, 196, 545, 1, "\\", 253, 255); addClickTextItem(kItemIdCancel, 0, 276, 320, 0, _vm->getSysString(kStrCancel), 253, 255); for (int i = 1; i <= 7; i++) { Common::String saveDesc = Common::String::format("SAVEGAME %d", i); addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 116 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); } loadSavegamesList(); setSavegameCaptions(true); } else { GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Restore game:"), _("Restore"), false); int slot = dialog->runModalWithCurrentTarget(); delete dialog; if (slot >= 0) _vm->requestLoadgame(slot); _running = false; } break; case kMenuIdSave: if (ConfMan.getBool("originalsaveload")) { shadeRect(80, 92, 440, 141, 226, 225); drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrSaveGame)); addClickTextItem(kItemIdSavegameUp, 0, 156, 545, 1, "^", 253, 255); addClickTextItem(kItemIdSavegameDown, 0, 196, 545, 1, "\\", 253, 255); addClickTextItem(kItemIdCancel, 0, 276, 320, 0, _vm->getSysString(kStrCancel), 253, 255); for (int i = 1; i <= 7; i++) { Common::String saveDesc = Common::String::format("SAVEGAME %d", i); addClickTextItem((ItemID)(kItemIdSavegame1 + i - 1), 0, 116 + 20 * (i - 1), 300, 0, saveDesc.c_str(), 231, 234); } int newSlotNum = loadSavegamesList() + 1; _savegames.push_back(SavegameItem(newSlotNum, Common::String::format("GAME %04d", _savegames.size()))); setSavegameCaptions(true); } else { GUI::SaveLoadChooser *dialog = new GUI::SaveLoadChooser(_("Save game:"), _("Save"), true); int slot = dialog->runModalWithCurrentTarget(); Common::String desc = dialog->getResultString(); if (desc.empty()) { // Create our own description for the saved game, the user didn't enter one desc = dialog->createDefaultSaveDescription(slot); } if (slot >= 0) _vm->requestSavegame(slot, desc); _running = false; } break; case kMenuIdVolumes: drawString(0, 75, 320, 1, 229, _vm->getSysString(kStrAdjustVolume)); drawString(0, 131, 200, 0, 246, _vm->getSysString(kStrMaster)); drawString(0, 156, 200, 0, 244, _vm->getSysString(kStrVoices)); drawString(0, 181, 200, 0, 244, _vm->getSysString(kStrMusic)); drawString(0, 206, 200, 0, 244, _vm->getSysString(kStrSoundFx)); drawString(0, 231, 200, 0, 244, _vm->getSysString(kStrBackground)); addClickTextItem(kItemIdDone, 0, 276, 200, 0, _vm->getSysString(kStrDone), 253, 255); addClickTextItem(kItemIdCancel, 0, 276, 440, 0, _vm->getSysString(kStrCancel), 253, 255); addClickTextItem(kItemIdMasterDown, 0, 131 + 25 * 0, 348, 1, "[", 243, 246); addClickTextItem(kItemIdVoicesDown, 0, 131 + 25 * 1, 348, 1, "[", 243, 246); addClickTextItem(kItemIdMusicDown, 0, 131 + 25 * 2, 348, 1, "[", 243, 246); addClickTextItem(kItemIdSoundFXDown, 0, 131 + 25 * 3, 348, 1, "[", 243, 246); addClickTextItem(kItemIdBackgroundDown, 0, 131 + 25 * 4, 348, 1, "[", 243, 246); addClickTextItem(kItemIdMasterUp, 0, 131 + 25 * 0, 372, 1, "]", 243, 246); addClickTextItem(kItemIdVoicesUp, 0, 131 + 25 * 1, 372, 1, "]", 243, 246); addClickTextItem(kItemIdMusicUp, 0, 131 + 25 * 2, 372, 1, "]", 243, 246); addClickTextItem(kItemIdSoundFXUp, 0, 131 + 25 * 3, 372, 1, "]", 243, 246); addClickTextItem(kItemIdBackgroundUp, 0, 131 + 25 * 4, 372, 1, "]", 243, 246); drawVolumeBar(kItemIdMaster); drawVolumeBar(kItemIdVoices); drawVolumeBar(kItemIdMusic); drawVolumeBar(kItemIdSoundFX); drawVolumeBar(kItemIdBackground); break; default: break; } for (Common::Array<Item>::iterator iter = _items.begin(); iter != _items.end(); ++iter) { if ((*iter).enabled) drawItem((*iter).id, false); } // Check if the mouse is already over an item _currItemID = kItemIdNone; Common::Point mousePos = _vm->_system->getEventManager()->getMousePos(); handleMouseMove(mousePos.x, mousePos.y); }