aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorBenjamin Haisch2009-12-09 11:39:40 +0000
committerWillem Jan Palenstijn2011-11-20 22:43:08 +0100
commit3d0775bd8987c6d5a80da18a4d97eaf6d3adb77e (patch)
tree0535e94b4a9e6662242efed4efa31dda69620d91 /engines
parent284c358f7cab64b112770d66c090cb879897504e (diff)
downloadscummvm-rg350-3d0775bd8987c6d5a80da18a4d97eaf6d3adb77e.tar.gz
scummvm-rg350-3d0775bd8987c6d5a80da18a4d97eaf6d3adb77e.tar.bz2
scummvm-rg350-3d0775bd8987c6d5a80da18a4d97eaf6d3adb77e.zip
TOLTECS: More work on the menu
Diffstat (limited to 'engines')
-rw-r--r--engines/toltecs/menu.cpp192
-rw-r--r--engines/toltecs/menu.h27
-rw-r--r--engines/toltecs/screen.h2
3 files changed, 198 insertions, 23 deletions
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<Item> _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: