From 3d0775bd8987c6d5a80da18a4d97eaf6d3adb77e Mon Sep 17 00:00:00 2001 From: Benjamin Haisch Date: Wed, 9 Dec 2009 11:39:40 +0000 Subject: TOLTECS: More work on the menu --- engines/toltecs/menu.cpp | 192 ++++++++++++++++++++++++++++++++++++++++++----- engines/toltecs/menu.h | 27 ++++++- engines/toltecs/screen.h | 2 + 3 files changed, 198 insertions(+), 23 deletions(-) (limited to 'engines') diff --git a/engines/toltecs/menu.cpp b/engines/toltecs/menu.cpp index 55cd755eb9..a82477bc73 100644 --- a/engines/toltecs/menu.cpp +++ b/engines/toltecs/menu.cpp @@ -40,17 +40,35 @@ namespace Toltecs { MenuSystem::MenuSystem(ToltecsEngine *vm) : _vm(vm) { - _background = new Graphics::Surface(); - _background->create(520, 240, 1); _currMenuID = kMenuIdNone; _newMenuID = kMenuIdMain; _currItemID = kItemIdNone; _cfgText = true; _cfgVoices = true; + _cfgMasterVolume = 10; + _cfgVoicesVolume = 10; + _cfgMusicVolume = 10; + _cfgSoundFXVolume = 10; + _cfgBackgroundVolume = 10; } MenuSystem::~MenuSystem() { +} + +int MenuSystem::run() { + + _background = new Graphics::Surface(); + _background->create(640, 400, 1); + + memcpy(_background->pixels, _vm->_screen->_frontScreen, 640 * 400); + + while (1) { + update(); + _vm->updateScreen(); + } + delete _background; + } void MenuSystem::update() { @@ -94,7 +112,7 @@ void MenuSystem::handleEvents() { } -void MenuSystem::addClickTextItem(ItemID id, int x, int y, int w, const byte *caption, byte defaultColor, byte activeColor) { +void MenuSystem::addClickTextItem(ItemID id, int x, int y, int w, uint fontNum, const byte *caption, byte defaultColor, byte activeColor) { Item item; item.id = id; item.defaultColor = defaultColor; @@ -102,6 +120,7 @@ void MenuSystem::addClickTextItem(ItemID id, int x, int y, int w, const byte *ca item.x = x; item.y = y; item.w = w; + item.fontNum = fontNum; setItemCaption(&item, caption); _items.push_back(item); } @@ -110,7 +129,7 @@ void MenuSystem::drawItem(ItemID itemID, bool active) { Item *item = getItem(itemID); if (item) { byte color = active ? item->activeColor : item->defaultColor; - drawString(item->rect.left, item->rect.top, 0, color, (byte*)item->caption.c_str()); + drawString(item->rect.left, item->rect.top, 0, item->fontNum, color, (byte*)item->caption.c_str()); } } @@ -145,13 +164,12 @@ MenuSystem::Item *MenuSystem::getItem(ItemID id) { } void MenuSystem::setItemCaption(Item *item, const byte *caption) { - Font font(_vm->_res->load(kFontResourceIndex)->data); + Font font(_vm->_res->load(_vm->_screen->getFontResIndex(item->fontNum))->data); int width = font.getTextWidth((byte*)caption); int height = font.getHeight(); item->rect = Common::Rect(item->x, item->y, item->x + width, item->y + height); if (item->w) { item->rect.translate(item->w - width / 2, 0); - debug("item->rect.width() = %d", item->rect.width()); } item->caption = (const char*)caption; } @@ -160,20 +178,43 @@ void MenuSystem::initMenu(MenuID menuID) { _items.clear(); + memcpy(_vm->_screen->_frontScreen, _background->pixels, 640 * 400); + switch (menuID) { case kMenuIdMain: - drawString(0, 74, 320, 229, (byte*)"What can I do for you?"); - addClickTextItem(kItemIdLoad, 0, 115, 320, (const byte*)"LOAD", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdSave, 0, 135, 320, (const byte*)"SAVE", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdToggleText, 0, 165, 320, (const byte*)"TEXT ON", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdToggleVoices, 0, 185, 320, (const byte*)"VOICES ON", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdVolumesMenu, 0, 215, 320, (const byte*)"VOLUME", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdPlay, 0, 245, 320, (const byte*)"PLAY", kFontColorMenuDefault, kFontColorMenuActive); - addClickTextItem(kItemIdQuit, 0, 275, 320, (const byte*)"QUIT", kFontColorMenuDefault, kFontColorMenuActive); + drawString(0, 74, 320, 1, 229, (byte*)"What can I do for you?"); + addClickTextItem(kItemIdLoad, 0, 115, 320, 0, (const byte*)"LOAD", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdSave, 0, 135, 320, 0, (const byte*)"SAVE", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdToggleText, 0, 165, 320, 0, (const byte*)"TEXT ON", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdToggleVoices, 0, 185, 320, 0, (const byte*)"VOICES ON", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdVolumesMenu, 0, 215, 320, 0, (const byte*)"VOLUME", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdPlay, 0, 245, 320, 0, (const byte*)"PLAY", kFontColorMenuDefault, kFontColorMenuActive); + addClickTextItem(kItemIdQuit, 0, 275, 320, 0, (const byte*)"QUIT GAME", kFontColorMenuDefault, kFontColorMenuActive); break; case kMenuIdVolumes: - addClickTextItem(kItemIdCancel, 0, 275, 440, (const byte*)"CANCEL", kFontColorMenuDefault, 253); - addClickTextItem(kItemIdCancel, 0, 275, 440, (const byte*)"CANCEL", kFontColorMenuDefault, 253); + drawString(0, 74, 320, 1, 229, (byte*)"Adjust volume"); + drawString(0, 130, 200, 0, 244, (byte*)"Master"); + drawString(0, 155, 200, 0, 244, (byte*)"Voices"); + drawString(0, 180, 200, 0, 244, (byte*)"Music"); + drawString(0, 205, 200, 0, 244, (byte*)"Sound FX"); + drawString(0, 230, 200, 0, 244, (byte*)"Background"); + addClickTextItem(kItemIdDone, 0, 275, 200, 0, (const byte*)"DONE", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdCancel, 0, 275, 440, 0, (const byte*)"CANCEL", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdMasterDown, 0, 130 + 25 * 0, 348, 1, (const byte*)"[", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdVoicesDown, 0, 130 + 25 * 1, 348, 1, (const byte*)"[", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdMusicDown, 0, 130 + 25 * 2, 348, 1, (const byte*)"[", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdSoundFXDown, 0, 130 + 25 * 3, 348, 1, (const byte*)"[", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdBackgroundDown, 0, 130 + 25 * 4, 348, 1, (const byte*)"[", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdMasterUp, 0, 130 + 25 * 0, 372, 1, (const byte*)"]", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdVoicesUp, 0, 130 + 25 * 1, 372, 1, (const byte*)"]", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdMusicUp, 0, 130 + 25 * 2, 372, 1, (const byte*)"]", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdSoundFXUp, 0, 130 + 25 * 3, 372, 1, (const byte*)"]", kFontColorMenuDefault, 253); + addClickTextItem(kItemIdBackgroundUp, 0, 130 + 25 * 4, 372, 1, (const byte*)"]", kFontColorMenuDefault, 253); + drawVolumeBar(kItemIdMaster); + drawVolumeBar(kItemIdVoices); + drawVolumeBar(kItemIdMusic); + drawVolumeBar(kItemIdSoundFX); + drawVolumeBar(kItemIdBackground); break; default: break; @@ -220,6 +261,36 @@ void MenuSystem::clickItem(ItemID id) { debug("kItemIdQuit"); break; // Volumes menu + case kItemIdMasterUp: + changeVolumeBar(kItemIdMaster, +1); + break; + case kItemIdVoicesUp: + changeVolumeBar(kItemIdVoices, +1); + break; + case kItemIdMusicUp: + changeVolumeBar(kItemIdMusic, +1); + break; + case kItemIdSoundFXUp: + changeVolumeBar(kItemIdSoundFX, +1); + break; + case kItemIdBackgroundUp: + changeVolumeBar(kItemIdBackground, +1); + break; + case kItemIdMasterDown: + changeVolumeBar(kItemIdMaster, -1); + break; + case kItemIdVoicesDown: + changeVolumeBar(kItemIdVoices, -1); + break; + case kItemIdMusicDown: + changeVolumeBar(kItemIdMusic, -1); + break; + case kItemIdSoundFXDown: + changeVolumeBar(kItemIdSoundFX, -1); + break; + case kItemIdBackgroundDown: + changeVolumeBar(kItemIdBackground, -1); + break; case kItemIdCancel: _newMenuID = kMenuIdMain; break; @@ -235,12 +306,23 @@ void MenuSystem::saveBackground() { void MenuSystem::restoreBackground() { } -void MenuSystem::drawString(int16 x, int16 y, int w, byte color, byte *text) { +void MenuSystem::restoreRect(int x, int y, int w, int h) { + byte *src = (byte*)_background->getBasePtr(x, y); + byte *dst = _vm->_screen->_frontScreen + x + y * 640; + while (h--) { + memcpy(dst, src, w); + src += 640; + dst += 640; + } +} + +void MenuSystem::drawString(int16 x, int16 y, int w, uint fontNum, byte color, byte *text) { + fontNum = _vm->_screen->getFontResIndex(fontNum); if (w) { - Font font(_vm->_res->load(kFontResourceIndex)->data); + Font font(_vm->_res->load(fontNum)->data); x = x + w - font.getTextWidth(text) / 2; } - _vm->_screen->drawString(x, y, color, kFontResourceIndex, text, -1, NULL, true); + _vm->_screen->drawString(x, y, color, fontNum, text, -1, NULL, true); } void MenuSystem::setCfgText(bool value, bool active) { @@ -267,4 +349,76 @@ void MenuSystem::setCfgVoices(bool value, bool active) { } } +void MenuSystem::drawVolumeBar(ItemID itemID) { + int w = 440, y, volume; + char text[21]; + + switch (itemID) { + case kItemIdMaster: + y = 130 + 25 * 0; + volume = _cfgMasterVolume; + break; + case kItemIdVoices: + y = 130 + 25 * 1; + volume = _cfgVoicesVolume; + break; + case kItemIdMusic: + y = 130 + 25 * 2; + volume = _cfgMusicVolume; + break; + case kItemIdSoundFX: + y = 130 + 25 * 3; + volume = _cfgSoundFXVolume; + break; + case kItemIdBackground: + y = 130 + 25 * 4; + volume = _cfgBackgroundVolume; + break; + default: + return; + } + + restoreRect(390, y, 100, 25); + + for (int i = 0; i < volume; i++) + text[i] = '|'; + text[volume] = 0; + + drawString(0, y, w, 0, 246, (byte*)text); + +} + +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); + } + +} + } // End of namespace Toltecs diff --git a/engines/toltecs/menu.h b/engines/toltecs/menu.h index 9cb839ad7b..41541a88e9 100644 --- a/engines/toltecs/menu.h +++ b/engines/toltecs/menu.h @@ -48,7 +48,6 @@ namespace Toltecs { const byte kFontColorMenuDefault = 229; const byte kFontColorMenuActive = 255; -const uint kFontResourceIndex = 13; enum MenuID { kMenuIdNone, @@ -69,7 +68,21 @@ enum ItemID { kItemIdPlay, kItemIdQuit, // Volumes menu - // TODO: Up/down buttons + kItemIdMasterUp, + kItemIdVoicesUp, + kItemIdMusicUp, + kItemIdSoundFXUp, + kItemIdBackgroundUp, + kItemIdMasterDown, + kItemIdVoicesDown, + kItemIdMusicDown, + kItemIdSoundFXDown, + kItemIdBackgroundDown, + kItemIdMaster, + kItemIdVoices, + kItemIdMusic, + kItemIdSoundFX, + kItemIdBackground, kItemIdDone, kItemIdCancel, // Save/load menu @@ -83,6 +96,7 @@ public: MenuSystem(ToltecsEngine *vm); ~MenuSystem(); + int run(); void update(); void handleEvents(); @@ -95,6 +109,7 @@ protected: Common::String caption; byte defaultColor, activeColor; int x, y, w; + uint fontNum; }; ToltecsEngine *_vm; @@ -106,8 +121,9 @@ protected: Common::Array _items; bool _cfgText, _cfgVoices; + int _cfgMasterVolume, _cfgVoicesVolume, _cfgMusicVolume, _cfgSoundFXVolume, _cfgBackgroundVolume; - void addClickTextItem(ItemID id, int x, int y, int w, const byte *caption, byte defaultColor, byte activeColor); + void addClickTextItem(ItemID id, int x, int y, int w, uint fontNum, const byte *caption, byte defaultColor, byte activeColor); void drawItem(ItemID itemID, bool active); void handleMouseMove(int x, int y); @@ -125,10 +141,13 @@ protected: void saveBackground(); void restoreBackground(); - void drawString(int16 x, int16 y, int w, byte color, byte *text); + void restoreRect(int x, int y, int w, int h); + void drawString(int16 x, int16 y, int w, uint fontNum, byte color, byte *text); void setCfgText(bool value, bool active); void setCfgVoices(bool value, bool active); + void drawVolumeBar(ItemID itemID); + void changeVolumeBar(ItemID itemID, int delta); }; diff --git a/engines/toltecs/screen.h b/engines/toltecs/screen.h index ff27bb2ba5..c9a70607fe 100644 --- a/engines/toltecs/screen.h +++ b/engines/toltecs/screen.h @@ -214,6 +214,8 @@ public: void saveState(Common::WriteStream *out); void loadState(Common::ReadStream *in); + uint getFontResIndex(int fontNum) const { return _fontResIndexArray[fontNum]; } + //protected: public: -- cgit v1.2.3