[Scummvm-cvs-logs] SF.net SVN: scummvm: [29108] scummvm/trunk/engines/touche
cyx at users.sourceforge.net
cyx at users.sourceforge.net
Wed Sep 26 21:26:12 CEST 2007
Revision: 29108
http://scummvm.svn.sourceforge.net/scummvm/?rev=29108&view=rev
Author: cyx
Date: 2007-09-26 12:26:12 -0700 (Wed, 26 Sep 2007)
Log Message:
-----------
rename ui.cpp to menu.cpp for consistency with other engines
Modified Paths:
--------------
scummvm/trunk/engines/touche/module.mk
scummvm/trunk/engines/touche/touche.cpp
scummvm/trunk/engines/touche/touche.h
Added Paths:
-----------
scummvm/trunk/engines/touche/menu.cpp
Removed Paths:
-------------
scummvm/trunk/engines/touche/ui.cpp
Copied: scummvm/trunk/engines/touche/menu.cpp (from rev 29106, scummvm/trunk/engines/touche/ui.cpp)
===================================================================
--- scummvm/trunk/engines/touche/menu.cpp (rev 0)
+++ scummvm/trunk/engines/touche/menu.cpp 2007-09-26 19:26:12 UTC (rev 29108)
@@ -0,0 +1,631 @@
+/* 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 "common/events.h"
+#include "common/system.h"
+#include "common/savefile.h"
+
+#include "touche/graphics.h"
+#include "touche/midi.h"
+#include "touche/touche.h"
+
+namespace Touche {
+
+enum ActionId {
+ kActionNone,
+
+ // settings menu
+ kActionLoadMenu,
+ kActionSaveMenu,
+ kActionRestartGame,
+ kActionPlayGame,
+ kActionQuitGame,
+ kActionTextOnly,
+ kActionVoiceOnly,
+ kActionTextAndVoice,
+ kActionLowerVolume,
+ kActionUpperVolume,
+
+ // saveLoad menu
+ kActionGameState1,
+ kActionGameState2,
+ kActionGameState3,
+ kActionGameState4,
+ kActionGameState5,
+ kActionGameState6,
+ kActionGameState7,
+ kActionGameState8,
+ kActionGameState9,
+ kActionGameState10,
+ kActionScrollUpSaves,
+ kActionScrollDownSaves,
+ kActionPerformSaveLoad,
+ kActionCancelSaveLoad
+};
+
+enum MenuMode {
+ kMenuSettingsMode = 0,
+ kMenuLoadStateMode,
+ kMenuSaveStateMode
+};
+
+enum ButtonFlags {
+ kButtonBorder = 1 << 0,
+ kButtonText = 1 << 1,
+ kButtonArrow = 1 << 2
+};
+
+struct Button {
+ int x, y;
+ int w, h;
+ ActionId action;
+ int data;
+ uint8 flags;
+};
+
+struct MenuData {
+ MenuMode mode;
+ Button *buttonsTable;
+ uint buttonsCount;
+ bool quit;
+ bool exit;
+ bool saveLoadMarks[100];
+ char saveLoadDescriptionsTable[100][33];
+
+ void removeLastCharFromDescription(int slot) {
+ char *description = saveLoadDescriptionsTable[slot];
+ int descriptionLen = strlen(description);
+ if (descriptionLen > 0) {
+ --descriptionLen;
+ description[descriptionLen] = 0;
+ }
+ }
+
+ void addCharToDescription(int slot, char chr) {
+ char *description = saveLoadDescriptionsTable[slot];
+ int descriptionLen = strlen(description);
+ if (descriptionLen < 32 && isprint(chr)) {
+ description[descriptionLen] = chr;
+ description[descriptionLen + 1] = 0;
+ }
+ }
+
+ const Button *findButtonUnderCursor(int cursorX, int cursorY) const {
+ for (uint i = 0; i < buttonsCount; ++i) {
+ const Button *button = &buttonsTable[i];
+ if (cursorX >= button->x && cursorX < button->x + button->w &&
+ cursorY >= button->y && cursorY < button->y + button->h) {
+ return button;
+ }
+ }
+ return 0;
+ }
+};
+
+static void drawArrow(uint8 *dst, int dstPitch, int x, int y, int delta, uint8 color) {
+ static const int8 arrowCoordsTable[7][4] = {
+ { 5, 0, 9, 0 },
+ { 5, 0, 5, 4 },
+ { -5, 4, 5, 4 },
+ { -5, 0, -5, 4 },
+ { -9, 0, -5, 0 },
+ { -9, 0, 0, -9 },
+ { 0, -9, 9, 0 }
+ };
+ for (uint i = 0; i < 7; ++i) {
+ const int x1 = x + arrowCoordsTable[i][0];
+ const int y1 = y + arrowCoordsTable[i][1] * delta;
+ const int x2 = x + arrowCoordsTable[i][2];
+ const int y2 = y + arrowCoordsTable[i][3] * delta;
+ Graphics::drawLine(dst, dstPitch, x1, y1, x2, y2, color);
+ }
+}
+
+void ToucheEngine::drawButton(void *button) {
+ Button *b = (Button *)button;
+ if (b->flags & kButtonBorder) {
+ Graphics::drawRect(_offscreenBuffer, kScreenWidth, b->x, b->y, b->w, b->h, 0xF7, 0xF9);
+ }
+ if (b->flags & kButtonText) {
+ if (b->data != 0) {
+ const char *str = getString(b->data);
+ const int w = getStringWidth(b->data);
+ const int h = kTextHeight;
+ const int x = b->x + (b->w - w) / 2;
+ const int y = b->y + (b->h - h) / 2;
+ Graphics::drawString16(_offscreenBuffer, kScreenWidth, 0xFF, x, y, str);
+ }
+ }
+ if (b->flags & kButtonArrow) {
+ int dx = 0;
+ int dy = 0;
+ switch (b->data) {
+ case 2000: // up arrow
+ dx = 1;
+ dy = 2;
+ break;
+ case 2001: // down arrow
+ dx = -1;
+ dy = -2;
+ break;
+ }
+ const int x = b->x + b->w / 2;
+ const int y = b->y + b->h / 2;
+ drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy + 1, dx, 0xD2);
+ drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy, dx, 0xFF);
+ }
+}
+
+static void drawVolumeSlideBar(uint8 *dst, int dstPitch, int volume) {
+ const int w = volume * 232 / 255;
+ if (w > 0) {
+ Graphics::fillRect(dst, dstPitch, 157, 259, w, 6, 0xF0);
+ }
+ if (w < 232) {
+ Graphics::fillRect(dst, dstPitch, 157 + w, 259, 232 - w, 6, 0xD2);
+ }
+}
+
+static void drawSaveGameStateDescriptions(uint8 *dst, int dstPitch, MenuData *menuData, int currentPage, int currentSlot) {
+ for (int i = 0, slot = currentPage * 10; i < 10; ++i, ++slot) {
+ const Button *b = &menuData->buttonsTable[i];
+ const uint8 color = (slot == currentSlot) ? 0xCB : 0xD9;
+ char buf[64];
+ sprintf(buf, "%d.", slot);
+ Graphics::drawString16(dst, dstPitch, color, b->x, b->y, buf);
+ strcpy(buf, menuData->saveLoadDescriptionsTable[slot]);
+ if (slot == currentSlot && menuData->mode == kMenuSaveStateMode) {
+ strcat(buf, "_");
+ }
+ Graphics::drawString16(dst, dstPitch, color, b->x + 30, b->y, buf);
+ }
+}
+
+static void setupMenu(MenuMode mode, MenuData *menuData) {
+ static Button settingsButtonsTable[] = {
+ { 452, 120, 94, 24, kActionLoadMenu, -52, kButtonBorder | kButtonText },
+ { 452, 152, 94, 24, kActionSaveMenu, -53, kButtonBorder | kButtonText },
+ { 452, 184, 94, 24, kActionRestartGame, -90, kButtonBorder | kButtonText },
+ { 452, 216, 94, 24, kActionPlayGame, -54, kButtonBorder | kButtonText },
+ { 452, 248, 94, 24, kActionQuitGame, -55, kButtonBorder | kButtonText },
+ { 396, 130, 24, 24, kActionTextOnly, 0, kButtonBorder | kButtonText },
+ { 396, 160, 24, 24, kActionVoiceOnly, 0, kButtonBorder | kButtonText },
+ { 396, 190, 24, 24, kActionTextAndVoice, 0, kButtonBorder | kButtonText },
+ { 126, 130, 254, 24, kActionNone, -92, kButtonBorder | kButtonText },
+ { 126, 160, 254, 24, kActionNone, -93, kButtonBorder | kButtonText },
+ { 126, 190, 254, 24, kActionNone, -94, kButtonBorder | kButtonText },
+ { 126, 222, 294, 20, kActionNone, -91, kButtonBorder | kButtonText },
+ { 126, 250, 24, 24, kActionLowerVolume, -87, kButtonBorder | kButtonText },
+ { 396, 250, 24, 24, kActionUpperVolume, -88, kButtonBorder | kButtonText },
+ { 154, 256, 238, 12, kActionNone, 0, kButtonBorder }
+ };
+ static Button saveLoadButtonsTable[] = {
+ { 108, 120, 336, 15, kActionGameState1, 0, 0 },
+ { 108, 136, 336, 15, kActionGameState2, 0, 0 },
+ { 108, 152, 336, 15, kActionGameState3, 0, 0 },
+ { 108, 168, 336, 15, kActionGameState4, 0, 0 },
+ { 108, 184, 336, 15, kActionGameState5, 0, 0 },
+ { 108, 200, 336, 15, kActionGameState6, 0, 0 },
+ { 108, 216, 336, 15, kActionGameState7, 0, 0 },
+ { 108, 232, 336, 15, kActionGameState8, 0, 0 },
+ { 108, 248, 336, 15, kActionGameState9, 0, 0 },
+ { 108, 264, 336, 15, kActionGameState10, 0, 0 },
+ { 452, 120, 94, 24, kActionScrollUpSaves, 2000, kButtonBorder | kButtonArrow },
+ { 452, 152, 94, 24, kActionCancelSaveLoad, -56, kButtonBorder | kButtonText },
+ { 452, 216, 94, 24, kActionPerformSaveLoad, 0, kButtonBorder | kButtonText },
+ { 452, 248, 94, 24, kActionScrollDownSaves, 2001, kButtonBorder | kButtonArrow }
+ };
+
+ switch (mode) {
+ case kMenuSettingsMode:
+ menuData->buttonsTable = settingsButtonsTable;
+ menuData->buttonsCount = ARRAYSIZE(settingsButtonsTable);
+ break;
+ case kMenuLoadStateMode:
+ saveLoadButtonsTable[12].data = -52;
+ menuData->buttonsTable = saveLoadButtonsTable;
+ menuData->buttonsCount = ARRAYSIZE(saveLoadButtonsTable);
+ break;
+ case kMenuSaveStateMode:
+ saveLoadButtonsTable[12].data = -53;
+ menuData->buttonsTable = saveLoadButtonsTable;
+ menuData->buttonsCount = ARRAYSIZE(saveLoadButtonsTable);
+ break;
+ }
+}
+
+void ToucheEngine::redrawMenu(void *menu) {
+ MenuData *menuData = (MenuData *)menu;
+ Graphics::fillRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF8);
+ Graphics::drawRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF7, 0xF9);
+ Graphics::drawRect(_offscreenBuffer, kScreenWidth, 106, 118, 340, 164, 0xF9, 0xF7);
+ switch (menuData->mode) {
+ case kMenuSettingsMode:
+ drawVolumeSlideBar(_offscreenBuffer, kScreenWidth, _midiPlayer->getVolume());
+ menuData->buttonsTable[5].data = 0;
+ menuData->buttonsTable[6].data = 0;
+ menuData->buttonsTable[7].data = 0;
+ menuData->buttonsTable[5 + _talkTextMode].data = -86;
+ break;
+ case kMenuLoadStateMode:
+ case kMenuSaveStateMode:
+ drawSaveGameStateDescriptions(_offscreenBuffer, kScreenWidth, menuData, _saveLoadCurrentPage, _saveLoadCurrentSlot);
+ break;
+ }
+ for (uint i = 0; i < menuData->buttonsCount; ++i) {
+ drawButton(&menuData->buttonsTable[i]);
+ }
+}
+
+void ToucheEngine::handleMenuAction(void *menu, int actionId) {
+ MenuData *menuData = (MenuData *)menu;
+ switch (actionId) {
+ case kActionLoadMenu:
+ menuData->mode = kMenuLoadStateMode;
+ break;
+ case kActionSaveMenu:
+ menuData->mode = kMenuSaveStateMode;
+ break;
+ case kActionRestartGame:
+ restart();
+ menuData->quit = true;
+ break;
+ case kActionPlayGame:
+ menuData->quit = true;
+ break;
+ case kActionQuitGame:
+ _flagsTable[611] = 1;
+ menuData->quit = true;
+ break;
+ case kActionTextOnly:
+ _talkTextMode = kTalkModeTextOnly;
+ break;
+ case kActionVoiceOnly:
+ _talkTextMode = kTalkModeVoiceOnly;
+ break;
+ case kActionTextAndVoice:
+ _talkTextMode = kTalkModeVoiceAndText;
+ break;
+ case kActionLowerVolume:
+ _midiPlayer->adjustVolume(-16);
+ break;
+ case kActionUpperVolume:
+ _midiPlayer->adjustVolume(+16);
+ break;
+ case kActionScrollUpSaves:
+ --_saveLoadCurrentPage;
+ if (_saveLoadCurrentPage < 0) {
+ _saveLoadCurrentPage = 9;
+ }
+ _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (_saveLoadCurrentSlot % 10);
+ break;
+ case kActionScrollDownSaves:
+ ++_saveLoadCurrentPage;
+ if (_saveLoadCurrentPage > 9) {
+ _saveLoadCurrentPage = 0;
+ }
+ _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (_saveLoadCurrentSlot % 10);
+ break;
+ case kActionPerformSaveLoad:
+ if (menuData->mode == kMenuLoadStateMode) {
+ if (loadGameState(_saveLoadCurrentSlot)) {
+ menuData->quit = true;
+ }
+ } else if (menuData->mode == kMenuSaveStateMode) {
+ const char *description = menuData->saveLoadDescriptionsTable[_saveLoadCurrentSlot];
+ if (strlen(description) > 0) {
+ if (saveGameState(_saveLoadCurrentSlot, description)) {
+ menuData->quit = true;
+ }
+ }
+ }
+ break;
+ case kActionCancelSaveLoad:
+ menuData->mode = kMenuSettingsMode;
+ break;
+ default:
+ if (actionId >= kActionGameState1 && actionId <= kActionGameState10) {
+ _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (actionId - kActionGameState1);
+ }
+ break;
+ }
+}
+
+void ToucheEngine::handleOptions(int forceDisplay) {
+ if (_disabledInputCounter == 0 || forceDisplay != 0) {
+ setDefaultCursor(_currentKeyCharNum);
+ MenuData menuData;
+ memset(&menuData, 0, sizeof(MenuData));
+ menuData.quit = false;
+ menuData.exit = false;
+ menuData.mode = kMenuSettingsMode;
+ int curMode = -1;
+ bool doRedraw = false;
+ while (!menuData.quit) {
+ if (menuData.mode != curMode) {
+ doRedraw = true;
+ setupMenu(menuData.mode, &menuData);
+ curMode = menuData.mode;
+ if (menuData.mode == kMenuLoadStateMode || menuData.mode == kMenuSaveStateMode) {
+ assert(menuData.saveLoadMarks);
+
+ char gameStateFileName[16];
+ generateGameStateFileName(999, gameStateFileName, 15, true);
+ char slot[2];
+ int slotNum;
+ Common::StringList filenames;
+
+ memset(menuData.saveLoadMarks, false, 100 * sizeof(bool)); //assume no savegames for this title
+ filenames = _saveFileMan->listSavefiles(gameStateFileName);
+
+ for (Common::StringList::const_iterator file = filenames.begin(); file != filenames.end(); file++){
+ //Obtain the last 1 or 2 digits of the filename, since they correspond to the save slot
+ //This engine can save games either with one or two digits, hence the additional if statement
+ slot[0] = file->c_str()[file->size()-2];
+ slot[1] = file->c_str()[file->size()-1];
+
+ if (!atoi(&slot[0])){
+ slotNum = atoi(&slot[1]);
+ } else {
+ slotNum = atoi(slot);
+ }
+
+ if (slotNum >= 0 && slotNum < 100)
+ menuData.saveLoadMarks[slotNum] = true; //mark this slot as valid
+ }
+
+ for (int i = 0; i < 100; ++i) {
+ menuData.saveLoadDescriptionsTable[i][0] = 0;
+ if (menuData.saveLoadMarks[i]) {
+ readGameStateDescription(i, menuData.saveLoadDescriptionsTable[i], 32);
+ }
+ }
+ }
+ }
+ if (doRedraw) {
+ redrawMenu(&menuData);
+ updateScreenArea(90, 102, 460, 196);
+ doRedraw = false;
+ }
+ Common::Event event;
+ while (_eventMan->pollEvent(event)) {
+ const Button *button = 0;
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ menuData.quit = true;
+ menuData.exit = true;
+ _flagsTable[611] = 1;
+ break;
+ case Common::EVENT_LBUTTONDOWN:
+ button = menuData.findButtonUnderCursor(event.mouse.x, event.mouse.y);
+ if (button) {
+ handleMenuAction(&menuData, button->action);
+ doRedraw = true;
+ }
+ break;
+ case Common::EVENT_KEYDOWN:
+ if (menuData.mode == kMenuSaveStateMode) {
+ if (event.kbd.keycode == Common::KEYCODE_BACKSPACE) {
+ menuData.removeLastCharFromDescription(_saveLoadCurrentSlot);
+ } else {
+ menuData.addCharToDescription(_saveLoadCurrentSlot, (char)event.kbd.ascii);
+ }
+ doRedraw = true;
+ }
+ break;
+ case Common::EVENT_WHEELUP:
+ handleMenuAction(&menuData, kActionScrollUpSaves);
+ doRedraw = true;
+ break;
+ case Common::EVENT_WHEELDOWN:
+ handleMenuAction(&menuData, kActionScrollDownSaves);
+ doRedraw = true;
+ break;
+ default:
+ break;
+ }
+ }
+ _system->updateScreen();
+ _system->delayMillis(10);
+ }
+ _fullRedrawCounter = 2;
+ if (!menuData.exit && _flagsTable[611] != 0) {
+ _flagsTable[611] = displayQuitDialog();
+ }
+ }
+}
+
+void ToucheEngine::drawActionsPanel(int dstX, int dstY, int deltaX, int deltaY) {
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY,
+ _menuKitData, 42, 0, 0,
+ 14, 24,
+ Graphics::kTransparent);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, dstY,
+ _menuKitData, 42, 0, 40,
+ 14, 24,
+ Graphics::kTransparent);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, deltaY - 16 + dstY,
+ _menuKitData, 42, 0, 24,
+ 14, 16,
+ Graphics::kTransparent);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, deltaY - 16 + dstY,
+ _menuKitData, 42, 0, 64,
+ 14, 16,
+ Graphics::kTransparent);
+ int x1 = deltaX - 28;
+ int x2 = dstX + 14;
+ while (x1 > 0) {
+ int w = (x1 > 14) ? 14 : x1;
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, x2, dstY,
+ _menuKitData, 42, 0, 80,
+ w, 24,
+ Graphics::kTransparent);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, x2, deltaY - 16 + dstY,
+ _menuKitData, 42, 0, 104,
+ w, 16,
+ Graphics::kTransparent);
+ x1 -= 14;
+ x2 += 14;
+ }
+ x1 = deltaY - 40;
+ x2 = dstY + 24;
+ while (x1 > 0) {
+ int w = (x1 > 120) ? 120 : x1;
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, x2,
+ _menuKitData, 42, 14, 0,
+ 14, w,
+ Graphics::kTransparent);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, x2,
+ _menuKitData, 42, 28, 0,
+ 14, w,
+ Graphics::kTransparent);
+ x1 -= 120;
+ x2 += 120;
+ }
+}
+
+void ToucheEngine::drawConversationPanelBorder(int dstY, int srcX, int srcY) {
+ int dstX = 24;
+ int w = 48;
+ for (int i = 0; i < 13; ++i) {
+ if (i == 12) {
+ w = 34;
+ }
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY, _convKitData, 152, srcX, srcY, w, 6);
+ dstX += w;
+ }
+}
+
+void ToucheEngine::drawConversationPanel() {
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 320, _convKitData, 152, 0, 0, 72, 80);
+ int dstX = 54;
+ int dstY = 326;
+ int w = 96;
+ for (int i = 0; i < 7; ++i) {
+ if (i == 5) {
+ w = 50;
+ }
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY, _convKitData, 152, 24, 6, w, 68);
+ dstX += w;
+ }
+ --dstX;
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 320, _convKitData, 152, 120, 0, 7, 80);
+ dstX -= 3;
+ if (_scrollConversationChoiceOffset != 0) {
+ drawConversationPanelBorder(320, 72, 0);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 320, _convKitData, 152, 128, 0, 24, 21);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 320, _convKitData, 152, 128, 34, 10, 10);
+ } else {
+ drawConversationPanelBorder(320, 24, 0);
+ }
+ if (_conversationChoicesTable[_scrollConversationChoiceOffset + 4].msg != 0) {
+ drawConversationPanelBorder(394, 72, 74);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 379, _convKitData, 152, 128, 59, 24, 21);
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 394, _convKitData, 152, 128, 46, 10, 6);
+ } else {
+ drawConversationPanelBorder(394, 24, 74);
+ }
+}
+
+void ToucheEngine::printStatusString(const char *str) {
+ Graphics::fillRect(_offscreenBuffer, kScreenWidth, 0, 0, kScreenWidth, kTextHeight, 0xD7);
+ Graphics::drawRect(_offscreenBuffer, kScreenWidth, 0, 0, kScreenWidth, kTextHeight, 0xD6, 0xD8);
+ Graphics::drawString16(_offscreenBuffer, kScreenWidth, 0xFF, 0, 0, str);
+ updateScreenArea(0, 0, kScreenWidth, kTextHeight);
+ _system->updateScreen();
+}
+
+void ToucheEngine::clearStatusString() {
+ Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 0,
+ _backdropBuffer, _currentBitmapWidth, _flagsTable[614], _flagsTable[615],
+ kScreenWidth, kTextHeight);
+ updateScreenArea(0, 0, kScreenWidth, kTextHeight);
+}
+
+int ToucheEngine::displayQuitDialog() {
+ debug(kDebugMenu, "ToucheEngine::displayQuitDialog()");
+ printStatusString(getString(-85));
+ int ret = 0;
+ bool quitLoop = false;
+ while (!quitLoop) {
+ Common::Event event;
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ quitLoop = true;
+ ret = 1;
+ break;
+ case Common::EVENT_KEYDOWN:
+ quitLoop = true;
+ switch (_language) {
+ case Common::FR_FRA:
+ if (event.kbd.ascii == 'o' || event.kbd.ascii == 'O') {
+ ret = 1;
+ }
+ break;
+ case Common::DE_DEU:
+ if (event.kbd.ascii == 'j' || event.kbd.ascii == 'J') {
+ ret = 1;
+ }
+ break;
+ case Common::ES_ESP:
+ if (event.kbd.ascii == 's' || event.kbd.ascii == 'S') {
+ ret = 1;
+ }
+ break;
+ case Common::PL_POL:
+ if (event.kbd.ascii == 's' || event.kbd.ascii == 'S' || event.kbd.ascii == 't' || event.kbd.ascii == 'T') {
+ ret = 1;
+ }
+ break;
+ default:
+ // According to cyx, the Italian version uses the same
+ // keys as the English one.
+ if (event.kbd.ascii == 'y' || event.kbd.ascii == 'Y') {
+ ret = 1;
+ }
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ _system->delayMillis(10);
+ _system->updateScreen();
+ }
+ clearStatusString();
+ return ret;
+}
+
+void ToucheEngine::displayTextMode(int str) {
+ debug(kDebugMenu, "ToucheEngine::displayTextMode(%d)", str);
+ printStatusString(getString(str));
+ _system->delayMillis(1000);
+ clearStatusString();
+}
+
+} // namespace Touche
Modified: scummvm/trunk/engines/touche/module.mk
===================================================================
--- scummvm/trunk/engines/touche/module.mk 2007-09-26 19:20:59 UTC (rev 29107)
+++ scummvm/trunk/engines/touche/module.mk 2007-09-26 19:26:12 UTC (rev 29108)
@@ -3,13 +3,13 @@
MODULE_OBJS := \
detection.o \
graphics.o \
+ menu.o \
midi.o \
opcodes.o \
resource.o \
saveload.o \
staticres.o \
- touche.o \
- ui.o
+ touche.o
# This module can be built as a plugin
ifdef BUILD_PLUGINS
Modified: scummvm/trunk/engines/touche/touche.cpp
===================================================================
--- scummvm/trunk/engines/touche/touche.cpp 2007-09-26 19:20:59 UTC (rev 29107)
+++ scummvm/trunk/engines/touche/touche.cpp 2007-09-26 19:26:12 UTC (rev 29108)
@@ -72,7 +72,7 @@
Common::addSpecialDebugLevel(kDebugGraphics, "Graphics", "Graphics debug level");
Common::addSpecialDebugLevel(kDebugResource, "Resource", "Resource debug level");
Common::addSpecialDebugLevel(kDebugOpcodes, "Opcodes", "Opcodes debug level");
- Common::addSpecialDebugLevel(kDebugUserIntf, "UserIntf", "UserInterface debug level");
+ Common::addSpecialDebugLevel(kDebugMenu, "Menu", "Menu debug level");
system->getEventManager()->registerRandomSource(_rnd, "touche");
}
Modified: scummvm/trunk/engines/touche/touche.h
===================================================================
--- scummvm/trunk/engines/touche/touche.h 2007-09-26 19:20:59 UTC (rev 29107)
+++ scummvm/trunk/engines/touche/touche.h 2007-09-26 19:26:12 UTC (rev 29108)
@@ -269,7 +269,7 @@
kDebugGraphics = 1 << 1,
kDebugResource = 1 << 2,
kDebugOpcodes = 1 << 3,
- kDebugUserIntf = 1 << 4
+ kDebugMenu = 1 << 4
};
enum ResourceType {
Deleted: scummvm/trunk/engines/touche/ui.cpp
===================================================================
--- scummvm/trunk/engines/touche/ui.cpp 2007-09-26 19:20:59 UTC (rev 29107)
+++ scummvm/trunk/engines/touche/ui.cpp 2007-09-26 19:26:12 UTC (rev 29108)
@@ -1,631 +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 "common/events.h"
-#include "common/system.h"
-#include "common/savefile.h"
-
-#include "touche/graphics.h"
-#include "touche/midi.h"
-#include "touche/touche.h"
-
-namespace Touche {
-
-enum ActionId {
- kActionNone,
-
- // settings menu
- kActionLoadMenu,
- kActionSaveMenu,
- kActionRestartGame,
- kActionPlayGame,
- kActionQuitGame,
- kActionTextOnly,
- kActionVoiceOnly,
- kActionTextAndVoice,
- kActionLowerVolume,
- kActionUpperVolume,
-
- // saveLoad menu
- kActionGameState1,
- kActionGameState2,
- kActionGameState3,
- kActionGameState4,
- kActionGameState5,
- kActionGameState6,
- kActionGameState7,
- kActionGameState8,
- kActionGameState9,
- kActionGameState10,
- kActionScrollUpSaves,
- kActionScrollDownSaves,
- kActionPerformSaveLoad,
- kActionCancelSaveLoad
-};
-
-enum MenuMode {
- kMenuSettingsMode = 0,
- kMenuLoadStateMode,
- kMenuSaveStateMode
-};
-
-enum ButtonFlags {
- kButtonBorder = 1 << 0,
- kButtonText = 1 << 1,
- kButtonArrow = 1 << 2
-};
-
-struct Button {
- int x, y;
- int w, h;
- ActionId action;
- int data;
- uint8 flags;
-};
-
-struct MenuData {
- MenuMode mode;
- Button *buttonsTable;
- uint buttonsCount;
- bool quit;
- bool exit;
- bool saveLoadMarks[100];
- char saveLoadDescriptionsTable[100][33];
-
- void removeLastCharFromDescription(int slot) {
- char *description = saveLoadDescriptionsTable[slot];
- int descriptionLen = strlen(description);
- if (descriptionLen > 0) {
- --descriptionLen;
- description[descriptionLen] = 0;
- }
- }
-
- void addCharToDescription(int slot, char chr) {
- char *description = saveLoadDescriptionsTable[slot];
- int descriptionLen = strlen(description);
- if (descriptionLen < 32 && isprint(chr)) {
- description[descriptionLen] = chr;
- description[descriptionLen + 1] = 0;
- }
- }
-
- const Button *findButtonUnderCursor(int cursorX, int cursorY) const {
- for (uint i = 0; i < buttonsCount; ++i) {
- const Button *button = &buttonsTable[i];
- if (cursorX >= button->x && cursorX < button->x + button->w &&
- cursorY >= button->y && cursorY < button->y + button->h) {
- return button;
- }
- }
- return 0;
- }
-};
-
-static void drawArrow(uint8 *dst, int dstPitch, int x, int y, int delta, uint8 color) {
- static const int8 arrowCoordsTable[7][4] = {
- { 5, 0, 9, 0 },
- { 5, 0, 5, 4 },
- { -5, 4, 5, 4 },
- { -5, 0, -5, 4 },
- { -9, 0, -5, 0 },
- { -9, 0, 0, -9 },
- { 0, -9, 9, 0 }
- };
- for (uint i = 0; i < 7; ++i) {
- const int x1 = x + arrowCoordsTable[i][0];
- const int y1 = y + arrowCoordsTable[i][1] * delta;
- const int x2 = x + arrowCoordsTable[i][2];
- const int y2 = y + arrowCoordsTable[i][3] * delta;
- Graphics::drawLine(dst, dstPitch, x1, y1, x2, y2, color);
- }
-}
-
-void ToucheEngine::drawButton(void *button) {
- Button *b = (Button *)button;
- if (b->flags & kButtonBorder) {
- Graphics::drawRect(_offscreenBuffer, kScreenWidth, b->x, b->y, b->w, b->h, 0xF7, 0xF9);
- }
- if (b->flags & kButtonText) {
- if (b->data != 0) {
- const char *str = getString(b->data);
- const int w = getStringWidth(b->data);
- const int h = kTextHeight;
- const int x = b->x + (b->w - w) / 2;
- const int y = b->y + (b->h - h) / 2;
- Graphics::drawString16(_offscreenBuffer, kScreenWidth, 0xFF, x, y, str);
- }
- }
- if (b->flags & kButtonArrow) {
- int dx = 0;
- int dy = 0;
- switch (b->data) {
- case 2000: // up arrow
- dx = 1;
- dy = 2;
- break;
- case 2001: // down arrow
- dx = -1;
- dy = -2;
- break;
- }
- const int x = b->x + b->w / 2;
- const int y = b->y + b->h / 2;
- drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy + 1, dx, 0xD2);
- drawArrow(_offscreenBuffer, kScreenWidth, x, y + dy, dx, 0xFF);
- }
-}
-
-static void drawVolumeSlideBar(uint8 *dst, int dstPitch, int volume) {
- const int w = volume * 232 / 255;
- if (w > 0) {
- Graphics::fillRect(dst, dstPitch, 157, 259, w, 6, 0xF0);
- }
- if (w < 232) {
- Graphics::fillRect(dst, dstPitch, 157 + w, 259, 232 - w, 6, 0xD2);
- }
-}
-
-static void drawSaveGameStateDescriptions(uint8 *dst, int dstPitch, MenuData *menuData, int currentPage, int currentSlot) {
- for (int i = 0, slot = currentPage * 10; i < 10; ++i, ++slot) {
- const Button *b = &menuData->buttonsTable[i];
- const uint8 color = (slot == currentSlot) ? 0xCB : 0xD9;
- char buf[64];
- sprintf(buf, "%d.", slot);
- Graphics::drawString16(dst, dstPitch, color, b->x, b->y, buf);
- strcpy(buf, menuData->saveLoadDescriptionsTable[slot]);
- if (slot == currentSlot && menuData->mode == kMenuSaveStateMode) {
- strcat(buf, "_");
- }
- Graphics::drawString16(dst, dstPitch, color, b->x + 30, b->y, buf);
- }
-}
-
-static void setupMenu(MenuMode mode, MenuData *menuData) {
- static Button settingsButtonsTable[] = {
- { 452, 120, 94, 24, kActionLoadMenu, -52, kButtonBorder | kButtonText },
- { 452, 152, 94, 24, kActionSaveMenu, -53, kButtonBorder | kButtonText },
- { 452, 184, 94, 24, kActionRestartGame, -90, kButtonBorder | kButtonText },
- { 452, 216, 94, 24, kActionPlayGame, -54, kButtonBorder | kButtonText },
- { 452, 248, 94, 24, kActionQuitGame, -55, kButtonBorder | kButtonText },
- { 396, 130, 24, 24, kActionTextOnly, 0, kButtonBorder | kButtonText },
- { 396, 160, 24, 24, kActionVoiceOnly, 0, kButtonBorder | kButtonText },
- { 396, 190, 24, 24, kActionTextAndVoice, 0, kButtonBorder | kButtonText },
- { 126, 130, 254, 24, kActionNone, -92, kButtonBorder | kButtonText },
- { 126, 160, 254, 24, kActionNone, -93, kButtonBorder | kButtonText },
- { 126, 190, 254, 24, kActionNone, -94, kButtonBorder | kButtonText },
- { 126, 222, 294, 20, kActionNone, -91, kButtonBorder | kButtonText },
- { 126, 250, 24, 24, kActionLowerVolume, -87, kButtonBorder | kButtonText },
- { 396, 250, 24, 24, kActionUpperVolume, -88, kButtonBorder | kButtonText },
- { 154, 256, 238, 12, kActionNone, 0, kButtonBorder }
- };
- static Button saveLoadButtonsTable[] = {
- { 108, 120, 336, 15, kActionGameState1, 0, 0 },
- { 108, 136, 336, 15, kActionGameState2, 0, 0 },
- { 108, 152, 336, 15, kActionGameState3, 0, 0 },
- { 108, 168, 336, 15, kActionGameState4, 0, 0 },
- { 108, 184, 336, 15, kActionGameState5, 0, 0 },
- { 108, 200, 336, 15, kActionGameState6, 0, 0 },
- { 108, 216, 336, 15, kActionGameState7, 0, 0 },
- { 108, 232, 336, 15, kActionGameState8, 0, 0 },
- { 108, 248, 336, 15, kActionGameState9, 0, 0 },
- { 108, 264, 336, 15, kActionGameState10, 0, 0 },
- { 452, 120, 94, 24, kActionScrollUpSaves, 2000, kButtonBorder | kButtonArrow },
- { 452, 152, 94, 24, kActionCancelSaveLoad, -56, kButtonBorder | kButtonText },
- { 452, 216, 94, 24, kActionPerformSaveLoad, 0, kButtonBorder | kButtonText },
- { 452, 248, 94, 24, kActionScrollDownSaves, 2001, kButtonBorder | kButtonArrow }
- };
-
- switch (mode) {
- case kMenuSettingsMode:
- menuData->buttonsTable = settingsButtonsTable;
- menuData->buttonsCount = ARRAYSIZE(settingsButtonsTable);
- break;
- case kMenuLoadStateMode:
- saveLoadButtonsTable[12].data = -52;
- menuData->buttonsTable = saveLoadButtonsTable;
- menuData->buttonsCount = ARRAYSIZE(saveLoadButtonsTable);
- break;
- case kMenuSaveStateMode:
- saveLoadButtonsTable[12].data = -53;
- menuData->buttonsTable = saveLoadButtonsTable;
- menuData->buttonsCount = ARRAYSIZE(saveLoadButtonsTable);
- break;
- }
-}
-
-void ToucheEngine::redrawMenu(void *menu) {
- MenuData *menuData = (MenuData *)menu;
- Graphics::fillRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF8);
- Graphics::drawRect(_offscreenBuffer, kScreenWidth, 90, 102, 460, 196, 0xF7, 0xF9);
- Graphics::drawRect(_offscreenBuffer, kScreenWidth, 106, 118, 340, 164, 0xF9, 0xF7);
- switch (menuData->mode) {
- case kMenuSettingsMode:
- drawVolumeSlideBar(_offscreenBuffer, kScreenWidth, _midiPlayer->getVolume());
- menuData->buttonsTable[5].data = 0;
- menuData->buttonsTable[6].data = 0;
- menuData->buttonsTable[7].data = 0;
- menuData->buttonsTable[5 + _talkTextMode].data = -86;
- break;
- case kMenuLoadStateMode:
- case kMenuSaveStateMode:
- drawSaveGameStateDescriptions(_offscreenBuffer, kScreenWidth, menuData, _saveLoadCurrentPage, _saveLoadCurrentSlot);
- break;
- }
- for (uint i = 0; i < menuData->buttonsCount; ++i) {
- drawButton(&menuData->buttonsTable[i]);
- }
-}
-
-void ToucheEngine::handleMenuAction(void *menu, int actionId) {
- MenuData *menuData = (MenuData *)menu;
- switch (actionId) {
- case kActionLoadMenu:
- menuData->mode = kMenuLoadStateMode;
- break;
- case kActionSaveMenu:
- menuData->mode = kMenuSaveStateMode;
- break;
- case kActionRestartGame:
- restart();
- menuData->quit = true;
- break;
- case kActionPlayGame:
- menuData->quit = true;
- break;
- case kActionQuitGame:
- _flagsTable[611] = 1;
- menuData->quit = true;
- break;
- case kActionTextOnly:
- _talkTextMode = kTalkModeTextOnly;
- break;
- case kActionVoiceOnly:
- _talkTextMode = kTalkModeVoiceOnly;
- break;
- case kActionTextAndVoice:
- _talkTextMode = kTalkModeVoiceAndText;
- break;
- case kActionLowerVolume:
- _midiPlayer->adjustVolume(-16);
- break;
- case kActionUpperVolume:
- _midiPlayer->adjustVolume(+16);
- break;
- case kActionScrollUpSaves:
- --_saveLoadCurrentPage;
- if (_saveLoadCurrentPage < 0) {
- _saveLoadCurrentPage = 9;
- }
- _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (_saveLoadCurrentSlot % 10);
- break;
- case kActionScrollDownSaves:
- ++_saveLoadCurrentPage;
- if (_saveLoadCurrentPage > 9) {
- _saveLoadCurrentPage = 0;
- }
- _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (_saveLoadCurrentSlot % 10);
- break;
- case kActionPerformSaveLoad:
- if (menuData->mode == kMenuLoadStateMode) {
- if (loadGameState(_saveLoadCurrentSlot)) {
- menuData->quit = true;
- }
- } else if (menuData->mode == kMenuSaveStateMode) {
- const char *description = menuData->saveLoadDescriptionsTable[_saveLoadCurrentSlot];
- if (strlen(description) > 0) {
- if (saveGameState(_saveLoadCurrentSlot, description)) {
- menuData->quit = true;
- }
- }
- }
- break;
- case kActionCancelSaveLoad:
- menuData->mode = kMenuSettingsMode;
- break;
- default:
- if (actionId >= kActionGameState1 && actionId <= kActionGameState10) {
- _saveLoadCurrentSlot = _saveLoadCurrentPage * 10 + (actionId - kActionGameState1);
- }
- break;
- }
-}
-
-void ToucheEngine::handleOptions(int forceDisplay) {
- if (_disabledInputCounter == 0 || forceDisplay != 0) {
- setDefaultCursor(_currentKeyCharNum);
- MenuData menuData;
- memset(&menuData, 0, sizeof(MenuData));
- menuData.quit = false;
- menuData.exit = false;
- menuData.mode = kMenuSettingsMode;
- int curMode = -1;
- bool doRedraw = false;
- while (!menuData.quit) {
- if (menuData.mode != curMode) {
- doRedraw = true;
- setupMenu(menuData.mode, &menuData);
- curMode = menuData.mode;
- if (menuData.mode == kMenuLoadStateMode || menuData.mode == kMenuSaveStateMode) {
- assert(menuData.saveLoadMarks);
-
- char gameStateFileName[16];
- generateGameStateFileName(999, gameStateFileName, 15, true);
- char slot[2];
- int slotNum;
- Common::StringList filenames;
-
- memset(menuData.saveLoadMarks, false, 100 * sizeof(bool)); //assume no savegames for this title
- filenames = _saveFileMan->listSavefiles(gameStateFileName);
-
- for (Common::StringList::const_iterator file = filenames.begin(); file != filenames.end(); file++){
- //Obtain the last 1 or 2 digits of the filename, since they correspond to the save slot
- //This engine can save games either with one or two digits, hence the additional if statement
- slot[0] = file->c_str()[file->size()-2];
- slot[1] = file->c_str()[file->size()-1];
-
- if (!atoi(&slot[0])){
- slotNum = atoi(&slot[1]);
- } else {
- slotNum = atoi(slot);
- }
-
- if (slotNum >= 0 && slotNum < 100)
- menuData.saveLoadMarks[slotNum] = true; //mark this slot as valid
- }
-
- for (int i = 0; i < 100; ++i) {
- menuData.saveLoadDescriptionsTable[i][0] = 0;
- if (menuData.saveLoadMarks[i]) {
- readGameStateDescription(i, menuData.saveLoadDescriptionsTable[i], 32);
- }
- }
- }
- }
- if (doRedraw) {
- redrawMenu(&menuData);
- updateScreenArea(90, 102, 460, 196);
- doRedraw = false;
- }
- Common::Event event;
- while (_eventMan->pollEvent(event)) {
- const Button *button = 0;
- switch (event.type) {
- case Common::EVENT_QUIT:
- menuData.quit = true;
- menuData.exit = true;
- _flagsTable[611] = 1;
- break;
- case Common::EVENT_LBUTTONDOWN:
- button = menuData.findButtonUnderCursor(event.mouse.x, event.mouse.y);
- if (button) {
- handleMenuAction(&menuData, button->action);
- doRedraw = true;
- }
- break;
- case Common::EVENT_KEYDOWN:
- if (menuData.mode == kMenuSaveStateMode) {
- if (event.kbd.keycode == Common::KEYCODE_BACKSPACE) {
- menuData.removeLastCharFromDescription(_saveLoadCurrentSlot);
- } else {
- menuData.addCharToDescription(_saveLoadCurrentSlot, (char)event.kbd.ascii);
- }
- doRedraw = true;
- }
- break;
- case Common::EVENT_WHEELUP:
- handleMenuAction(&menuData, kActionScrollUpSaves);
- doRedraw = true;
- break;
- case Common::EVENT_WHEELDOWN:
- handleMenuAction(&menuData, kActionScrollDownSaves);
- doRedraw = true;
- break;
- default:
- break;
- }
- }
- _system->updateScreen();
- _system->delayMillis(10);
- }
- _fullRedrawCounter = 2;
- if (!menuData.exit && _flagsTable[611] != 0) {
- _flagsTable[611] = displayQuitDialog();
- }
- }
-}
-
-void ToucheEngine::drawActionsPanel(int dstX, int dstY, int deltaX, int deltaY) {
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY,
- _menuKitData, 42, 0, 0,
- 14, 24,
- Graphics::kTransparent);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, dstY,
- _menuKitData, 42, 0, 40,
- 14, 24,
- Graphics::kTransparent);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, deltaY - 16 + dstY,
- _menuKitData, 42, 0, 24,
- 14, 16,
- Graphics::kTransparent);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, deltaY - 16 + dstY,
- _menuKitData, 42, 0, 64,
- 14, 16,
- Graphics::kTransparent);
- int x1 = deltaX - 28;
- int x2 = dstX + 14;
- while (x1 > 0) {
- int w = (x1 > 14) ? 14 : x1;
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, x2, dstY,
- _menuKitData, 42, 0, 80,
- w, 24,
- Graphics::kTransparent);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, x2, deltaY - 16 + dstY,
- _menuKitData, 42, 0, 104,
- w, 16,
- Graphics::kTransparent);
- x1 -= 14;
- x2 += 14;
- }
- x1 = deltaY - 40;
- x2 = dstY + 24;
- while (x1 > 0) {
- int w = (x1 > 120) ? 120 : x1;
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, x2,
- _menuKitData, 42, 14, 0,
- 14, w,
- Graphics::kTransparent);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, deltaX - 14 + dstX, x2,
- _menuKitData, 42, 28, 0,
- 14, w,
- Graphics::kTransparent);
- x1 -= 120;
- x2 += 120;
- }
-}
-
-void ToucheEngine::drawConversationPanelBorder(int dstY, int srcX, int srcY) {
- int dstX = 24;
- int w = 48;
- for (int i = 0; i < 13; ++i) {
- if (i == 12) {
- w = 34;
- }
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY, _convKitData, 152, srcX, srcY, w, 6);
- dstX += w;
- }
-}
-
-void ToucheEngine::drawConversationPanel() {
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 320, _convKitData, 152, 0, 0, 72, 80);
- int dstX = 54;
- int dstY = 326;
- int w = 96;
- for (int i = 0; i < 7; ++i) {
- if (i == 5) {
- w = 50;
- }
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, dstY, _convKitData, 152, 24, 6, w, 68);
- dstX += w;
- }
- --dstX;
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 320, _convKitData, 152, 120, 0, 7, 80);
- dstX -= 3;
- if (_scrollConversationChoiceOffset != 0) {
- drawConversationPanelBorder(320, 72, 0);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 320, _convKitData, 152, 128, 0, 24, 21);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 320, _convKitData, 152, 128, 34, 10, 10);
- } else {
- drawConversationPanelBorder(320, 24, 0);
- }
- if (_conversationChoicesTable[_scrollConversationChoiceOffset + 4].msg != 0) {
- drawConversationPanelBorder(394, 72, 74);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 379, _convKitData, 152, 128, 59, 24, 21);
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, dstX, 394, _convKitData, 152, 128, 46, 10, 6);
- } else {
- drawConversationPanelBorder(394, 24, 74);
- }
-}
-
-void ToucheEngine::printStatusString(const char *str) {
- Graphics::fillRect(_offscreenBuffer, kScreenWidth, 0, 0, kScreenWidth, kTextHeight, 0xD7);
- Graphics::drawRect(_offscreenBuffer, kScreenWidth, 0, 0, kScreenWidth, kTextHeight, 0xD6, 0xD8);
- Graphics::drawString16(_offscreenBuffer, kScreenWidth, 0xFF, 0, 0, str);
- updateScreenArea(0, 0, kScreenWidth, kTextHeight);
- _system->updateScreen();
-}
-
-void ToucheEngine::clearStatusString() {
- Graphics::copyRect(_offscreenBuffer, kScreenWidth, 0, 0,
- _backdropBuffer, _currentBitmapWidth, _flagsTable[614], _flagsTable[615],
- kScreenWidth, kTextHeight);
- updateScreenArea(0, 0, kScreenWidth, kTextHeight);
-}
-
-int ToucheEngine::displayQuitDialog() {
- debug(kDebugUserIntf, "ToucheEngine::displayQuitDialog()");
- printStatusString(getString(-85));
- int ret = 0;
- bool quitLoop = false;
- while (!quitLoop) {
- Common::Event event;
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_QUIT:
- quitLoop = true;
- ret = 1;
- break;
- case Common::EVENT_KEYDOWN:
- quitLoop = true;
- switch (_language) {
- case Common::FR_FRA:
- if (event.kbd.ascii == 'o' || event.kbd.ascii == 'O') {
- ret = 1;
- }
- break;
- case Common::DE_DEU:
- if (event.kbd.ascii == 'j' || event.kbd.ascii == 'J') {
- ret = 1;
- }
- break;
- case Common::ES_ESP:
- if (event.kbd.ascii == 's' || event.kbd.ascii == 'S') {
- ret = 1;
- }
- break;
- case Common::PL_POL:
- if (event.kbd.ascii == 's' || event.kbd.ascii == 'S' || event.kbd.ascii == 't' || event.kbd.ascii == 'T') {
- ret = 1;
- }
- break;
- default:
- // According to cyx, the Italian version uses the same
- // keys as the English one.
- if (event.kbd.ascii == 'y' || event.kbd.ascii == 'Y') {
- ret = 1;
- }
- break;
- }
- break;
- default:
- break;
- }
- }
- _system->delayMillis(10);
- _system->updateScreen();
- }
- clearStatusString();
- return ret;
-}
-
-void ToucheEngine::displayTextMode(int str) {
- debug(kDebugUserIntf, "ToucheEngine::displayTextMode(%d)", str);
- printStatusString(getString(str));
- _system->delayMillis(1000);
- clearStatusString();
-}
-
-} // namespace Touche
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list