diff options
author | Johannes Schickel | 2007-07-29 16:28:25 +0000 |
---|---|---|
committer | Johannes Schickel | 2007-07-29 16:28:25 +0000 |
commit | bf5bb9280b1dc4a02b4c0ec9506a0723ed80b55e (patch) | |
tree | a7e6251693fdf7fc0709f58d43597de9a89cdb75 /engines/kyra/gui.cpp | |
parent | e2cf426be072c64185e95a2038c7ff72ec2058f3 (diff) | |
download | scummvm-rg350-bf5bb9280b1dc4a02b4c0ec9506a0723ed80b55e.tar.gz scummvm-rg350-bf5bb9280b1dc4a02b4c0ec9506a0723ed80b55e.tar.bz2 scummvm-rg350-bf5bb9280b1dc4a02b4c0ec9506a0723ed80b55e.zip |
- Restructure Kyrandia sourcecode (part 1, breaks compiling)
svn-id: r28294
Diffstat (limited to 'engines/kyra/gui.cpp')
-rw-r--r-- | engines/kyra/gui.cpp | 1640 |
1 files changed, 0 insertions, 1640 deletions
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp deleted file mode 100644 index fe051dd75c..0000000000 --- a/engines/kyra/gui.cpp +++ /dev/null @@ -1,1640 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "kyra/kyra.h" -#include "kyra/screen.h" -#include "kyra/script.h" -#include "kyra/text.h" -#include "kyra/animator.h" -#include "kyra/sound.h" - -#include "common/config-manager.h" -#include "common/savefile.h" -#include "common/events.h" -#include "common/system.h" - -namespace Kyra { - -void KyraEngine::registerDefaultSettings() { - // Most settings already have sensible defaults. This one, however, is - // specific to the Kyra engine. - ConfMan.registerDefault("walkspeed", 2); - ConfMan.registerDefault("cdaudio", _flags.platform == Common::kPlatformFMTowns); -} - -void KyraEngine::readSettings() { - int talkspeed = ConfMan.getInt("talkspeed"); - - // The default talk speed is 60. This should be mapped to "Normal". - - if (talkspeed == 0) - _configTextspeed = 3; // Clickable - if (talkspeed <= 50) - _configTextspeed = 0; // Slow - else if (talkspeed <= 150) - _configTextspeed = 1; // Normal - else - _configTextspeed = 2; // Fast - - _configWalkspeed = ConfMan.getInt("walkspeed"); - _configMusic = ConfMan.getBool("music_mute") ? 0 : ((ConfMan.getBool("cdaudio") && _flags.platform == Common::kPlatformFMTowns) ? 2 : 1); - _configSounds = ConfMan.getBool("sfx_mute") ? 0 : 1; - - _sound->enableMusic(_configMusic); - _sound->enableSFX(_configSounds); - - bool speechMute = ConfMan.getBool("speech_mute"); - bool subtitles = ConfMan.getBool("subtitles"); - - if (!speechMute && subtitles) - _configVoice = 2; // Voice & Text - else if (!speechMute && !subtitles) - _configVoice = 1; // Voice only - else - _configVoice = 0; // Text only - - setWalkspeed(_configWalkspeed); -} - -void KyraEngine::writeSettings() { - bool speechMute, subtitles; - int talkspeed; - - switch (_configTextspeed) { - case 0: // Slow - talkspeed = 1; - break; - case 1: // Normal - talkspeed = 60; - break; - case 2: // Fast - talkspeed = 255; - break; - default: // Clickable - talkspeed = 0; - break; - } - - ConfMan.setInt("talkspeed", talkspeed); - ConfMan.setInt("walkspeed", _configWalkspeed); - ConfMan.setBool("music_mute", _configMusic == 0); - ConfMan.setBool("cdaudio", _configMusic == 2); - ConfMan.setBool("sfx_mute", _configSounds == 0); - - switch (_configVoice) { - case 0: // Text only - speechMute = true; - subtitles = true; - break; - case 1: // Voice only - speechMute = false; - subtitles = false; - break; - default: // Voice & Text - speechMute = false; - subtitles = true; - break; - } - - if (!_configMusic) - _sound->beginFadeOut(); - - _sound->enableMusic(_configMusic); - _sound->enableSFX(_configSounds); - - ConfMan.setBool("speech_mute", speechMute); - ConfMan.setBool("subtitles", subtitles); - - ConfMan.flushToDisk(); -} - -void KyraEngine::initMainButtonList() { - _haveScrollButtons = false; - _buttonList = &_buttonData[0]; - for (int i = 0; _buttonDataListPtr[i]; ++i) - _buttonList = initButton(_buttonList, _buttonDataListPtr[i]); -} - -Button *KyraEngine::initButton(Button *list, Button *newButton) { - if (!newButton) - return list; - if (!list) - return newButton; - Button *cur = list; - - while (true) { - if (!cur->nextButton) - break; - cur = cur->nextButton; - } - - cur->nextButton = newButton; - return list; -} - -int KyraEngine::buttonInventoryCallback(Button *caller) { - int itemOffset = caller->specialValue - 2; - uint8 inventoryItem = _currentCharacter->inventoryItems[itemOffset]; - if (_itemInHand == -1) { - if (inventoryItem == 0xFF) { - snd_playSoundEffect(0x36); - return 0; - } else { - _screen->hideMouse(); - _screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12); - snd_playSoundEffect(0x35); - setMouseItem(inventoryItem); - updateSentenceCommand(_itemList[inventoryItem], _takenList[0], 179); - _itemInHand = inventoryItem; - _screen->showMouse(); - _currentCharacter->inventoryItems[itemOffset] = 0xFF; - } - } else { - if (inventoryItem != 0xFF) { - snd_playSoundEffect(0x35); - _screen->hideMouse(); - _screen->fillRect(_itemPosX[itemOffset], _itemPosY[itemOffset], _itemPosX[itemOffset] + 15, _itemPosY[itemOffset] + 15, 12); - _screen->drawShape(0, _shapes[216+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0); - setMouseItem(inventoryItem); - updateSentenceCommand(_itemList[inventoryItem], _takenList[1], 179); - _screen->showMouse(); - _currentCharacter->inventoryItems[itemOffset] = _itemInHand; - _itemInHand = inventoryItem; - } else { - snd_playSoundEffect(0x32); - _screen->hideMouse(); - _screen->drawShape(0, _shapes[216+_itemInHand], _itemPosX[itemOffset], _itemPosY[itemOffset], 0, 0); - _screen->setMouseCursor(1, 1, _shapes[0]); - updateSentenceCommand(_itemList[_itemInHand], _placedList[0], 179); - _screen->showMouse(); - _currentCharacter->inventoryItems[itemOffset] = _itemInHand; - _itemInHand = -1; - } - } - _screen->updateScreen(); - // XXX clearKyrandiaButtonIO - return 0; -} - -int KyraEngine::buttonAmuletCallback(Button *caller) { - if (!(_deathHandler & 8)) - return 1; - int jewel = caller->specialValue - 0x14; - if (_currentCharacter->sceneId == 210) { - if (_beadStateVar == 4 || _beadStateVar == 6) - return 1; - } - if (!queryGameFlag(0x2D)) - return 1; - if (_itemInHand != -1) { - assert(_putDownFirst); - characterSays(2000, _putDownFirst[0], 0, -2); - return 1; - } - if (queryGameFlag(0xF1)) { - assert(_waitForAmulet); - characterSays(2001, _waitForAmulet[0], 0, -2); - return 1; - } - if (!queryGameFlag(0x55+jewel)) { - assert(_blackJewel); - _animator->makeBrandonFaceMouse(); - drawJewelPress(jewel, 1); - characterSays(2002, _blackJewel[0], 0, -2); - return 1; - } - drawJewelPress(jewel, 0); - drawJewelsFadeOutStart(); - drawJewelsFadeOutEnd(jewel); - - _scriptInterpreter->initScript(_scriptClick, _scriptClickData); - _scriptClick->regs[3] = 0; - _scriptClick->regs[6] = jewel; - _scriptInterpreter->startScript(_scriptClick, 4); - - while (_scriptInterpreter->validScript(_scriptClick)) - _scriptInterpreter->runScript(_scriptClick); - - if (_scriptClick->regs[3]) - return 1; - - _unkAmuletVar = 1; - switch (jewel-1) { - case 0: - if (_brandonStatusBit & 1) { - seq_brandonHealing2(); - } else if (_brandonStatusBit == 0) { - seq_brandonHealing(); - assert(_healingTip); - characterSays(2003, _healingTip[0], 0, -2); - } - break; - - case 1: - seq_makeBrandonInv(); - break; - - case 2: - if (_brandonStatusBit & 1) { - assert(_wispJewelStrings); - characterSays(2004, _wispJewelStrings[0], 0, -2); - } else { - if (_brandonStatusBit & 2) { - // XXX - seq_makeBrandonNormal2(); - // XXX - } else { - // do not check for item in hand again as in the original since some strings are missing - // in the cd version - if (_currentCharacter->sceneId >= 109 && _currentCharacter->sceneId <= 198) { - snd_playWanderScoreViaMap(1, 0); - seq_makeBrandonWisp(); - snd_playWanderScoreViaMap(17, 0); - } else { - seq_makeBrandonWisp(); - } - setGameFlag(0x9E); - } - } - break; - - case 3: - seq_dispelMagicAnimation(); - assert(_magicJewelString); - characterSays(2007, _magicJewelString[0], 0, -2); - break; - - default: - break; - } - _unkAmuletVar = 0; - // XXX clearKyrandiaButtonIO (!used before every return in this function!) - return 1; -} - -void KyraEngine::processButtonList(Button *list) { - if (_haveScrollButtons) { - if (_mouseWheel < 0) - gui_scrollUp(&_scrollUpButton); - else if (_mouseWheel > 0) - gui_scrollDown(&_scrollDownButton); - } - while (list) { - if (list->flags & 8) { - list = list->nextButton; - continue; - } - - int x = list->x; - int y = list->y; - assert(list->dimTableIndex < _screen->_screenDimTableCount); - if (x < 0) { - x += _screen->_screenDimTable[list->dimTableIndex].w << 3; - } - x += _screen->_screenDimTable[list->dimTableIndex].sx << 3; - - if (y < 0) { - y += _screen->_screenDimTable[list->dimTableIndex].h; - } - y += _screen->_screenDimTable[list->dimTableIndex].sy; - - Common::Point mouse = getMousePos(); - if (mouse.x >= x && mouse.y >= y && x + list->width >= mouse.x && y + list->height >= mouse.y) { - int processMouseClick = 0; - if (list->flags & 0x400) { - if (_mousePressFlag) { - if (!(list->flags2 & 1)) { - list->flags2 |= 1; - list->flags2 |= 4; - processButton(list); - _screen->updateScreen(); - } - } else { - if (list->flags2 & 1) { - list->flags2 &= 0xFFFE; - processButton(list); - processMouseClick = 1; - } - } - } else if (_mousePressFlag) { - processMouseClick = 1; - } - - if (processMouseClick) { - if (list->buttonCallback) { - if ((this->*(list->buttonCallback))(list)) { - break; - } - } - } - } else { - if (list->flags2 & 1) { - list->flags2 &= 0xFFFE; - processButton(list); - } - if (list->flags2 & 4) { - list->flags2 &= 0xFFFB; - processButton(list); - _screen->updateScreen(); - } - list = list->nextButton; - continue; - } - - list = list->nextButton; - } -} - -void KyraEngine::processButton(Button *button) { - if (!button) - return; - - int processType = 0; - uint8 *shape = 0; - Button::ButtonCallback callback = 0; - - int flags = (button->flags2 & 5); - if (flags == 1) { - processType = button->process2; - if (processType == 1) - shape = button->process2PtrShape; - else if (processType == 4) - callback = button->process2PtrCallback; - } else if (flags == 4 || flags == 5) { - processType = button->process1; - if (processType == 1) - shape = button->process1PtrShape; - else if (processType == 4) - callback = button->process1PtrCallback; - } else { - processType = button->process0; - if (processType == 1) - shape = button->process0PtrShape; - else if (processType == 4) - callback = button->process0PtrCallback; - } - - int x = button->x; - int y = button->y; - assert(button->dimTableIndex < _screen->_screenDimTableCount); - if (x < 0) - x += _screen->_screenDimTable[button->dimTableIndex].w << 3; - - if (y < 0) - y += _screen->_screenDimTable[button->dimTableIndex].h; - - if (processType == 1 && shape) - _screen->drawShape(_screen->_curPage, shape, x, y, button->dimTableIndex, 0x10); - else if (processType == 4 && callback) - (this->*callback)(button); -} - -void KyraEngine::processAllMenuButtons() { - if (!_menuButtonList) - return; - - Button *cur = _menuButtonList; - while (true) { - if (!cur->nextButton) - break; - processMenuButton(cur); - cur = cur->nextButton; - } - return; -} - -void KyraEngine::processMenuButton(Button *button) { - if (!_displayMenu) - return; - - if (!button || (button->flags & 8)) - return; - - if (button->flags2 & 1) - button->flags2 &= 0xf7; - else - button->flags2 |= 8; - - button->flags2 &= 0xfc; - - if (button->flags2 & 4) - button->flags2 |= 0x10; - else - button->flags2 &= 0xef; - - button->flags2 &= 0xfb; - - processButton(button); -} - -int KyraEngine::drawBoxCallback(Button *button) { - if (!_displayMenu) - return 0; - - _screen->hideMouse(); - _screen->drawBox(button->x + 1, button->y + 1, button->x + button->width - 1, button->y + button->height - 1, 0xf8); - _screen->showMouse(); - - return 0; -} - -int KyraEngine::drawShadedBoxCallback(Button *button) { - if (!_displayMenu) - return 0; - - _screen->hideMouse(); - _screen->drawShadedBox(button->x, button->y, button->x + button->width, button->y + button->height, 0xf9, 0xfa); - _screen->showMouse(); - - return 0; -} - -void KyraEngine::setGUILabels() { - int offset = 0; - int offsetOptions = 0; - int offsetMainMenu = 0; - int offsetOn = 0; - - int walkspeedGarbageOffset = 36; - int menuLabelGarbageOffset = 0; - - if (_flags.isTalkie) { - if (_flags.lang == Common::EN_ANY) - offset = 52; - else if (_flags.lang == Common::DE_DEU) - offset = 30; - else if (_flags.lang == Common::FR_FRA || _flags.lang == Common::IT_ITA) - offset = 6; - offsetOn = offsetMainMenu = offsetOptions = offset; - walkspeedGarbageOffset = 48; - } else if (_flags.lang == Common::ES_ESP) { - offsetOn = offsetMainMenu = offsetOptions = offset = -4; - menuLabelGarbageOffset = 72; - } else if (_flags.lang == Common::DE_DEU) { - offset = offsetMainMenu = offsetOn = offsetOptions = 24; - } else if (_flags.platform == Common::kPlatformFMTowns) { - offset = 1; - offsetOptions = 10; - offsetOn = 0; - walkspeedGarbageOffset = 0; - } - - assert(offset + 27 < _guiStringsSize); - - // The Legend of Kyrandia - _menu[0].menuName = _guiStrings[0]; - // Load a Game - _menu[0].item[0].itemString = _guiStrings[1]; - // Save a Game - _menu[0].item[1].itemString = _guiStrings[2]; - // Game controls - _menu[0].item[2].itemString = _guiStrings[3]; - // Quit playing - _menu[0].item[3].itemString = _guiStrings[4]; - // Resume game - _menu[0].item[4].itemString = _guiStrings[5]; - - // Cancel - _menu[2].item[5].itemString = _guiStrings[10]; - - // Enter a description of your saved game: - _menu[3].menuName = _guiStrings[11]; - // Save - _menu[3].item[0].itemString = _guiStrings[12]; - // Cancel - _menu[3].item[1].itemString = _guiStrings[10]; - - // Rest in peace, Brandon - _menu[4].menuName = _guiStrings[13]; - // Load a game - _menu[4].item[0].itemString = _guiStrings[1]; - // Quit playing - _menu[4].item[1].itemString = _guiStrings[4]; - - // Game Controls - _menu[5].menuName = _guiStrings[6]; - // Yes - _menu[1].item[0].itemString = _guiStrings[22 + offset]; - // No - _menu[1].item[1].itemString = _guiStrings[23 + offset]; - - // Music is - _menu[5].item[0].labelString = _guiStrings[26 + offsetOptions]; - // Sounds are - _menu[5].item[1].labelString = _guiStrings[27 + offsetOptions]; - // Walk speed - _menu[5].item[2].labelString = &_guiStrings[24 + offsetOptions][walkspeedGarbageOffset]; - // Text speed - _menu[5].item[4].labelString = _guiStrings[25 + offsetOptions]; - // Main Menu - _menu[5].item[5].itemString = &_guiStrings[19 + offsetMainMenu][menuLabelGarbageOffset]; - - if (_flags.isTalkie) - // Text & Voice - _voiceTextString = _guiStrings[28 + offset]; - - _textSpeedString = _guiStrings[25 + offsetOptions]; - _onString = _guiStrings[20 + offsetOn]; - _offString = _guiStrings[21 + offset]; - _onCDString = _guiStrings[21]; -} - -int KyraEngine::buttonMenuCallback(Button *caller) { - _displayMenu = true; - - assert(_guiStrings); - assert(_configStrings); - - /* - for (int i = 0; i < _guiStringsSize; i++) - debug("GUI string %i: %s", i, _guiStrings[i]); - - for (int i = 0; i < _configStringsSize; i++) - debug("Config string %i: %s", i, _configStrings[i]); - */ - - setGUILabels(); - if (_currentCharacter->sceneId == 210 && _deathHandler == 0xFF) { - snd_playSoundEffect(0x36); - return 0; - } - // XXX - _screen->setPaletteIndex(0xFE, 60, 60, 0); - for (int i = 0; i < 6; i++) { - _menuButtonData[i].process0 = _menuButtonData[i].process1 = _menuButtonData[i].process2 = 4; - _menuButtonData[i].process0PtrCallback = &KyraEngine::drawShadedBoxCallback; - _menuButtonData[i].process1PtrCallback = &KyraEngine::drawBoxCallback; - _menuButtonData[i].process2PtrCallback = &KyraEngine::drawShadedBoxCallback; - } - - _screen->savePageToDisk("SEENPAGE.TMP", 0); - gui_fadePalette(); - - for (int i = 0; i < 5; i++) - calcCoords(_menu[i]); - - _menuRestoreScreen = true; - _keyPressed.reset(); - _mousePressFlag = false; - - _toplevelMenu = 0; - if (_menuDirectlyToLoad) { - gui_loadGameMenu(0); - } else { - if (!caller) - _toplevelMenu = 4; - - initMenu(_menu[_toplevelMenu]); - processAllMenuButtons(); - } - - while (_displayMenu && !_quitFlag) { - gui_processHighlights(_menu[_toplevelMenu]); - processButtonList(_menuButtonList); - gui_getInput(); - } - - if (_menuRestoreScreen) { - gui_restorePalette(); - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _animator->_updateScreen = true; - } else { - _screen->deletePageFromDisk(0); - } - - return 0; -} - -void KyraEngine::initMenu(Menu &menu) { - _menuButtonList = 0; - - _screen->hideMouse(); - - int textX; - int textY; - - int menu_x2 = menu.width + menu.x - 1; - int menu_y2 = menu.height + menu.y - 1; - - _screen->fillRect(menu.x + 2, menu.y + 2, menu_x2 - 2, menu_y2 - 2, menu.bgcolor); - _screen->drawShadedBox(menu.x, menu.y, menu_x2, menu_y2, menu.color1, menu.color2); - - if (menu.field_10 != -1) - textX = menu.x; - else - textX = _text->getCenterStringX(menu.menuName, menu.x, menu_x2); - - textY = menu.y + menu.field_12; - - _text->printText(menu.menuName, textX - 1, textY + 1, 12, 248, 0); - _text->printText(menu.menuName, textX, textY, menu.textColor, 0, 0); - - int x1, y1, x2, y2; - for (int i = 0; i < menu.nrOfItems; i++) { - if (!menu.item[i].enabled) - continue; - - x1 = menu.x + menu.item[i].x; - y1 = menu.y + menu.item[i].y; - - x2 = x1 + menu.item[i].width - 1; - y2 = y1 + menu.item[i].height - 1; - - if (i < 6) { - _menuButtonData[i].nextButton = 0; - _menuButtonData[i].x = x1; - _menuButtonData[i].y = y1; - _menuButtonData[i].width = menu.item[i].width - 1; - _menuButtonData[i].height = menu.item[i].height - 1; - _menuButtonData[i].buttonCallback = menu.item[i].callback; - _menuButtonData[i].specialValue = menu.item[i].field_1b; - //_menuButtonData[i].field_6 = menu.item[i].field_25; - //_menuButtonData[i].field_8 = 0; - - if (!_menuButtonList) - _menuButtonList = &_menuButtonData[i]; - else - _menuButtonList = initButton(_menuButtonList, &_menuButtonData[i]); - } - _screen->fillRect(x1, y1, x2, y2, menu.item[i].bgcolor); - _screen->drawShadedBox(x1, y1, x2, y2, menu.item[i].color1, menu.item[i].color2); - - if (menu.item[i].itemString) { - if (menu.item[i].field_12 != -1 && _flags.lang == Common::EN_ANY) - textX = x1 + menu.item[i].field_12 + 3; - else - textX = _text->getCenterStringX(menu.item[i].itemString, x1, x2); - - textY = y1 + 2; - _text->printText(menu.item[i].itemString, textX - 1, textY + 1, 12, 0, 0); - - if (i == menu.highlightedItem) - _text->printText(menu.item[i].itemString, textX, textY, menu.item[i].highlightColor, 0, 0); - else - _text->printText(menu.item[i].itemString, textX, textY, menu.item[i].textColor, 0, 0); - - if (menu.item[i].labelString) { - _text->printText(menu.item[i].labelString, menu.x + menu.item[i].labelX - 1, menu.y + menu.item[i].labelY + 1, 12, 0, 0); - _text->printText(menu.item[i].labelString, menu.x + menu.item[i].labelX, menu.y + menu.item[i].labelY, 253, 0, 0); - } - } - } - - if (menu.scrollUpBtnX != -1) { - _haveScrollButtons = true; - - _scrollUpButton.x = menu.scrollUpBtnX + menu.x; - _scrollUpButton.y = menu.scrollUpBtnY + menu.y; - _scrollUpButton.buttonCallback = &KyraEngine::gui_scrollUp; - _scrollUpButton.nextButton = 0; - _menuButtonList = initButton(_menuButtonList, &_scrollUpButton); - processMenuButton(&_scrollUpButton); - - _scrollDownButton.x = menu.scrollDownBtnX + menu.x; - _scrollDownButton.y = menu.scrollDownBtnY + menu.y; - _scrollDownButton.buttonCallback = &KyraEngine::gui_scrollDown; - _scrollDownButton.nextButton = 0; - _menuButtonList = initButton(_menuButtonList, &_scrollDownButton); - processMenuButton(&_scrollDownButton); - } else { - _haveScrollButtons = false; - } - - _screen->showMouse(); - _screen->updateScreen(); -} - -void KyraEngine::calcCoords(Menu &menu) { - assert(menu.nrOfItems < 7); - - int widthBackup = _screen->_charWidth; - _screen->_charWidth = -2; - - menu.x = (320 - menu.width)/2; - - int menu_x2 = menu.width + menu.x - 1; - int maxOffset = 0; - int x1, x2, y1, y2; - - for (int i = 0; i < menu.nrOfItems; i++) { - if (menu.item[i].x == -1) - menu.item[i].x = (menu.width - menu.item[i].width)/2; - - if (menu.item[i].labelString) { - x1 = menu.x + menu.item[i].x + 25; - y1 = (200 - menu.height)/2 + menu.item[i].y; - - x2 = x1 + menu.item[i].width; - y2 = y1 + menu.item[i].height; - - int textWidth = _screen->getTextWidth(menu.item[i].labelString) + 25; - int textX = menu.item[i].labelX + menu.x; - - if (textWidth + textX > x1) { - int offset = ((textWidth + textX) - x1); - if (maxOffset < offset) - maxOffset = offset; - } - } - - if (menu.item[i].itemString) { - int textWidth = _screen->getTextWidth(menu.item[i].itemString) + 15; - - if (menu.item[i].width < textWidth) { - menu.item[i].width = textWidth; - - if ( menu.x + menu.item[i].x + menu.item[i].width > menu_x2) - menu.item[i].x -= (menu.x + menu.item[i].x + menu.item[i].width) - menu_x2 + 10; - } - } - - } - - if (maxOffset > 0) { - maxOffset = maxOffset/2; - for (int i = 0; i < menu.nrOfItems; i++) { - menu.item[i].x += maxOffset + 10; - menu.item[i].labelX -= maxOffset; - } - menu.width += maxOffset; - } - - if (menu.menuName != 0) { - int menuNameLength = _screen->getTextWidth(menu.menuName); - if (menuNameLength > menu.width) - menu.width = menuNameLength; - } - - if (menu.width > 310) - menu.width = 310; - - menu.x = (320 - menu.width)/2; - - if (menu.y == -1) - menu.y = (200 - menu.height)/2; - - _screen->_charWidth = widthBackup; -} - -void KyraEngine::gui_getInput() { - Common::Event event; - static uint32 lastScreenUpdate = 0; - uint32 now = _system->getMillis(); - - _mouseWheel = 0; - while (_eventMan->pollEvent(event)) { - switch (event.type) { - case Common::EVENT_QUIT: - quitGame(); - break; - case Common::EVENT_LBUTTONDOWN: - _mousePressFlag = true; - break; - case Common::EVENT_LBUTTONUP: - _mousePressFlag = false; - break; - case Common::EVENT_MOUSEMOVE: - _system->updateScreen(); - lastScreenUpdate = now; - break; - case Common::EVENT_WHEELUP: - _mouseWheel = -1; - break; - case Common::EVENT_WHEELDOWN: - _mouseWheel = 1; - break; - case Common::EVENT_KEYDOWN: - _keyPressed = event.kbd; - break; - default: - break; - } - } - - if (now - lastScreenUpdate > 50) { - _system->updateScreen(); - lastScreenUpdate = now; - } - - _system->delayMillis(3); -} - -int KyraEngine::gui_resumeGame(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_resumeGame()"); - processMenuButton(button); - _displayMenu = false; - - return 0; -} - -const char *KyraEngine::getSavegameFilename(int num) { - static char saveLoadSlot[12]; - - sprintf(saveLoadSlot, "%s.%.3d", _targetName.c_str(), num); - return saveLoadSlot; -} - -int KyraEngine::getNextSavegameSlot() { - Common::InSaveFile *in; - - for (int i = 1; i < 1000; i++) { - if ((in = _saveFileMan->openForLoading(getSavegameFilename(i)))) - delete in; - else - return i; - } - warning("Didn't save: Ran out of savegame filenames"); - return 0; -} - -void KyraEngine::setupSavegames(Menu &menu, int num) { - Common::InSaveFile *in; - static char savenames[5][31]; - uint8 startSlot; - assert(num <= 5); - - if (_savegameOffset == 0) { - menu.item[0].itemString = _specialSavegameString; - menu.item[0].enabled = 1; - menu.item[0].field_1b = 0; - startSlot = 1; - } else { - startSlot = 0; - } - - for (int i = startSlot; i < num; i++) { - if ((in = _saveFileMan->openForLoading(getSavegameFilename(i + _savegameOffset)))) { - in->skip(8); - in->read(savenames[i], 31); - menu.item[i].itemString = savenames[i]; - menu.item[i].enabled = 1; - menu.item[i].field_1b = i + _savegameOffset; - delete in; - } else { - menu.item[i].enabled = 0; - //menu.item[i].itemString = ""; - //menu.item[i].field_1b = -1; - } - } -} - -int KyraEngine::gui_saveGameMenu(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_saveGameMenu()"); - processMenuButton(button); - _menu[2].item[5].enabled = true; - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - _menu[2].menuName = _guiStrings[8]; // Select a position to save to: - _specialSavegameString = _guiStrings[9]; // [ EMPTY SLOT ] - for (int i = 0; i < 5; i++) - _menu[2].item[i].callback = &KyraEngine::gui_saveGame; - - _savegameOffset = 0; - setupSavegames(_menu[2], 5); - - initMenu(_menu[2]); - processAllMenuButtons(); - - _displaySubMenu = true; - _cancelSubMenu = false; - - while (_displaySubMenu && !_quitFlag) { - gui_getInput(); - gui_processHighlights(_menu[2]); - processButtonList(_menuButtonList); - } - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - if (_cancelSubMenu) { - initMenu(_menu[0]); - processAllMenuButtons(); - } else { - _displayMenu = false; - } - return 0; -} - -int KyraEngine::gui_loadGameMenu(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_loadGameMenu()"); - if (_menuDirectlyToLoad) { - _menu[2].item[5].enabled = false; - } else { - processMenuButton(button); - _menu[2].item[5].enabled = true; - } - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - _specialSavegameString = _newGameString[0]; //[ START A NEW GAME ] - _menu[2].menuName = _guiStrings[7]; // Which game would you like to reload? - for (int i = 0; i < 5; i++) - _menu[2].item[i].callback = &KyraEngine::gui_loadGame; - - _savegameOffset = 0; - setupSavegames(_menu[2], 5); - - initMenu(_menu[2]); - processAllMenuButtons(); - - _displaySubMenu = true; - _cancelSubMenu = false; - - while (_displaySubMenu && !_quitFlag) { - gui_getInput(); - gui_processHighlights(_menu[2]); - processButtonList(_menuButtonList); - } - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - if (_cancelSubMenu) { - initMenu(_menu[_toplevelMenu]); - processAllMenuButtons(); - } else { - gui_restorePalette(); - loadGame(getSavegameFilename(_gameToLoad)); - _displayMenu = false; - _menuRestoreScreen = false; - } - return 0; -} - -void KyraEngine::gui_redrawTextfield() { - _screen->fillRect(38, 91, 287, 102, 250); - _text->printText(_savegameName, 38, 92, 253, 0, 0); - - _screen->_charWidth = -2; - int width = _screen->getTextWidth(_savegameName); - _screen->fillRect(39 + width, 93, 45 + width, 100, 254); - _screen->_charWidth = 0; - - _screen->updateScreen(); -} - -void KyraEngine::gui_updateSavegameString() { - int length; - - if (_keyPressed.keycode) { - length = strlen(_savegameName); - - if (_keyPressed.ascii > 31 && _keyPressed.ascii < 127) { - if (length < 31) { - _savegameName[length] = _keyPressed.ascii; - _savegameName[length+1] = 0; - gui_redrawTextfield(); - } - } else if (_keyPressed.keycode == Common::KEYCODE_BACKSPACE || - _keyPressed.keycode == Common::KEYCODE_DELETE) { - if (length > 0) { - _savegameName[length-1] = 0; - gui_redrawTextfield(); - } - } else if (_keyPressed.keycode == Common::KEYCODE_RETURN || - _keyPressed.keycode == Common::KEYCODE_KP_ENTER) { - _displaySubMenu = false; - } - } - - _keyPressed.reset(); -} - -int KyraEngine::gui_saveGame(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_saveGame()"); - processMenuButton(button); - _gameToLoad = button->specialValue; - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - initMenu(_menu[3]); - processAllMenuButtons(); - - _displaySubMenu = true; - _cancelSubMenu = false; - - if (_savegameOffset == 0 && _gameToLoad == 0) { - _savegameName[0] = 0; - } else { - for (int i = 0; i < 5; i++) { - if (_menu[2].item[i].field_1b == _gameToLoad) { - strncpy(_savegameName, _menu[2].item[i].itemString, 31); - break; - } - } - } - gui_redrawTextfield(); - - while (_displaySubMenu && !_quitFlag) { - gui_getInput(); - gui_updateSavegameString(); - gui_processHighlights(_menu[3]); - processButtonList(_menuButtonList); - } - - if (_cancelSubMenu) { - _displaySubMenu = true; - _cancelSubMenu = false; - initMenu(_menu[2]); - processAllMenuButtons(); - } else { - if (_savegameOffset == 0 && _gameToLoad == 0) - _gameToLoad = getNextSavegameSlot(); - if (_gameToLoad > 0) - saveGame(getSavegameFilename(_gameToLoad), _savegameName); - } - - return 0; -} - -int KyraEngine::gui_savegameConfirm(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_savegameConfirm()"); - processMenuButton(button); - _displaySubMenu = false; - - return 0; -} - -int KyraEngine::gui_loadGame(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_loadGame()"); - processMenuButton(button); - _displaySubMenu = false; - _gameToLoad = button->specialValue; - - return 0; -} - -int KyraEngine::gui_cancelSubMenu(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_cancelLoadGameMenu()"); - processMenuButton(button); - _displaySubMenu = false; - _cancelSubMenu = true; - - return 0; -} - -int KyraEngine::gui_quitPlaying(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_quitPlaying()"); - processMenuButton(button); - - if (gui_quitConfirm(_guiStrings[14])) { // Are you sure you want to quit playing? - quitGame(); - } else { - initMenu(_menu[_toplevelMenu]); - processAllMenuButtons(); - } - - return 0; -} - -bool KyraEngine::gui_quitConfirm(const char *str) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_quitConfirm()"); - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - _menu[1].menuName = str; - calcCoords(_menu[1]); - initMenu(_menu[1]); - - _displaySubMenu = true; - _cancelSubMenu = true; - - while (_displaySubMenu && !_quitFlag) { - gui_getInput(); - gui_processHighlights(_menu[1]); - processButtonList(_menuButtonList); - } - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - return !_cancelSubMenu; -} - -int KyraEngine::gui_quitConfirmYes(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_quitConfirmYes()"); - processMenuButton(button); - _displaySubMenu = false; - _cancelSubMenu = false; - - return 0; -} - -int KyraEngine::gui_quitConfirmNo(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_quitConfirmNo()"); - processMenuButton(button); - _displaySubMenu = false; - _cancelSubMenu = true; - - return 0; -} - -int KyraEngine::gui_gameControlsMenu(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_gameControlsMenu()"); - - readSettings(); - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - if (_flags.isTalkie) { - //_menu[5].width = 230; - - for (int i = 0; i < 5; i++) { - //_menu[5].item[i].labelX = 24; - //_menu[5].item[i].x = 115; - //_menu[5].item[i].width = 94; - } - - _menu[5].item[3].labelString = _voiceTextString; //"Voice / Text " - _menu[5].item[3].callback = &KyraEngine::gui_controlsChangeVoice; - - } else { - //_menu[5].height = 136; - //_menu[5].item[5].y = 110; - _menu[5].item[4].enabled = 0; - _menu[5].item[3].labelString = _textSpeedString; // "Text speed " - _menu[5].item[3].callback = &KyraEngine::gui_controlsChangeText; - } - - gui_setupControls(_menu[5]); - - processAllMenuButtons(); - - _displaySubMenu = true; - _cancelSubMenu = false; - - while (_displaySubMenu && !_quitFlag) { - gui_getInput(); - gui_processHighlights(_menu[5]); - processButtonList(_menuButtonList); - } - - _screen->loadPageFromDisk("SEENPAGE.TMP", 0); - _screen->savePageToDisk("SEENPAGE.TMP", 0); - - if (_cancelSubMenu) { - initMenu(_menu[_toplevelMenu]); - processAllMenuButtons(); - } - return 0; -} - -void KyraEngine::gui_setupControls(Menu &menu) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_setupControls()"); - - switch (_configMusic) { - case 0: - menu.item[0].itemString = _offString; //"Off" - break; - case 1: - menu.item[0].itemString = _onString; //"On" - break; - case 2: - menu.item[0].itemString = _onCDString; //"On + CD" - break; - } - - if (_configSounds) - menu.item[1].itemString = _onString; //"On" - else - menu.item[1].itemString = _offString; //"Off" - - - switch (_configWalkspeed) { - case 0: - menu.item[2].itemString = _configStrings[0]; //"Slowest" - break; - case 1: - menu.item[2].itemString = _configStrings[1]; //"Slow" - break; - case 2: - menu.item[2].itemString = _configStrings[2]; //"Normal" - break; - case 3: - menu.item[2].itemString = _configStrings[3]; //"Fast" - break; - case 4: - menu.item[2].itemString = _configStrings[4]; //"Fastest" - break; - default: - menu.item[2].itemString = "ERROR"; - break; - } - - int textControl = 3; - int clickableOffset = 8; - if (_flags.isTalkie) { - textControl = 4; - clickableOffset = 11; - - if (_configVoice == 0) - _menu[5].item[4].enabled = 1; - else - _menu[5].item[4].enabled = 0; - - switch (_configVoice) { - case 0: - menu.item[3].itemString = _configStrings[5]; //"Text only" - break; - case 1: - menu.item[3].itemString = _configStrings[6]; //"Voice only" - break; - case 2: - menu.item[3].itemString = _configStrings[7]; //"Voice & Text" - break; - default: - menu.item[3].itemString = "ERROR"; - break; - } - } - - switch (_configTextspeed) { - case 0: - menu.item[textControl].itemString = _configStrings[1]; //"Slow" - break; - case 1: - menu.item[textControl].itemString = _configStrings[2]; //"Normal" - break; - case 2: - menu.item[textControl].itemString = _configStrings[3]; //"Fast" - break; - case 3: - menu.item[textControl].itemString = _configStrings[clickableOffset]; //"Clickable" - break; - default: - menu.item[textControl].itemString = "ERROR"; - break; - } - - calcCoords(menu); - initMenu(menu); -} - -int KyraEngine::gui_controlsChangeMusic(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsChangeMusic()"); - processMenuButton(button); - - _configMusic = ++_configMusic % (_flags.platform == Common::kPlatformFMTowns ? 3 : 2); - gui_setupControls(_menu[5]); - return 0; -} - -int KyraEngine::gui_controlsChangeSounds(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsChangeSounds()"); - processMenuButton(button); - - _configSounds = !_configSounds; - gui_setupControls(_menu[5]); - return 0; -} - -int KyraEngine::gui_controlsChangeWalk(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsChangeWalk()"); - processMenuButton(button); - - _configWalkspeed = ++_configWalkspeed % 5; - setWalkspeed(_configWalkspeed); - gui_setupControls(_menu[5]); - return 0; -} - -int KyraEngine::gui_controlsChangeText(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsChangeText()"); - processMenuButton(button); - - _configTextspeed = ++_configTextspeed % 4; - gui_setupControls(_menu[5]); - return 0; -} - -int KyraEngine::gui_controlsChangeVoice(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsChangeVoice()"); - processMenuButton(button); - - _configVoice = ++_configVoice % 3; - gui_setupControls(_menu[5]); - return 0; -} - -int KyraEngine::gui_controlsApply(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_controlsApply()"); - writeSettings(); - return gui_cancelSubMenu(button); -} - -int KyraEngine::gui_scrollUp(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_scrollUp()"); - processMenuButton(button); - - if (_savegameOffset > 0) { - _savegameOffset--; - setupSavegames(_menu[2], 5); - initMenu(_menu[2]); - } - return 0; -} - -int KyraEngine::gui_scrollDown(Button *button) { - debugC(9, kDebugLevelGUI, "KyraEngine::gui_scrollDown()"); - processMenuButton(button); - - _savegameOffset++; - setupSavegames(_menu[2], 5); - initMenu(_menu[2]); - - return 0; -} - -void KyraEngine::gui_processHighlights(Menu &menu) { - int x1, y1, x2, y2; - - Common::Point mouse = getMousePos(); - for (int i = 0; i < menu.nrOfItems; i++) { - if (!menu.item[i].enabled) - continue; - - x1 = menu.x + menu.item[i].x; - y1 = menu.y + menu.item[i].y; - - x2 = x1 + menu.item[i].width; - y2 = y1 + menu.item[i].height; - - if (mouse.x > x1 && mouse.x < x2 && - mouse.y > y1 && mouse.y < y2) { - - if (menu.highlightedItem != i) { - if (menu.item[menu.highlightedItem].enabled ) - gui_redrawText(menu); - - menu.highlightedItem = i; - gui_redrawHighlight(menu); - _screen->updateScreen(); - } - } - } -} - -void KyraEngine::gui_redrawText(Menu menu) { - int textX; - int i = menu.highlightedItem; - - int x1 = menu.x + menu.item[i].x; - int y1 = menu.y + menu.item[i].y; - - int x2 = x1 + menu.item[i].width - 1; - - if (menu.item[i].field_12 != -1 &&_flags.lang == Common::EN_ANY) - textX = x1 + menu.item[i].field_12 + 3; - else - textX = _text->getCenterStringX(menu.item[i].itemString, x1, x2); - - int textY = y1 + 2; - _text->printText(menu.item[i].itemString, textX - 1, textY + 1, 12, 0, 0); - _text->printText(menu.item[i].itemString, textX, textY, menu.item[i].textColor, 0, 0); -} - -void KyraEngine::gui_redrawHighlight(Menu menu) { - int textX; - int i = menu.highlightedItem; - - int x1 = menu.x + menu.item[i].x; - int y1 = menu.y + menu.item[i].y; - - int x2 = x1 + menu.item[i].width - 1; - - if (menu.item[i].field_12 != -1 &&_flags.lang == Common::EN_ANY) - textX = x1 + menu.item[i].field_12 + 3; - else - textX = _text->getCenterStringX(menu.item[i].itemString, x1, x2); - - int textY = y1 + 2; - _text->printText(menu.item[i].itemString, textX - 1, textY + 1, 12, 0, 0); - _text->printText(menu.item[i].itemString, textX, textY, menu.item[i].highlightColor, 0, 0); -} - -void KyraEngine::gui_fadePalette() { - if (_flags.platform == Common::kPlatformAmiga) - return; - - static int16 menuPalIndexes[] = {248, 249, 250, 251, 252, 253, 254, -1}; - int index = 0; - - memcpy(_screen->getPalette(2), _screen->_currentPalette, 768); - - for (int i = 0; i < 768; i++) - _screen->_currentPalette[i] >>= 1; - - while (menuPalIndexes[index] != -1) { - memcpy(&_screen->_currentPalette[menuPalIndexes[index]*3], &_screen->getPalette(2)[menuPalIndexes[index]*3], 3); - index++; - } - - _screen->fadePalette(_screen->_currentPalette, 2); -} - -void KyraEngine::gui_restorePalette() { - if (_flags.platform == Common::kPlatformAmiga) - return; - - memcpy(_screen->_currentPalette, _screen->getPalette(2), 768); - _screen->fadePalette(_screen->_currentPalette, 2); -} - -#pragma mark - - -// Kyra 2 and 3 main menu - -void KyraEngine::gui_updateMainMenuAnimation() { - _screen->updateScreen(); -} - -bool KyraEngine::gui_mainMenuGetInput() { - Common::Event event; - - while (_eventMan->pollEvent(event)) { - switch (event.type) { - case Common::EVENT_QUIT: - quitGame(); - break; - case Common::EVENT_LBUTTONUP: - return true; - default: - break; - } - } - return false; -} - -int KyraEngine::gui_handleMainMenu() { - debugC(9, kDebugLevelMain, "KyraEngine::gui_handleMainMenu()"); - int command = -1; - - uint8 colorMap[16]; - memset(colorMap, 0, sizeof(colorMap)); - _screen->setTextColorMap(colorMap); - - const char * const *strings = &_mainMenuStrings[_lang << 2]; - Screen::FontId oldFont = _screen->setFont(Screen::FID_8_FNT); - int charWidthBackUp = _screen->_charWidth; - - _screen->_charWidth = -2; - _screen->setScreenDim(3); - int backUpX = _screen->_curDim->sx; - int backUpY = _screen->_curDim->sy; - int backUpWidth = _screen->_curDim->w; - int backUpHeight = _screen->_curDim->h; - _screen->copyRegion(backUpX, backUpY, backUpX, backUpY, backUpWidth, backUpHeight, 0, 3); - - int x = _screen->_curDim->sx << 3; - int y = _screen->_curDim->sy; - int width = _screen->_curDim->w << 3; - int height = _screen->_curDim->h; - - gui_drawMainBox(x, y, width, height, 1); - gui_drawMainBox(x + 1, y + 1, width - 2, height - 2, 0); - - int selected = 0; - - gui_drawMainMenu(strings, selected); - - _screen->showMouse(); - - int fh = _screen->getFontHeight(); - int textPos = ((_screen->_curDim->w >> 1) + _screen->_curDim->sx) << 3; - - Common::Rect menuRect(x + 16, y + 4, x + width - 16, y + 4 + fh * 4); - - while (!_quitFlag) { - gui_updateMainMenuAnimation(); - bool mousePressed = gui_mainMenuGetInput(); - - Common::Point mouse = getMousePos(); - if (menuRect.contains(mouse)) { - int item = (mouse.y - menuRect.top) / fh; - - if (item != selected) { - gui_printString(strings[selected], textPos, menuRect.top + selected * fh, 0x80, 0, 5); - gui_printString(strings[item], textPos, menuRect.top + item * fh, 0xFF, 0, 5); - - selected = item; - } - - if (mousePressed) { - // TODO: Flash the text - command = item; - break; - } - } - _system->delayMillis(10); - } - - if (_quitFlag) - command = -1; - - _screen->copyRegion(backUpX, backUpY, backUpX, backUpY, backUpWidth, backUpHeight, 3, 0); - _screen->_charWidth = charWidthBackUp; - _screen->setFont(oldFont); - - return command; -} - -void KyraEngine::gui_drawMainMenu(const char * const *strings, int select) { - debugC(9, kDebugLevelMain, "KyraEngine::gui_drawMainMenu(%p)", (const void*)strings); - static const uint16 menuTable[] = { 0x01, 0x04, 0x0C, 0x04, 0x00, 0x80, 0xFF, 0x00, 0x01, 0x02, 0x03 }; - - int top = _screen->_curDim->sy; - top += menuTable[1]; - - for (int i = 0; i < menuTable[3]; ++i) { - int curY = top + i * _screen->getFontHeight(); - int color = (i == select) ? menuTable[6] : menuTable[5]; - gui_printString(strings[i], ((_screen->_curDim->w >> 1) + _screen->_curDim->sx) << 3, curY, color, 0, 5); - } -} - -void KyraEngine::gui_drawMainBox(int x, int y, int w, int h, int fill) { - debugC(9, kDebugLevelMain, "KyraEngine::gui_drawMainBox(%d, %d, %d, %d, %d)", x, y, w, h, fill); - static const uint8 kyra3ColorTable[] = { 0x16, 0x19, 0x1A, 0x16 }; - static const uint8 kyra2ColorTable[] = { 0x0, 0x19, 0x28, 0xc8 }; - - const uint8 *colorTable; - if (_flags.gameID == GI_KYRA3) - colorTable = kyra3ColorTable; - else - colorTable = kyra2ColorTable; - - --w; --h; - - if (fill) - _screen->fillRect(x, y, x+w, y+h, colorTable[0]); - - _screen->drawClippedLine(x, y+h, x+w, y+h, colorTable[1]); - _screen->drawClippedLine(x+w, y, x+w, y+h, colorTable[1]); - _screen->drawClippedLine(x, y, x+w, y, colorTable[2]); - _screen->drawClippedLine(x, y, x, y+h, colorTable[2]); - - _screen->setPagePixel(_screen->_curPage, x, y+h, colorTable[3]); - _screen->setPagePixel(_screen->_curPage, x+w, y, colorTable[3]); -} - -void KyraEngine::gui_printString(const char *format, int x, int y, int col1, int col2, int flags, ...) { - debugC(9, kDebugLevelMain, "KyraEngine::gui_printString('%s', %d, %d, %d, %d, %d, ...)", format, x, y, col1, col2, flags); - if (!format) - return; - - char string[512]; - va_list vaList; - va_start(vaList, flags); - vsprintf(string, format, vaList); - va_end(vaList); - - if (flags & 1) - x -= _screen->getTextWidth(string) >> 1; - - if (flags & 2) - x -= _screen->getTextWidth(string); - - if (flags & 4) { - _screen->printText(string, x - 1, y, 240, col2); - _screen->printText(string, x, y + 1, 240, col2); - } - - if (flags & 8) { - _screen->printText(string, x - 1, y, 227, col2); - _screen->printText(string, x, y + 1, 227, col2); - } - - _screen->printText(string, x, y, col1, col2); -} - -} // end of namespace Kyra - |