[Scummvm-cvs-logs] SF.net SVN: scummvm: [31290] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Fri Mar 28 10:00:30 CET 2008


Revision: 31290
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31290&view=rev
Author:   lordhoto
Date:     2008-03-28 02:00:30 -0700 (Fri, 28 Mar 2008)

Log Message:
-----------
Refactored Kyrandia GUI code a bit.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/debugger.cpp
    scummvm/trunk/engines/kyra/debugger.h
    scummvm/trunk/engines/kyra/gui_v1.cpp
    scummvm/trunk/engines/kyra/kyra_v1.cpp
    scummvm/trunk/engines/kyra/kyra_v1.h
    scummvm/trunk/engines/kyra/module.mk
    scummvm/trunk/engines/kyra/script_v1.cpp
    scummvm/trunk/engines/kyra/staticres.cpp

Added Paths:
-----------
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/gui.h
    scummvm/trunk/engines/kyra/gui_v1.h

Modified: scummvm/trunk/engines/kyra/debugger.cpp
===================================================================
--- scummvm/trunk/engines/kyra/debugger.cpp	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/debugger.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -36,7 +36,7 @@
 namespace Kyra {
 
 Debugger::Debugger(KyraEngine *vm)
-	: GUI::Debugger() {
+	: ::GUI::Debugger() {
 	_vm = vm;
 
 	DCmd_Register("screen_debug_mode",	WRAP_METHOD(Debugger, cmd_setScreenDebug));

Modified: scummvm/trunk/engines/kyra/debugger.h
===================================================================
--- scummvm/trunk/engines/kyra/debugger.h	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/debugger.h	2008-03-28 09:00:30 UTC (rev 31290)
@@ -34,7 +34,7 @@
 class KyraEngine_v1;
 class KyraEngine_v2;
 
-class Debugger : public GUI::Debugger {
+class Debugger : public ::GUI::Debugger {
 public:
 	Debugger(KyraEngine *vm);
 	virtual ~Debugger() {}  // we need this for __SYMBIAN32__ archaic gcc/UIQ

Added: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/gui.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -0,0 +1,298 @@
+/* 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/gui.h"
+
+#include "kyra/screen.h"
+#include "kyra/text.h"
+
+namespace Kyra {
+
+GUI::GUI(KyraEngine *kyra)
+	: _vm(kyra), _screen(kyra->screen()), _text(kyra->text()) {
+	_menuButtonList = 0;
+	_haveScrollButtons = false;
+
+	_redrawButtonFunctor = BUTTON_FUNCTOR(GUI, this, &GUI::redrawButtonCallback);
+	_redrawShadedButtonFunctor = BUTTON_FUNCTOR(GUI, this, &GUI::redrawShadedButtonCallback);
+}
+
+Button *GUI::addButtonToList(Button *list, Button *newButton) {
+	if (!newButton)
+		return list;
+
+	newButton->nextButton = 0;
+
+	if (list) {
+		Button *cur = list;
+		while (cur->nextButton)
+			cur = cur->nextButton;
+		cur->nextButton = newButton;
+	} else {
+		list = newButton;
+	}
+
+	return list;
+}
+
+void GUI::initMenuLayout(Menu &menu) {
+	if (menu.x == -1)
+		menu.x = (320 - menu.width) >> 1;
+	if (menu.y == -1)
+		menu.y = (200 - menu.height) >> 1;
+
+	for (int i = 0; i < menu.numberOfItems; ++i) {
+		if (menu.item[i].x == -1)
+			menu.item[i].x = (menu.width - menu.item[i].width) >> 1;
+	}
+}
+
+void GUI::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.bkgdColor);
+	_screen->drawShadedBox(menu.x, menu.y, menu_x2, menu_y2, menu.color1, menu.color2);
+
+	if (menu.titleX != -1)
+		textX = menu.titleX;
+	else
+		textX = _text->getCenterStringX(getMenuTitle(menu), menu.x, menu_x2);
+
+	textY = menu.y + menu.titleY;
+
+	_text->printText(getMenuTitle(menu), textX - 1, textY + 1, defaultColor1(), defaultColor2(), 0);
+	_text->printText(getMenuTitle(menu), textX, textY, menu.textColor, 0, 0);
+
+	int x1, y1, x2, y2;
+	for (int i = 0; i < menu.numberOfItems; ++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 < 7) {
+			Button *menuButtonData = getButtonListData() + i;
+			menuButtonData->nextButton = 0;
+			menuButtonData->x = x1;
+			menuButtonData->y = y1;
+			menuButtonData->width  = menu.item[i].width - 1;
+			menuButtonData->height = menu.item[i].height - 1;
+			menuButtonData->buttonCallback = menu.item[i].callback;
+			menuButtonData->index = menu.item[i].saveSlot;
+			menuButtonData->unk6 = menu.item[i].unk1F;
+			menuButtonData->unk8 = 0;
+
+			_menuButtonList = addButtonToList(_menuButtonList, menuButtonData);
+		}
+
+		_screen->fillRect(x1, y1, x2, y2, menu.item[i].bkgdColor);
+		_screen->drawShadedBox(x1, y1, x2, y2, menu.item[i].color1, menu.item[i].color2);
+
+		if (menu.item[i].itemString) {
+			if (menu.item[i].titleX != -1)
+				textX = x1 + menu.item[i].titleX + 3;
+			else
+				textX = _text->getCenterStringX(menu.item[i].itemString, x1, x2);
+
+			textY = y1 + 2;
+			_text->printText(menu.item[i].itemString, textX - 1, textY + 1, defaultColor1(), 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 (getMenuItemLabel(menu.item[i])) {
+				_text->printText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX - 1, menu.y + menu.item[i].labelY + 1, defaultColor1(), 0, 0);
+				_text->printText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX, menu.y + menu.item[i].labelY, menu.item[i].textColor, 0, 0);
+			}
+		}
+	}
+
+	if (menu.scrollUpButtonX != -1) {
+		_haveScrollButtons = true;
+
+		Button *scrollUpButton = getScrollUpButton();
+		scrollUpButton->x = menu.scrollUpButtonX + menu.x;
+		scrollUpButton->y = menu.scrollUpButtonY + menu.y;
+		scrollUpButton->buttonCallback = getScrollUpButtonHandler();
+		scrollUpButton->nextButton = 0;
+		
+		_menuButtonList = addButtonToList(_menuButtonList, scrollUpButton);
+		updateMenuButton(scrollUpButton);
+
+		Button *scrollDownButton = getScrollDownButton();
+		scrollDownButton->x = menu.scrollDownButtonX + menu.x;
+		scrollDownButton->y = menu.scrollDownButtonY + menu.y;
+		scrollDownButton->buttonCallback = getScrollDownButtonHandler();
+		scrollDownButton->nextButton = 0;
+
+		_menuButtonList = addButtonToList(_menuButtonList, scrollDownButton);
+		updateMenuButton(scrollDownButton);
+	} else {
+		_haveScrollButtons = false;
+	}
+
+	_screen->showMouse();
+	_screen->updateScreen();
+}
+
+void GUI::processHighlights(Menu &menu, int mouseX, int mouseY) {
+	int x1, y1, x2, y2;
+
+	for (int i = 0; i < menu.numberOfItems; ++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 (mouseX > x1 && mouseX < x2 &&
+			mouseY > y1 && mouseY < y2) {
+
+			if (menu.highlightedItem != i) {
+				if (menu.item[menu.highlightedItem].enabled)
+					redrawText(menu);
+
+				menu.highlightedItem = i;
+				redrawHighlight(menu);
+				_screen->updateScreen();
+			}
+		}
+	}
+}
+
+void GUI::redrawText(const 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].titleX >= 0)
+		textX = x1 + menu.item[i].titleX + 3;
+	else
+		textX = _text->getCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
+
+	int textY = y1 + 2;
+	_text->printText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);
+	_text->printText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 0);
+}
+
+void GUI::redrawHighlight(const 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].titleX != -1)
+		textX = x1 + menu.item[i].titleX + 3;
+	else
+		textX = _text->getCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
+
+	int textY = y1 + 2;
+	_text->printText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);
+	_text->printText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 0);
+}
+
+void GUI::updateAllMenuButtons() {
+	for (Button *cur = _menuButtonList; cur; cur = cur->nextButton)
+		updateMenuButton(cur);
+}
+
+void GUI::updateMenuButton(Button *button) {
+	if (!_displayMenu)
+		return;
+
+	_screen->hideMouse();
+	updateButton(button);
+	_screen->showMouse();
+}
+
+void GUI::updateButton(Button *button) {
+	if (!button || (button->flags & 8))
+		return;
+
+	if (button->flags2 & 1)
+		button->flags2 &= 0xFFF7;
+	else
+		button->flags2 |= 8;
+
+	button->flags2 &= 0xFFFC;
+
+	if (button->flags2 & 4)
+		button->flags2 |= 0x10;
+	else
+		button->flags2 &= 0xEEEF;
+
+	button->flags2 &= 0xFFFB;
+
+	processButton(button);
+}
+
+int GUI::redrawButtonCallback(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 GUI::redrawShadedButtonCallback(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;
+}
+
+} // end of namespace Kyra
+


Property changes on: scummvm/trunk/engines/kyra/gui.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + "Date Rev Author URL Id"
Name: svn:eol-style
   + native

Added: scummvm/trunk/engines/kyra/gui.h
===================================================================
--- scummvm/trunk/engines/kyra/gui.h	                        (rev 0)
+++ scummvm/trunk/engines/kyra/gui.h	2008-03-28 09:00:30 UTC (rev 31290)
@@ -0,0 +1,192 @@
+/* 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$
+ *
+ */
+
+#ifndef KYRA_GUI_H
+#define KYRA_GUI_H
+
+#include "kyra/util.h"
+#include "kyra/kyra.h"
+
+#include "common/ptr.h"
+
+namespace Kyra {
+
+#define BUTTON_FUNCTOR(type, x, y) Button::Callback(new Functor1Mem<Button*, int, type>(x, y))
+
+struct Button {
+	typedef Functor1<Button*, int> CallbackFunctor;
+	typedef Common::SharedPtr<CallbackFunctor> Callback;
+
+	Button *nextButton;
+	uint16 index;
+
+	uint16 unk6;
+	uint16 unk8;
+
+	byte data0Val1;
+	byte data1Val1;
+	byte data2Val1;
+
+	uint16 flags;
+
+	const uint8 *data0ShapePtr;
+	const uint8 *data1ShapePtr;
+	const uint8 *data2ShapePtr;
+	Callback data0Callback;
+	Callback data1Callback;
+	Callback data2Callback;
+
+	uint16 dimTableIndex;
+
+	int16 x, y;
+	uint16 width, height;
+
+	uint8 data0Val2;
+	uint8 data0Val3;
+
+	uint8 data1Val2;
+	uint8 data1Val3;
+
+	uint8 data2Val2;
+	uint8 data2Val3;
+
+	uint16 flags2;
+
+	Callback buttonCallback;
+};
+
+struct MenuItem {
+	bool enabled;
+
+	const char *itemString;
+	uint16 itemId;
+
+	int16 x, y;
+	uint16 width, height;
+
+	uint8 textColor, highlightColor;
+
+	int16 titleX;
+
+	uint8 color1, color2;
+	uint8 bkgdColor;
+
+	Button::Callback callback;
+
+	int16 saveSlot;
+
+	const char *labelString;
+	uint16 labelId;
+	int16 labelX, labelY;
+
+	uint16 unk1F;
+};
+
+struct Menu {
+	int16 x, y;
+	uint16 width, height;
+
+	uint8 bkgdColor;
+	uint8 color1, color2;
+
+	const char *menuNameString;
+	uint16 menuNameId;
+
+	uint8 textColor;
+	int16 titleX, titleY;
+
+	uint8 highlightedItem;
+
+	uint8 numberOfItems;
+
+	int16 scrollUpButtonX, scrollUpButtonY;
+	int16 scrollDownButtonX, scrollDownButtonY;
+
+	MenuItem item[7];
+};
+
+class Screen;
+class TextDisplayer;
+
+class GUI {
+public:
+	GUI(KyraEngine *vm);
+	virtual ~GUI() {}
+
+	// button specific
+	virtual Button *addButtonToList(Button *list, Button *newButton);
+
+	virtual void processButton(Button *button) = 0;
+	virtual int processButtonList(Button *buttonList, uint16 inputFlags) = 0;
+
+	int redrawShadedButtonCallback(Button *button);
+	int redrawButtonCallback(Button *button);
+
+	// menu specific
+	virtual void initMenuLayout(Menu &menu);
+	void initMenu(Menu &menu);
+
+	void processHighlights(Menu &menu, int mouseX, int mouseY);
+
+protected:
+	KyraEngine *_vm;
+	Screen *_screen;
+	TextDisplayer *_text;
+
+	Button *_menuButtonList;
+	bool _haveScrollButtons;
+	bool _displayMenu;
+	bool _displaySubMenu;
+	bool _cancelSubMenu;
+
+	Button::Callback _redrawShadedButtonFunctor;
+	Button::Callback _redrawButtonFunctor;
+
+	virtual Button *getButtonListData() = 0;
+	virtual Button *getScrollUpButton() = 0;
+	virtual Button *getScrollDownButton() = 0;
+
+	virtual Button::Callback getScrollUpButtonHandler() const = 0;
+	virtual Button::Callback getScrollDownButtonHandler() const = 0;
+
+	virtual uint8 defaultColor1() const = 0;
+	virtual uint8 defaultColor2() const = 0;
+
+	virtual const char *getMenuTitle(const Menu &menu) = 0;
+	virtual const char *getMenuItemTitle(const MenuItem &menuItem) = 0;
+	virtual const char *getMenuItemLabel(const MenuItem &menuItem) = 0;
+
+	void updateAllMenuButtons();
+	void updateMenuButton(Button *button);
+	virtual void updateButton(Button *button);
+
+	void redrawText(const Menu &menu);
+	void redrawHighlight(const Menu &menu);
+};
+
+} // end of namesapce Kyra
+
+#endif
+


Property changes on: scummvm/trunk/engines/kyra/gui.h
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + "Date Rev Author URL Id"
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/kyra/gui_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v1.cpp	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/gui_v1.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -29,6 +29,7 @@
 #include "kyra/text.h"
 #include "kyra/animator_v1.h"
 #include "kyra/sound.h"
+#include "kyra/gui_v1.h"
 
 #include "common/config-manager.h"
 #include "common/savefile.h"
@@ -38,31 +39,13 @@
 namespace Kyra {
 
 void KyraEngine_v1::initMainButtonList() {
-	_haveScrollButtons = false;
 	_buttonList = &_buttonData[0];
 	for (int i = 0; _buttonDataListPtr[i]; ++i)
-		_buttonList = initButton(_buttonList, _buttonDataListPtr[i]);
+		_buttonList = _gui->addButtonToList(_buttonList, _buttonDataListPtr[i]);
 }
 
-Button *KyraEngine_v1::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_v1::buttonInventoryCallback(Button *caller) {
-	int itemOffset = caller->specialValue - 2;
+	int itemOffset = caller->index - 2;
 	uint8 inventoryItem = _currentCharacter->inventoryItems[itemOffset];
 	if (_itemInHand == -1) {
 		if (inventoryItem == 0xFF) {
@@ -108,7 +91,7 @@
 int KyraEngine_v1::buttonAmuletCallback(Button *caller) {
 	if (!(_deathHandler & 8))
 		return 1;
-	int jewel = caller->specialValue - 0x14;
+	int jewel = caller->index - 0x14;
 	if (_currentCharacter->sceneId == 210) {
 		if (_beadStateVar == 4 || _beadStateVar == 6)
 			return 1;
@@ -201,12 +184,25 @@
 	return 1;
 }
 
-void KyraEngine_v1::processButtonList(Button *list) {
+#pragma mark -
+
+GUI_v1::GUI_v1(KyraEngine_v1 *vm) : GUI(vm), _vm(vm) {
+	_menu = 0;
+	initStaticResource();
+	_scrollUpFunctor = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::scrollUp);
+	_scrollDownFunctor = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::scrollDown);
+}
+
+GUI_v1::~GUI_v1() {
+	delete [] _menu;
+}
+
+int GUI_v1::processButtonList(Button *list, uint16 inputFlag) {
 	if (_haveScrollButtons) {
 		if (_mouseWheel < 0)
-			gui_scrollUp(&_scrollUpButton);
+			scrollUp(&_scrollUpButton);
 		else if (_mouseWheel > 0)
-			gui_scrollDown(&_scrollDownButton);
+			scrollDown(&_scrollDownButton);
 	}
 	while (list) {
 		if (list->flags & 8) {
@@ -227,11 +223,11 @@
 		}
 		y += _screen->_screenDimTable[list->dimTableIndex].sy;
 
-		Common::Point mouse = getMousePos();
+		Common::Point mouse = _vm->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 (_vm->_mousePressFlag) {
 					if (!(list->flags2 & 1)) {
 						list->flags2 |= 1;
 						list->flags2 |= 4;
@@ -245,13 +241,13 @@
 						processMouseClick = 1;
 					}
 				}
-			} else if (_mousePressFlag) {
+			} else if (_vm->_mousePressFlag) {
 				processMouseClick = 1;
 			}
 
 			if (processMouseClick) {
 				if (list->buttonCallback) {
-					if ((this->*(list->buttonCallback))(list)) {
+					if ((*list->buttonCallback.get())(list)) {
 						break;
 					}
 				}
@@ -272,35 +268,36 @@
 
 		list = list->nextButton;
 	}
+	return 0;
 }
 
-void KyraEngine_v1::processButton(Button *button) {
+void GUI_v1::processButton(Button *button) {
 	if (!button)
 		return;
 
 	int processType = 0;
-	uint8 *shape = 0;
-	Button::ButtonCallback callback = 0;
+	const uint8 *shape = 0;
+	Button::Callback callback;
 
 	int flags = (button->flags2 & 5);
 	if (flags == 1) {
-		processType = button->process2;
+		processType = button->data2Val1;
 		if (processType == 1)
-			shape = button->process2PtrShape;
+			shape = button->data2ShapePtr;
 		else if (processType == 4)
-			callback = button->process2PtrCallback;
+			callback = button->data2Callback;
 	} else if (flags == 4 || flags == 5) {
-		processType = button->process1;
+		processType = button->data1Val1;
 		if (processType == 1)
-			shape = button->process1PtrShape;
+			shape = button->data1ShapePtr;
 		else if (processType == 4)
-			callback = button->process1PtrCallback;
+			callback = button->data1Callback;
 	} else {
-		processType = button->process0;
+		processType = button->data0Val1;
 		if (processType == 1)
-			shape = button->process0PtrShape;
+			shape = button->data0ShapePtr;
 		else if (processType == 4)
-			callback = button->process0PtrCallback;
+			callback = button->data0Callback;
 	}
 
 	int x = button->x;
@@ -315,70 +312,10 @@
 	if (processType == 1 && shape)
 		_screen->drawShape(_screen->_curPage, shape, x, y, button->dimTableIndex, 0x10);
 	else if (processType == 4 && callback)
-		(this->*callback)(button);
+		(*callback.get())(button);
 }
 
-void KyraEngine_v1::processAllMenuButtons() {
-	if (!_menuButtonList)
-		return;
-
-	Button *cur = _menuButtonList;
-	while (true) {
-		if (!cur->nextButton)
-			break;
-		processMenuButton(cur);
-		cur = cur->nextButton;
-	}
-	return;
-}
-
-void KyraEngine_v1::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_v1::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_v1::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_v1::setGUILabels() {
+void GUI_v1::setGUILabels() {
 	int offset = 0;
 	int offsetOptions = 0;
 	int offsetMainMenu = 0;
@@ -387,146 +324,147 @@
 	int walkspeedGarbageOffset = 36;
 	int menuLabelGarbageOffset = 0;
 
-	if (_flags.isTalkie) {
-		if (_flags.lang == Common::EN_ANY)
+	if (_vm->gameFlags().isTalkie) {
+		if (_vm->gameFlags().lang == Common::EN_ANY)
 			offset = 52;
-		else if (_flags.lang == Common::DE_DEU)
+		else if (_vm->gameFlags().lang == Common::DE_DEU)
 			offset = 30;
-		else if (_flags.lang == Common::FR_FRA || _flags.lang == Common::IT_ITA)
+		else if (_vm->gameFlags().lang == Common::FR_FRA || _vm->gameFlags().lang == Common::IT_ITA)
 			offset = 6;
 		offsetOn = offsetMainMenu = offsetOptions = offset;
 		walkspeedGarbageOffset = 48;
-	} else if (_flags.lang == Common::ES_ESP) {
+	} else if (_vm->gameFlags().lang == Common::ES_ESP) {
 		offsetOn = offsetMainMenu = offsetOptions = offset = -4;
 		menuLabelGarbageOffset = 72;
-	} else if (_flags.lang == Common::DE_DEU) {
+	} else if (_vm->gameFlags().lang == Common::DE_DEU) {
 		offset = offsetMainMenu = offsetOn = offsetOptions = 24;
-	} else if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) {
+	} else if (_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) {
 		offset = 1;
 		offsetOptions = 10;
 		offsetOn = 0;
 		walkspeedGarbageOffset = 0;
 	}
 
-	assert(offset + 27 < _guiStringsSize);
+	assert(offset + 27 < _vm->_guiStringsSize);
 
 	// The Legend of Kyrandia
-	_menu[0].menuName = _guiStrings[0];
+	_menu[0].menuNameString = _vm->_guiStrings[0];
 	// Load a Game
-	_menu[0].item[0].itemString = _guiStrings[1];
+	_menu[0].item[0].itemString = _vm->_guiStrings[1];
 	// Save a Game
-	_menu[0].item[1].itemString = _guiStrings[2];
+	_menu[0].item[1].itemString = _vm->_guiStrings[2];
 	// Game controls
-	_menu[0].item[2].itemString = _guiStrings[3];
+	_menu[0].item[2].itemString = _vm->_guiStrings[3];
 	// Quit playing
-	_menu[0].item[3].itemString = _guiStrings[4];
+	_menu[0].item[3].itemString = _vm->_guiStrings[4];
 	// Resume game
-	_menu[0].item[4].itemString = _guiStrings[5];
+	_menu[0].item[4].itemString = _vm->_guiStrings[5];
 
 	// Cancel
-	_menu[2].item[5].itemString = _guiStrings[10];
+	_menu[2].item[5].itemString = _vm->_guiStrings[10];
 
 	// Enter a description of your saved game:
-	_menu[3].menuName = _guiStrings[11];
+	_menu[3].menuNameString = _vm->_guiStrings[11];
 	// Save
-	_menu[3].item[0].itemString = _guiStrings[12];
+	_menu[3].item[0].itemString = _vm->_guiStrings[12];
 	// Cancel
-	_menu[3].item[1].itemString = _guiStrings[10];
+	_menu[3].item[1].itemString = _vm->_guiStrings[10];
 
 	// Rest in peace, Brandon
-	_menu[4].menuName = _guiStrings[13];
+	_menu[4].menuNameString = _vm->_guiStrings[13];
 	// Load a game
-	_menu[4].item[0].itemString = _guiStrings[1];
+	_menu[4].item[0].itemString = _vm->_guiStrings[1];
 	// Quit playing
-	_menu[4].item[1].itemString = _guiStrings[4];
+	_menu[4].item[1].itemString = _vm->_guiStrings[4];
 
 	// Game Controls
-	_menu[5].menuName = _guiStrings[6];
+	_menu[5].menuNameString = _vm->_guiStrings[6];
 	// Yes
-	_menu[1].item[0].itemString = _guiStrings[22 + offset];
+	_menu[1].item[0].itemString = _vm->_guiStrings[22 + offset];
 	// No
-	_menu[1].item[1].itemString = _guiStrings[23 + offset];
+	_menu[1].item[1].itemString = _vm->_guiStrings[23 + offset];
 
 	// Music is
-	_menu[5].item[0].labelString = _guiStrings[26 + offsetOptions];
+	_menu[5].item[0].labelString = _vm->_guiStrings[26 + offsetOptions];
 	// Sounds are
-	_menu[5].item[1].labelString = _guiStrings[27 + offsetOptions];
+	_menu[5].item[1].labelString = _vm->_guiStrings[27 + offsetOptions];
 	// Walk speed
-	_menu[5].item[2].labelString = &_guiStrings[24 + offsetOptions][walkspeedGarbageOffset];
+	_menu[5].item[2].labelString = &_vm->_guiStrings[24 + offsetOptions][walkspeedGarbageOffset];
 	// Text speed
-	_menu[5].item[4].labelString = _guiStrings[25 + offsetOptions];
+	_menu[5].item[4].labelString = _vm->_guiStrings[25 + offsetOptions];
 	// Main Menu
-	_menu[5].item[5].itemString = &_guiStrings[19 + offsetMainMenu][menuLabelGarbageOffset];
+	_menu[5].item[5].itemString = &_vm->_guiStrings[19 + offsetMainMenu][menuLabelGarbageOffset];
 
-	if (_flags.isTalkie)
+	if (_vm->gameFlags().isTalkie)
 		// Text & Voice
-		_voiceTextString = _guiStrings[28 + offset];
+		_voiceTextString = _vm->_guiStrings[28 + offset];
 
-	_textSpeedString = _guiStrings[25 + offsetOptions];
-	_onString =  _guiStrings[20 + offsetOn];
-	_offString =  _guiStrings[21 + offset];
-	_onCDString = _guiStrings[21];
+	_textSpeedString = _vm->_guiStrings[25 + offsetOptions];
+	_onString =  _vm->_guiStrings[20 + offsetOn];
+	_offString =  _vm->_guiStrings[21 + offset];
+	_onCDString = _vm->_guiStrings[21];
 }
 
-int KyraEngine_v1::buttonMenuCallback(Button *caller) {
+int GUI_v1::buttonMenuCallback(Button *caller) {
 	_displayMenu = true;
 
-	assert(_guiStrings);
-	assert(_configStrings);
+	assert(_vm->_guiStrings);
+	assert(_vm->_configStrings);
 
 	/*
-	for (int i = 0; i < _guiStringsSize; i++)
-		debug("GUI string %i: %s", i, _guiStrings[i]);
+	for (int i = 0; i < _vm->_guiStringsSize; i++)
+		debug("GUI string %i: %s", i, _vm->_guiStrings[i]);
 
-	for (int i = 0; i < _configStringsSize; i++)
-		debug("Config string %i: %s", i, _configStrings[i]);
+	for (int i = 0; i < _vm->_configStringsSize; i++)
+		debug("Config string %i: %s", i, _vm->_configStrings[i]);
 	*/
 
 	setGUILabels();
-	if (_currentCharacter->sceneId == 210 && _deathHandler == 0xFF) {
-		snd_playSoundEffect(0x36);
+	if (_vm->_currentCharacter->sceneId == 210 && _vm->_deathHandler == 0xFF) {
+		_vm->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_v1::drawShadedBoxCallback;
-		_menuButtonData[i].process1PtrCallback = &KyraEngine_v1::drawBoxCallback;
-		_menuButtonData[i].process2PtrCallback = &KyraEngine_v1::drawShadedBoxCallback;
+		_menuButtonData[i].data0Val1 = _menuButtonData[i].data1Val1 = _menuButtonData[i].data2Val1 = 4;
+		_menuButtonData[i].data0Callback = _redrawShadedButtonFunctor;
+		_menuButtonData[i].data1Callback = _redrawButtonFunctor;
+		_menuButtonData[i].data2Callback = _redrawButtonFunctor;
 	}
 
 	_screen->savePageToDisk("SEENPAGE.TMP", 0);
-	gui_fadePalette();
+	fadePalette();
 
 	for (int i = 0; i < 5; i++)
-		calcCoords(_menu[i]);
+		initMenuLayout(_menu[i]);
 
 	_menuRestoreScreen = true;
 	_keyPressed.reset();
-	_mousePressFlag = false;
+	_vm->_mousePressFlag = false;
 
 	_toplevelMenu = 0;
-	if (_menuDirectlyToLoad) {
-		gui_loadGameMenu(0);
+	if (_vm->_menuDirectlyToLoad) {
+		loadGameMenu(0);
 	} else {
 		if (!caller)
 			_toplevelMenu = 4;
 
 		initMenu(_menu[_toplevelMenu]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	}
 
-	while (_displayMenu && !_quitFlag) {
-		gui_processHighlights(_menu[_toplevelMenu]);
-		processButtonList(_menuButtonList);
-		gui_getInput();
+	while (_displayMenu && !_vm->_quitFlag) {
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[_toplevelMenu], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
+		getInput();
 	}
 
 	if (_menuRestoreScreen) {
-		gui_restorePalette();
+		restorePalette();
 		_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
-		_animator->_updateScreen = true;
+		_vm->_animator->_updateScreen = true;
 	} else {
 		_screen->deletePageFromDisk(0);
 	}
@@ -534,106 +472,7 @@
 	return 0;
 }
 
-void KyraEngine_v1::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].saveSlot;
-			//_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_v1::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_v1::gui_scrollDown;
-		_scrollDownButton.nextButton = 0;
-		_menuButtonList = initButton(_menuButtonList, &_scrollDownButton);
-		processMenuButton(&_scrollDownButton);
-	} else {
-		_haveScrollButtons = false;
-	}
-
-	_screen->showMouse();
-	_screen->updateScreen();
-}
-
-void KyraEngine_v1::calcCoords(Menu &menu) {
+/*void KyraEngine_v1::initMenuLayout(Menu &menu) {
 	assert(menu.nrOfItems < 7);
 
 	int widthBackup = _screen->_charWidth;
@@ -688,10 +527,10 @@
 		menu.width += maxOffset;
 	}
 
-	if (menu.menuName != 0) {
-		int menuNameLength = _screen->getTextWidth(menu.menuName);
-		if (menuNameLength  > menu.width)
-			menu.width = menuNameLength;
+	if (menu.menuNameString != 0) {
+		int menuNameStringLength = _screen->getTextWidth(menu.menuNameString);
+		if (menuNameStringLength  > menu.width)
+			menu.width = menuNameStringLength;
 	}
 
 	if (menu.width > 310)
@@ -703,27 +542,27 @@
 		menu.y = (200 - menu.height)/2;
 
 	_screen->_charWidth = widthBackup;
-}
+}*/
 
-void KyraEngine_v1::gui_getInput() {
+void GUI_v1::getInput() {
 	Common::Event event;
 	static uint32 lastScreenUpdate = 0;
-	uint32 now = _system->getMillis();
+	uint32 now = _vm->_system->getMillis();
 
 	_mouseWheel = 0;
-	while (_eventMan->pollEvent(event)) {
+	while (_vm->_eventMan->pollEvent(event)) {
 		switch (event.type) {
 		case Common::EVENT_QUIT:
-			quitGame();
+			_vm->quitGame();
 			break;
 		case Common::EVENT_LBUTTONDOWN:
-			_mousePressFlag = true;
+			_vm->_mousePressFlag = true;
 			break;
 		case Common::EVENT_LBUTTONUP:
-			_mousePressFlag = false;
+			_vm->_mousePressFlag = false;
 			break;
 		case Common::EVENT_MOUSEMOVE:
-			_system->updateScreen();
+			_vm->_system->updateScreen();
 			lastScreenUpdate = now;
 			break;
 		case Common::EVENT_WHEELUP:
@@ -741,35 +580,35 @@
 	}
 
 	if (now - lastScreenUpdate > 50) {
-		_system->updateScreen();
+		_vm->_system->updateScreen();
 		lastScreenUpdate = now;
 	}
 
-	_system->delayMillis(3);
+	_vm->_system->delayMillis(3);
 }
 
-int KyraEngine_v1::gui_resumeGame(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_resumeGame()");
-	processMenuButton(button);
+int GUI_v1::resumeGame(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::resumeGame()");
+	updateMenuButton(button);
 	_displayMenu = false;
 
 	return 0;
 }
 
-int KyraEngine_v1::getNextSavegameSlot() {
+int GUI_v1::getNextSavegameSlot() {
 	Common::InSaveFile *in;
 
 	for (int i = 1; i < 1000; i++) {
-		if ((in = _saveFileMan->openForLoading(getSavegameFilename(i))))
+		if ((in = _vm->_saveFileMan->openForLoading(_vm->getSavegameFilename(i))))
 			delete in;
 		else
 			return i;
 	}
-	warning("Didn't save: Ran out of savegame filenames");
+	warning("Didn't save: Ran out of saveGame filenames");
 	return 0;
 }
 
-void KyraEngine_v1::setupSavegames(Menu &menu, int num) {
+void GUI_v1::setupSavegames(Menu &menu, int num) {
 	Common::InSaveFile *in;
 	static char savenames[5][31];
 	uint8 startSlot;
@@ -785,7 +624,7 @@
 	}
 
 	for (int i = startSlot; i < num; i++) {
-		if ((in = _saveFileMan->openForLoading(getSavegameFilename(i + _savegameOffset)))) {
+		if ((in = _vm->_saveFileMan->openForLoading(_vm->getSavegameFilename(i + _savegameOffset)))) {
 			in->skip(8);
 			in->read(savenames[i], 31);
 			menu.item[i].itemString = savenames[i];
@@ -800,32 +639,33 @@
 	}
 }
 
-int KyraEngine_v1::gui_saveGameMenu(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_saveGameMenu()");
-	processMenuButton(button);
+int GUI_v1::saveGameMenu(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::saveGameMenu()");
+	updateMenuButton(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 ]
+	_menu[2].menuNameString = _vm->_guiStrings[8]; // Select a position to save to:
+	_specialSavegameString = _vm->_guiStrings[9]; // [ EMPTY SLOT ]
 	for (int i = 0; i < 5; i++)
-		_menu[2].item[i].callback = &KyraEngine_v1::gui_saveGame;
+		_menu[2].item[i].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::saveGame);
 
 	_savegameOffset = 0;
 	setupSavegames(_menu[2], 5);
 
 	initMenu(_menu[2]);
-	processAllMenuButtons();
+	updateAllMenuButtons();
 
 	_displaySubMenu = true;
 	_cancelSubMenu = false;
 
-	while (_displaySubMenu && !_quitFlag) {
-		gui_getInput();
-		gui_processHighlights(_menu[2]);
-		processButtonList(_menuButtonList);
+	while (_displaySubMenu && !_vm->_quitFlag) {
+		getInput();
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[2], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
 	}
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
@@ -833,43 +673,44 @@
 
 	if (_cancelSubMenu) {
 		initMenu(_menu[0]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	} else {
 		_displayMenu = false;
 	}
 	return 0;
 }
 
-int KyraEngine_v1::gui_loadGameMenu(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_loadGameMenu()");
-	if (_menuDirectlyToLoad) {
+int GUI_v1::loadGameMenu(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::loadGameMenu()");
+	if (_vm->_menuDirectlyToLoad) {
 		_menu[2].item[5].enabled = false;
 	} else {
-		processMenuButton(button);
+		updateMenuButton(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?
+	_specialSavegameString = _vm->_newGameString[0]; //[ START A NEW GAME ]
+	_menu[2].menuNameString = _vm->_guiStrings[7]; // Which game would you like to reload?
 	for (int i = 0; i < 5; i++)
-		_menu[2].item[i].callback = &KyraEngine_v1::gui_loadGame;
+		_menu[2].item[i].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::loadGame);
 
 	_savegameOffset = 0;
 	setupSavegames(_menu[2], 5);
 
 	initMenu(_menu[2]);
-	processAllMenuButtons();
+	updateAllMenuButtons();
 
 	_displaySubMenu = true;
 	_cancelSubMenu = false;
 
-	while (_displaySubMenu && !_quitFlag) {
-		gui_getInput();
-		gui_processHighlights(_menu[2]);
-		processButtonList(_menuButtonList);
+	while (_displaySubMenu && !_vm->_quitFlag) {
+		getInput();
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[2], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
 	}
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
@@ -877,17 +718,17 @@
 
 	if (_cancelSubMenu) {
 		initMenu(_menu[_toplevelMenu]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	} else {
-		gui_restorePalette();
-		loadGame(getSavegameFilename(_gameToLoad));
+		restorePalette();
+		_vm->loadGame(_vm->getSavegameFilename(_vm->_gameToLoad));
 		_displayMenu = false;
 		_menuRestoreScreen = false;
 	}
 	return 0;
 }
 
-void KyraEngine_v1::gui_redrawTextfield() {
+void GUI_v1::redrawTextfield() {
 	_screen->fillRect(38, 91, 287, 102, 250);
 	_text->printText(_savegameName, 38, 92, 253, 0, 0);
 
@@ -899,7 +740,7 @@
 	_screen->updateScreen();
 }
 
-void KyraEngine_v1::gui_updateSavegameString() {
+void GUI_v1::updateSavegameString() {
 	int length;
 
 	if (_keyPressed.keycode) {
@@ -909,13 +750,13 @@
 			if (length < 31) {
 				_savegameName[length] = _keyPressed.ascii;
 				_savegameName[length+1] = 0;
-				gui_redrawTextfield();
+				redrawTextfield();
 			}
 		} else if (_keyPressed.keycode == Common::KEYCODE_BACKSPACE ||
 		           _keyPressed.keycode == Common::KEYCODE_DELETE) {
 			if (length > 0) {
 				_savegameName[length-1] = 0;
-				gui_redrawTextfield();
+				redrawTextfield();
 			}
 		} else if (_keyPressed.keycode == Common::KEYCODE_RETURN ||
 		           _keyPressed.keycode == Common::KEYCODE_KP_ENTER) {
@@ -926,111 +767,113 @@
 	_keyPressed.reset();
 }
 
-int KyraEngine_v1::gui_saveGame(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_saveGame()");
-	processMenuButton(button);
-	_gameToLoad = button->specialValue;
+int GUI_v1::saveGame(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::saveGame()");
+	updateMenuButton(button);
+	_vm->_gameToLoad = button->index;
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
 	_screen->savePageToDisk("SEENPAGE.TMP", 0);
 
 	initMenu(_menu[3]);
-	processAllMenuButtons();
+	updateAllMenuButtons();
 
 	_displaySubMenu = true;
 	_cancelSubMenu = false;
 
-	if (_savegameOffset == 0 && _gameToLoad == 0) {
+	if (_savegameOffset == 0 && _vm->_gameToLoad == 0) {
 		_savegameName[0] = 0;
 	} else {
 		for (int i = 0; i < 5; i++) {
-			if (_menu[2].item[i].saveSlot == _gameToLoad) {
+			if (_menu[2].item[i].saveSlot == _vm->_gameToLoad) {
 				strncpy(_savegameName, _menu[2].item[i].itemString, 31);
 				break;
 			}
 		}
 	}
-	gui_redrawTextfield();
+	redrawTextfield();
 
-	while (_displaySubMenu && !_quitFlag) {
-		gui_getInput();
-		gui_updateSavegameString();
-		gui_processHighlights(_menu[3]);
-		processButtonList(_menuButtonList);
+	while (_displaySubMenu && !_vm->_quitFlag) {
+		getInput();
+		updateSavegameString();
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[3], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
 	}
 
 	if (_cancelSubMenu) {
 		_displaySubMenu = true;
 		_cancelSubMenu = false;
 		initMenu(_menu[2]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	} else {
-		if (_savegameOffset == 0 && _gameToLoad == 0)
-			_gameToLoad = getNextSavegameSlot();
-		if (_gameToLoad > 0)
-			saveGame(getSavegameFilename(_gameToLoad), _savegameName);
+		if (_savegameOffset == 0 && _vm->_gameToLoad == 0)
+			_vm->_gameToLoad = getNextSavegameSlot();
+		if (_vm->_gameToLoad > 0)
+			_vm->saveGame(_vm->getSavegameFilename(_vm->_gameToLoad), _savegameName);
 	}
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_savegameConfirm(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_savegameConfirm()");
-	processMenuButton(button);
+int GUI_v1::savegameConfirm(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::savegameConfirm()");
+	updateMenuButton(button);
 	_displaySubMenu = false;
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_loadGame(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_loadGame()");
-	processMenuButton(button);
+int GUI_v1::loadGame(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::loadGame()");
+	updateMenuButton(button);
 	_displaySubMenu = false;
-	_gameToLoad = button->specialValue;
+	_vm->_gameToLoad = button->index;
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_cancelSubMenu(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_cancelLoadGameMenu()");
-	processMenuButton(button);
+int GUI_v1::cancelSubMenu(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::cancelSubMenu()");
+	updateMenuButton(button);
 	_displaySubMenu = false;
 	_cancelSubMenu = true;
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_quitPlaying(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_quitPlaying()");
-	processMenuButton(button);
+int GUI_v1::quitPlaying(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::quitPlaying()");
+	updateMenuButton(button);
 
-	if (gui_quitConfirm(_guiStrings[14])) { // Are you sure you want to quit playing?
-		quitGame();
+	if (quitConfirm(_vm->_guiStrings[14])) { // Are you sure you want to quit playing?
+		_vm->quitGame();
 	} else {
 		initMenu(_menu[_toplevelMenu]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	}
 
 	return 0;
 }
 
-bool KyraEngine_v1::gui_quitConfirm(const char *str) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_quitConfirm()");
+bool GUI_v1::quitConfirm(const char *str) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::quitConfirm()");
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
 	_screen->savePageToDisk("SEENPAGE.TMP", 0);
 
-	_menu[1].menuName = str;
-	calcCoords(_menu[1]);
+	_menu[1].menuNameString = str;
+	initMenuLayout(_menu[1]);
 	initMenu(_menu[1]);
 
 	_displaySubMenu = true;
 	_cancelSubMenu = true;
 
-	while (_displaySubMenu && !_quitFlag) {
-		gui_getInput();
-		gui_processHighlights(_menu[1]);
-		processButtonList(_menuButtonList);
+	while (_displaySubMenu && !_vm->_quitFlag) {
+		getInput();
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[1], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
 	}
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
@@ -1039,33 +882,33 @@
 	return !_cancelSubMenu;
 }
 
-int KyraEngine_v1::gui_quitConfirmYes(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_quitConfirmYes()");
-	processMenuButton(button);
+int GUI_v1::quitConfirmYes(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::quitConfirmYes()");
+	updateMenuButton(button);
 	_displaySubMenu = false;
 	_cancelSubMenu = false;
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_quitConfirmNo(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_quitConfirmNo()");
-	processMenuButton(button);
+int GUI_v1::quitConfirmNo(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::quitConfirmNo()");
+	updateMenuButton(button);
 	_displaySubMenu = false;
 	_cancelSubMenu = true;
 
 	return 0;
 }
 
-int KyraEngine_v1::gui_gameControlsMenu(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_gameControlsMenu()");
+int GUI_v1::gameControlsMenu(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::gameControlsMenu()");
 
-	readSettings();
+	_vm->readSettings();
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
 	_screen->savePageToDisk("SEENPAGE.TMP", 0);
 
-	if (_flags.isTalkie) {
+	if (_vm->gameFlags().isTalkie) {
 		//_menu[5].width = 230;
 
 		for (int i = 0; i < 5; i++) {
@@ -1075,27 +918,28 @@
 		}
 
 		_menu[5].item[3].labelString = _voiceTextString; //"Voice / Text "
-		_menu[5].item[3].callback = &KyraEngine_v1::gui_controlsChangeVoice;
+		_menu[5].item[3].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::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_v1::gui_controlsChangeText;
+		_menu[5].item[3].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsChangeText);
 	}
 
-	gui_setupControls(_menu[5]);
+	setupControls(_menu[5]);
 
-	processAllMenuButtons();
+	updateAllMenuButtons();
 
 	_displaySubMenu = true;
 	_cancelSubMenu = false;
 
-	while (_displaySubMenu && !_quitFlag) {
-		gui_getInput();
-		gui_processHighlights(_menu[5]);
-		processButtonList(_menuButtonList);
+	while (_displaySubMenu && !_vm->_quitFlag) {
+		getInput();
+		Common::Point mouse = _vm->getMousePos();
+		processHighlights(_menu[5], mouse.x, mouse.y);
+		processButtonList(_menuButtonList, 0);
 	}
 
 	_screen->loadPageFromDisk("SEENPAGE.TMP", 0);
@@ -1103,15 +947,15 @@
 
 	if (_cancelSubMenu) {
 		initMenu(_menu[_toplevelMenu]);
-		processAllMenuButtons();
+		updateAllMenuButtons();
 	}
 	return 0;
 }
 
-void KyraEngine_v1::gui_setupControls(Menu &menu) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_setupControls()");
+void GUI_v1::setupControls(Menu &menu) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::setupControls()");
 
-	switch (_configMusic) {
+	switch (_vm->_configMusic) {
 		case 0:
 			menu.item[0].itemString = _offString; //"Off"
 			break;
@@ -1123,27 +967,27 @@
 			break;
 	}
 
-	if (_configSounds)
+	if (_vm->_configSounds)
 		menu.item[1].itemString = _onString; //"On"
 	else
 		menu.item[1].itemString = _offString; //"Off"
 
 
-	switch (_configWalkspeed) {
+	switch (_vm->_configWalkspeed) {
 	case 0:
-		menu.item[2].itemString = _configStrings[0]; //"Slowest"
+		menu.item[2].itemString = _vm->_configStrings[0]; //"Slowest"
 		break;
 	case 1:
-		menu.item[2].itemString = _configStrings[1]; //"Slow"
+		menu.item[2].itemString = _vm->_configStrings[1]; //"Slow"
 		break;
 	case 2:
-		menu.item[2].itemString = _configStrings[2]; //"Normal"
+		menu.item[2].itemString = _vm->_configStrings[2]; //"Normal"
 		break;
 	case 3:
-		menu.item[2].itemString = _configStrings[3]; //"Fast"
+		menu.item[2].itemString = _vm->_configStrings[3]; //"Fast"
 		break;
 	case 4:
-		menu.item[2].itemString = _configStrings[4]; //"Fastest"
+		menu.item[2].itemString = _vm->_configStrings[4]; //"Fastest"
 		break;
 	default:
 		menu.item[2].itemString = "ERROR";
@@ -1152,24 +996,24 @@
 
 	int textControl = 3;
 	int clickableOffset = 8;
-	if (_flags.isTalkie) {
+	if (_vm->gameFlags().isTalkie) {
 		textControl = 4;
 		clickableOffset = 11;
 
-		if (_configVoice == 0)
+		if (_vm->_configVoice == 0)
 			_menu[5].item[4].enabled = 1;
 		else
 			_menu[5].item[4].enabled = 0;
 
-		switch (_configVoice) {
+		switch (_vm->_configVoice) {
 		case 0:
-			menu.item[3].itemString = _configStrings[5]; //"Text only"
+			menu.item[3].itemString = _vm->_configStrings[5]; //"Text only"
 			break;
 		case 1:
-			menu.item[3].itemString = _configStrings[6]; //"Voice only"
+			menu.item[3].itemString = _vm->_configStrings[6]; //"Voice only"
 			break;
 		case 2:
-			menu.item[3].itemString = _configStrings[7]; //"Voice & Text"
+			menu.item[3].itemString = _vm->_configStrings[7]; //"Voice & Text"
 			break;
 		default:
 			menu.item[3].itemString = "ERROR";
@@ -1177,83 +1021,83 @@
 		}
 	}
 
-	switch (_configTextspeed) {
+	switch (_vm->_configTextspeed) {
 	case 0:
-		menu.item[textControl].itemString = _configStrings[1]; //"Slow"
+		menu.item[textControl].itemString = _vm->_configStrings[1]; //"Slow"
 		break;
 	case 1:
-		menu.item[textControl].itemString = _configStrings[2]; //"Normal"
+		menu.item[textControl].itemString = _vm->_configStrings[2]; //"Normal"
 		break;
 	case 2:
-		menu.item[textControl].itemString = _configStrings[3]; //"Fast"
+		menu.item[textControl].itemString = _vm->_configStrings[3]; //"Fast"
 		break;
 	case 3:
-		menu.item[textControl].itemString = _configStrings[clickableOffset]; //"Clickable"
+		menu.item[textControl].itemString = _vm->_configStrings[clickableOffset]; //"Clickable"
 		break;
 	default:
 		menu.item[textControl].itemString = "ERROR";
 		break;
 	}
 
-	calcCoords(menu);
+	initMenuLayout(menu);
 	initMenu(menu);
 }
 
-int KyraEngine_v1::gui_controlsChangeMusic(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsChangeMusic()");
-	processMenuButton(button);
+int GUI_v1::controlsChangeMusic(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsChangeMusic()");
+	updateMenuButton(button);
 
-	_configMusic = ++_configMusic % ((_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) ? 3 : 2);
-	gui_setupControls(_menu[5]);
+	_vm->_configMusic = ++_vm->_configMusic % ((_vm->gameFlags().platform == Common::kPlatformFMTowns || _vm->gameFlags().platform == Common::kPlatformPC98) ? 3 : 2);
+	setupControls(_menu[5]);
 	return 0;
 }
 
-int KyraEngine_v1::gui_controlsChangeSounds(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsChangeSounds()");
-	processMenuButton(button);
+int GUI_v1::controlsChangeSounds(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsChangeSounds()");
+	updateMenuButton(button);
 
-	_configSounds = !_configSounds;
-	gui_setupControls(_menu[5]);
+	_vm->_configSounds = !_vm->_configSounds;
+	setupControls(_menu[5]);
 	return 0;
 }
 
-int KyraEngine_v1::gui_controlsChangeWalk(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsChangeWalk()");
-	processMenuButton(button);
+int GUI_v1::controlsChangeWalk(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsChangeWalk()");
+	updateMenuButton(button);
 
-	_configWalkspeed = ++_configWalkspeed % 5;
-	setWalkspeed(_configWalkspeed);
-	gui_setupControls(_menu[5]);
+	_vm->_configWalkspeed = ++_vm->_configWalkspeed % 5;
+	_vm->setWalkspeed(_vm->_configWalkspeed);
+	setupControls(_menu[5]);
 	return 0;
 }
 
-int KyraEngine_v1::gui_controlsChangeText(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsChangeText()");
-	processMenuButton(button);
+int GUI_v1::controlsChangeText(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsChangeText()");
+	updateMenuButton(button);
 
-	_configTextspeed = ++_configTextspeed % 4;
-	gui_setupControls(_menu[5]);
+	_vm->_configTextspeed = ++_vm->_configTextspeed % 4;
+	setupControls(_menu[5]);
 	return 0;
 }
 
-int KyraEngine_v1::gui_controlsChangeVoice(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsChangeVoice()");
-	processMenuButton(button);
+int GUI_v1::controlsChangeVoice(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsChangeVoice()");
+	updateMenuButton(button);
 
-	_configVoice = ++_configVoice % 3;
-	gui_setupControls(_menu[5]);
+	_vm->_configVoice = ++_vm->_configVoice % 3;
+	setupControls(_menu[5]);
 	return 0;
 }
 
-int KyraEngine_v1::gui_controlsApply(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_controlsApply()");
-	writeSettings();
-	return gui_cancelSubMenu(button);
+int GUI_v1::controlsApply(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::controlsApply()");
+	_vm->writeSettings();
+	return cancelSubMenu(button);
 }
 
-int KyraEngine_v1::gui_scrollUp(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_scrollUp()");
-	processMenuButton(button);
+int GUI_v1::scrollUp(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::scrollUp()");
+	updateMenuButton(button);
 
 	if (_savegameOffset > 0) {
 		_savegameOffset--;
@@ -1263,9 +1107,9 @@
 	return 0;
 }
 
-int KyraEngine_v1::gui_scrollDown(Button *button) {
-	debugC(9, kDebugLevelGUI, "KyraEngine_v1::gui_scrollDown()");
-	processMenuButton(button);
+int GUI_v1::scrollDown(Button *button) {
+	debugC(9, kDebugLevelGUI, "GUI_v1::scrollDown()");
+	updateMenuButton(button);
 
 	_savegameOffset++;
 	setupSavegames(_menu[2], 5);
@@ -1274,75 +1118,8 @@
 	return 0;
 }
 
-void KyraEngine_v1::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_v1::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_v1::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_v1::gui_fadePalette() {
-	if (_flags.platform == Common::kPlatformAmiga)
+void GUI_v1::fadePalette() {
+	if (_vm->gameFlags().platform == Common::kPlatformAmiga)
 		return;
 
 	static int16 menuPalIndexes[] = {248, 249, 250, 251, 252, 253, 254, -1};
@@ -1361,8 +1138,8 @@
 	_screen->fadePalette(_screen->_currentPalette, 2);
 }
 
-void KyraEngine_v1::gui_restorePalette() {
-	if (_flags.platform == Common::kPlatformAmiga)
+void GUI_v1::restorePalette() {
+	if (_vm->gameFlags().platform == Common::kPlatformAmiga)
 		return;
 
 	memcpy(_screen->_currentPalette, _screen->getPalette(2), 768);

Added: scummvm/trunk/engines/kyra/gui_v1.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_v1.h	                        (rev 0)
+++ scummvm/trunk/engines/kyra/gui_v1.h	2008-03-28 09:00:30 UTC (rev 31290)
@@ -0,0 +1,176 @@
+/* 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$
+ *
+ */
+
+#ifndef KYRA_GUI_V1_H
+#define KYRA_GUI_V1_H
+
+#include "kyra/gui.h"
+
+namespace Kyra {
+
+#define GUI_V1_BUTTON(button, a, b, c, d, e, f, g, h, i, j, k) \
+	button.nextButton = 0; \
+	button.index = a; \
+	button.unk6 = button.unk8 = 0; \
+	button.data0Val1 = b; \
+	button.data1Val1 = c; \
+	button.data2Val1 = d; \
+	button.data0ShapePtr = button.data1ShapePtr = button.data2ShapePtr = 0; \
+	button.flags = e; \
+	button.dimTableIndex = f; \
+	button.x = g; \
+	button.y = h; \
+	button.width = i; \
+	button.height = j; \
+	button.flags2 = k
+
+#define GUI_V1_MENU(menu, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) \
+	menu.x = a; \
+	menu.y = b; \
+	menu.width = c; \
+	menu.height = d; \
+	menu.bkgdColor = e; \
+	menu.color1 = f; \
+	menu.color2 = g; \
+	menu.menuNameString = h; \
+	menu.textColor = i; \
+	menu.titleX = j; \
+	menu.titleY = k; \
+	menu.highlightedItem = l; \
+	menu.numberOfItems = m; \
+	menu.scrollUpButtonX = n; \
+	menu.scrollUpButtonY = o; \
+	menu.scrollDownButtonX = p; \
+	menu.scrollDownButtonY = q
+
+#define GUI_V1_MENU_ITEM(item, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) \
+	item.enabled = a; \
+	item.itemString = d; \
+	item.x = e; \
+	item.y = g; \
+	item.width = h; \
+	item.height = i; \
+	item.textColor = j; \
+	item.highlightColor = k; \
+	item.titleX = l; \
+	item.bkgdColor = n; \
+	item.color1 = o; \
+	item.color2 = p; \
+	item.saveSlot = q; \
+	item.labelString = r; \
+	item.labelX = s; \
+	item.labelY = t; \
+	item.unk1F = v
+
+class KyraEngine_v1;
+
+class GUI_v1 : public GUI {
+	friend class KyraEngine_v1;
+public:
+	GUI_v1(KyraEngine_v1 *vm);
+	~GUI_v1();
+
+	void processButton(Button *button);
+	int processButtonList(Button *buttonList, uint16 inputFlags);
+
+	int buttonMenuCallback(Button *caller);
+private:
+	void initStaticResource();
+
+	Button _menuButtonData[6];
+	Button _scrollUpButton;
+	Button _scrollDownButton;
+	Button *getButtonListData() { return _menuButtonData; }
+	Button *getScrollUpButton() { return &_scrollUpButton; }
+	Button *getScrollDownButton() { return &_scrollDownButton; }
+
+	Menu *_menu;
+
+	void setGUILabels();
+
+	void setupSavegames(Menu &menu, int num);
+	int getNextSavegameSlot();
+
+	int resumeGame(Button *button);
+	int loadGameMenu(Button *button);
+	int saveGameMenu(Button *button);
+	int gameControlsMenu(Button *button);
+	int quitPlaying(Button *button);
+	int quitConfirmYes(Button *button);
+	int quitConfirmNo(Button *button);
+	int loadGame(Button *button);
+	int saveGame(Button *button);
+	int savegameConfirm(Button *button);
+	int cancelSubMenu(Button *button);
+	int scrollUp(Button *button);
+	int scrollDown(Button *button);
+	int controlsChangeMusic(Button *button);
+	int controlsChangeSounds(Button *button);
+	int controlsChangeWalk(Button *button);
+	int controlsChangeText(Button *button);
+	int controlsChangeVoice(Button *button);
+	int controlsApply(Button *button);
+
+	bool quitConfirm(const char *str);
+	void getInput();
+	void updateSavegameString();
+	void redrawTextfield();
+	void fadePalette();
+	void restorePalette();
+	void setupControls(Menu &menu);
+
+	uint8 defaultColor1() const { return 12; }
+	uint8 defaultColor2() const { return 248; }
+
+	const char *getMenuTitle(const Menu &menu) { return menu.menuNameString; }
+	const char *getMenuItemTitle(const MenuItem &menuItem) { return menuItem.itemString; }
+	const char *getMenuItemLabel(const MenuItem &menuItem) { return menuItem.labelString; }
+
+	KyraEngine_v1 *_vm;
+
+	bool _menuRestoreScreen;
+	uint8 _toplevelMenu;
+	int _savegameOffset;
+	char _savegameName[31];
+	const char *_specialSavegameString;
+	Common::KeyState _keyPressed;
+	int8 _mouseWheel;
+
+	Button::Callback _scrollUpFunctor;
+	Button::Callback _scrollDownFunctor;
+	Button::Callback getScrollUpButtonHandler() const { return _scrollUpFunctor; }
+	Button::Callback getScrollDownButtonHandler() const { return _scrollDownFunctor; }
+
+	const char *_voiceTextString;
+	const char *_textSpeedString;
+	const char *_onString;
+	const char *_offString;
+	const char *_onCDString;
+};
+
+} // end of namespace Kyra
+
+#endif
+


Property changes on: scummvm/trunk/engines/kyra/gui_v1.h
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + "Date Rev Author URL Id"
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/kyra/kyra_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v1.cpp	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/kyra_v1.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -88,14 +88,14 @@
 	_scriptClick = 0;
 	_characterList = 0;
 	_movFacingTable = 0;
+	_buttonData = 0;
+	_buttonDataListPtr = 0;
 	memset(_shapes, 0, sizeof(_shapes));
 	memset(_movieObjects, 0, sizeof(_movieObjects));
 	_finalA = _finalB = _finalC = 0;
 	_endSequenceBackUpRect = 0;
 	memset(_panPagesTable, 0, sizeof(_panPagesTable));
 	_npcScriptData = _scriptClickData = 0;
-	_scrollUpButton.process0PtrShape = _scrollUpButton.process1PtrShape = _scrollUpButton.process2PtrShape = 0;
-	_scrollDownButton.process0PtrShape = _scrollDownButton.process1PtrShape = _scrollDownButton.process2PtrShape = 0;
 	memset(_sceneAnimTable, 0, sizeof(_sceneAnimTable));
 	_currHeadShape = 0;
 
@@ -134,13 +134,18 @@
 
 	delete [] _movFacingTable;
 
-	delete [] _scrollUpButton.process0PtrShape;
-	delete [] _scrollUpButton.process1PtrShape;
-	delete [] _scrollUpButton.process2PtrShape;
-	delete [] _scrollDownButton.process0PtrShape;
-	delete [] _scrollDownButton.process1PtrShape;
-	delete [] _scrollDownButton.process2PtrShape;
+	delete [] _gui->_scrollUpButton.data0ShapePtr;
+	delete [] _gui->_scrollUpButton.data1ShapePtr;
+	delete [] _gui->_scrollUpButton.data2ShapePtr;
+	delete [] _gui->_scrollDownButton.data0ShapePtr;
+	delete [] _gui->_scrollDownButton.data1ShapePtr;
+	delete [] _gui->_scrollDownButton.data2ShapePtr;
 
+	delete [] _buttonData;
+	delete [] _buttonDataListPtr;
+
+	delete _gui;
+
 	delete [] _itemBkgBackUp[0];
 	delete [] _itemBkgBackUp[1];
 
@@ -178,6 +183,8 @@
 	assert(*_animator);
 	_text = new TextDisplayer(this, screen());
 	assert(_text);
+	_gui = new GUI_v1(this);
+	assert(_gui);
 
 	initStaticResource();
 
@@ -193,7 +200,6 @@
 	_sound->loadSoundFile(0);
 
 	setupButtonData();
-	setupMenu();
 
 	_paletteChanged = 1;
 	_currentCharacter = 0;
@@ -407,7 +413,7 @@
 			_menuDirectlyToLoad = true;
 			_screen->setMouseCursor(1, 1, _shapes[0]);
 			_screen->showMouse();
-			buttonMenuCallback(0);
+			_gui->buttonMenuCallback(0);
 			_menuDirectlyToLoad = false;
 		} else
 			saveGame(getSavegameFilename(0), "New game");
@@ -437,7 +443,7 @@
 			_screen->setMouseCursor(1, 1, _shapes[0]);
 			destroyMouseItem();
 			_screen->showMouse();
-			buttonMenuCallback(0);
+			_gui->buttonMenuCallback(0);
 			_deathHandler = 0xFF;
 		}
 
@@ -451,7 +457,7 @@
 
 		_screen->showMouse();
 
-		processButtonList(_buttonList);
+		_gui->processButtonList(_buttonList, 0);
 		updateMousePointer();
 		_timer->update();
 		updateTextFade();

Modified: scummvm/trunk/engines/kyra/kyra_v1.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v1.h	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/kyra_v1.h	2008-03-28 09:00:30 UTC (rev 31290)
@@ -29,6 +29,7 @@
 #include "kyra/kyra.h"
 #include "kyra/script.h"
 #include "kyra/screen_v1.h"
+#include "kyra/gui_v1.h"
 
 namespace Kyra {
 
@@ -104,85 +105,11 @@
 	int16 tableIndex;
 };
 
-struct Button {
-	Button *nextButton;
-	uint16 specialValue;
-	// uint8 unk[4];
-	uint8 process0;
-	uint8 process1;
-	uint8 process2;
-	// uint8 unk
-	uint16 flags;
-	typedef int (KyraEngine_v1::*ButtonCallback)(Button*);
-	// using 6 pointers instead of 3 as in the orignal here (safer for use with classes)
-	uint8 *process0PtrShape;
-	uint8 *process1PtrShape;
-	uint8 *process2PtrShape;
-	ButtonCallback process0PtrCallback;
-	ButtonCallback process1PtrCallback;
-	ButtonCallback process2PtrCallback;
-	uint16 dimTableIndex;
-	uint16 x;
-	uint16 y;
-	uint16 width;
-	uint16 height;
-	// uint8 unk[8];
-	uint32 flags2;
-	ButtonCallback buttonCallback;
-	// uint8 unk[8];
-};
-
-struct MenuItem {
-	bool enabled;
-	uint16 field_1;
-	uint8 field_3;
-	const char *itemString;
-	int16 x;
-	int16 field_9;
-	uint16 y;
-	uint16 width;
-	uint16 height;
-	uint8 textColor;
-	uint8 highlightColor;
-	int16 field_12;
-	uint8 field_13;
-	uint8 bgcolor;
-	uint8 color1;
-	uint8 color2;
-	int (KyraEngine_v1::*callback)(Button*);
-	int16 saveSlot;
-	const char *labelString;
-	uint16 labelX;
-	uint8 labelY;
-	uint8 field_24;
-	uint32 field_25;
-};
-
-struct Menu {
-	int16 x;
-	int16 y;
-	uint16 width;
-	uint16 height;
-	uint8 bgcolor;
-	uint8 color1;
-	uint8 color2;
-	const char *menuName;
-	uint8 textColor;
-	int16 field_10;
-	uint16 field_12;
-	uint16 highlightedItem;
-	uint8 nrOfItems;
-	int16 scrollUpBtnX;
-	int16 scrollUpBtnY;
-	int16 scrollDownBtnX;
-	int16 scrollDownBtnY;
-	MenuItem item[6];
-};
-
 class KyraEngine_v1 : public KyraEngine {
 	friend class MusicPlayer;
 	friend class Debugger_v1;
 	friend class ScreenAnimator;
+	friend class GUI_v1;
 public:
 	KyraEngine_v1(OSystem *system, const GameFlags &flags);
 	~KyraEngine_v1();
@@ -456,60 +383,13 @@
 
 	int buttonInventoryCallback(Button *caller);
 	int buttonAmuletCallback(Button *caller);
-	int buttonMenuCallback(Button *caller);
-	int drawBoxCallback(Button *button);
-	int drawShadedBoxCallback(Button *button);
-	void calcCoords(Menu &menu);
-	void initMenu(Menu &menu);
-	void setGUILabels();
 
-	Button *initButton(Button *list, Button *newButton);
-	void processButtonList(Button *list);
-	void processButton(Button *button);
-	void processMenuButton(Button *button);
-	void processAllMenuButtons();
-
-	void setupSavegames(Menu &menu, int num);
-	int getNextSavegameSlot();
-
-	int gui_resumeGame(Button *button);
-	int gui_loadGameMenu(Button *button);
-	int gui_saveGameMenu(Button *button);
-	int gui_gameControlsMenu(Button *button);
-	int gui_quitPlaying(Button *button);
-	int gui_quitConfirmYes(Button *button);
-	int gui_quitConfirmNo(Button *button);
-	int gui_loadGame(Button *button);
-	int gui_saveGame(Button *button);
-	int gui_savegameConfirm(Button *button);
-	int gui_cancelSubMenu(Button *button);
-	int gui_scrollUp(Button *button);
-	int gui_scrollDown(Button *button);
-	int gui_controlsChangeMusic(Button *button);
-	int gui_controlsChangeSounds(Button *button);
-	int gui_controlsChangeWalk(Button *button);
-	int gui_controlsChangeText(Button *button);
-	int gui_controlsChangeVoice(Button *button);
-	int gui_controlsApply(Button *button);
-
-	bool gui_quitConfirm(const char *str);
-	void gui_getInput();
-	void gui_redrawText(Menu menu);
-	void gui_redrawHighlight(Menu menu);
-	void gui_processHighlights(Menu &menu);
-	void gui_updateSavegameString();
-	void gui_redrawTextfield();
-	void gui_fadePalette();
-	void gui_restorePalette();
-	void gui_setupControls(Menu &menu);
-
 	bool _skipIntroFlag;
 	bool _abortIntroFlag;
 	bool _menuDirectlyToLoad;
 	bool _abortWalkFlag;
 	bool _abortWalkFlag2;
 	bool _mousePressFlag;
-	int8 _mouseWheel;
 	uint8 *_itemBkgBackUp[2];
 	uint8 *_shapes[373];
 	int8 _itemInHand;
@@ -614,16 +494,7 @@
 	Character *_currentCharacter;
 
 	Button *_buttonList;
-	Button *_menuButtonList;
-	bool _displayMenu;
-	bool _menuRestoreScreen;
-	bool _displaySubMenu;
-	bool _cancelSubMenu;
-	uint8 _toplevelMenu;
-	int _savegameOffset;
-	char _savegameName[31];
-	const char *_specialSavegameString;
-	Common::KeyState _keyPressed;
+	GUI_v1 *_gui;
 
 	struct KyragemState {
 		uint16 nextOperation;
@@ -682,12 +553,6 @@
 	const char * const*_homeString;
 	const char * const*_newGameString;
 
-	const char *_voiceTextString;
-	const char *_textSpeedString;
-	const char *_onString;
-	const char *_offString;
-	const char *_onCDString;
-
 	int _itemList_Size;
 	int _takenList_Size;
 	int _placedList_Size;
@@ -777,15 +642,7 @@
 	void setupButtonData();
 	Button *_buttonData;
 	Button **_buttonDataListPtr;
-	static Button _menuButtonData[];
-	static Button _scrollUpButton;
-	static Button _scrollDownButton;
 
-	bool _haveScrollButtons;
-
-	void setupMenu();
-	Menu *_menu;
-
 	static const uint8 _magicMouseItemStartFrame[];
 	static const uint8 _magicMouseItemEndFrame[];
 	static const uint8 _magicMouseItemStartFrame2[];

Modified: scummvm/trunk/engines/kyra/module.mk
===================================================================
--- scummvm/trunk/engines/kyra/module.mk	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/module.mk	2008-03-28 09:00:30 UTC (rev 31290)
@@ -5,6 +5,7 @@
 	animator_v2.o \
 	debugger.o \
 	detection.o \
+	gui.o \
 	gui_v1.o \
 	gui_v2.o \
 	items_v1.o \

Modified: scummvm/trunk/engines/kyra/script_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_v1.cpp	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/script_v1.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -1378,7 +1378,7 @@
 		delay(10);
 	}
 	// }
-	processButtonList(_buttonList);
+	_gui->processButtonList(_buttonList, 0);
 	_skipFlag = false;
 	Common::Point mouse = getMousePos();
 	script->regs[1] = mouse.x;

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2008-03-28 08:30:42 UTC (rev 31289)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2008-03-28 09:00:30 UTC (rev 31290)
@@ -32,6 +32,7 @@
 #include "kyra/kyra_v3.h"
 #include "kyra/screen.h"
 #include "kyra/resource.h"
+#include "kyra/gui_v1.h"
 
 namespace Kyra {
 
@@ -881,12 +882,12 @@
 void KyraEngine_v1::loadButtonShapes() {
 	_screen->loadBitmap("BUTTONS2.CPS", 3, 3, 0);
 	_screen->_curPage = 2;
-	_scrollUpButton.process0PtrShape = _screen->encodeShape(0, 0, 24, 14, 1);
-	_scrollUpButton.process1PtrShape = _screen->encodeShape(24, 0, 24, 14, 1);
-	_scrollUpButton.process2PtrShape = _screen->encodeShape(48, 0, 24, 14, 1);
-	_scrollDownButton.process0PtrShape = _screen->encodeShape(0, 15, 24, 14, 1);
-	_scrollDownButton.process1PtrShape = _screen->encodeShape(24, 15, 24, 14, 1);
-	_scrollDownButton.process2PtrShape = _screen->encodeShape(48, 15, 24, 14, 1);
+	_gui->_scrollUpButton.data0ShapePtr = _screen->encodeShape(0, 0, 24, 14, 1);
+	_gui->_scrollUpButton.data1ShapePtr = _screen->encodeShape(24, 0, 24, 14, 1);
+	_gui->_scrollUpButton.data2ShapePtr = _screen->encodeShape(48, 0, 24, 14, 1);
+	_gui->_scrollDownButton.data0ShapePtr = _screen->encodeShape(0, 15, 24, 14, 1);
+	_gui->_scrollDownButton.data1ShapePtr = _screen->encodeShape(24, 15, 24, 14, 1);
+	_gui->_scrollDownButton.data2ShapePtr = _screen->encodeShape(48, 15, 24, 14, 1);
 	_screen->_curPage = 0;
 }
 
@@ -1164,151 +1165,116 @@
 	160, 160, 160, 160, 160, 181, 181, 181, 181, 181
 };
 
-void KyraEngine_v1::setupButtonData() {
-	static Button buttonData[] = {
-		{ 0, 0x02, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x01, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x009, 0xA4, 0x36, 0x1E, /*XXX,*/ 0, &KyraEngine_v1::buttonMenuCallback/*, XXX*/ },
-		{ 0, 0x03, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x04, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x05, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x06, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0x9E, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x07, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x05D, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x08, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x071, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x09, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x085, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x0A, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x099, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x0B, /*XXX,*/0, 0, 0, /*XXX,*/ 0x0400, 0, 0, 0, 0, 0, 0, 0, 0x0AD, 0xB3, 0x13, 0x14, /*XXX,*/ 0, &KyraEngine_v1::buttonInventoryCallback/*, XXX*/ },
-		{ 0, 0x15, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0x9C, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine_v1::buttonAmuletCallback/*, XXX*/ },
-		{ 0, 0x16, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0E7, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine_v1::buttonAmuletCallback/*, XXX*/ },
-		{ 0, 0x17, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x0FD, 0xB5, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine_v1::buttonAmuletCallback/*, XXX*/ },
-		{ 0, 0x18, /*XXX,*/1, 1, 1, /*XXX,*/ 0x0487, 0, 0, 0, 0, 0, 0, 0, 0x113, 0xAA, 0x1A, 0x12, /*XXX,*/ 0, &KyraEngine_v1::buttonAmuletCallback/*, XXX*/ }
-	};
+void GUI_v1::initStaticResource() {
+	GUI_V1_BUTTON(_scrollUpButton, 0x12, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0f, 0);
+	GUI_V1_BUTTON(_scrollDownButton, 0x13, 1, 1, 1, 0x483, 0, 0, 0, 0x18, 0x0f, 0);
 
-	static Button *buttonDataListPtr[] = {
-		&buttonData[1],
-		&buttonData[2],
-		&buttonData[3],
-		&buttonData[4],
-		&buttonData[5],
-		&buttonData[6],
-		&buttonData[7],
-		&buttonData[8],
-		&buttonData[9],
-		&buttonData[10],
-		&buttonData[11],
-		&buttonData[12],
-		&buttonData[13],
-		&buttonData[14],
-		0
-	};
+	GUI_V1_BUTTON(_menuButtonData[0], 0x0c, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
+	GUI_V1_BUTTON(_menuButtonData[1], 0x0d, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
+	GUI_V1_BUTTON(_menuButtonData[2], 0x0e, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
+	GUI_V1_BUTTON(_menuButtonData[3], 0x0f, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
+	GUI_V1_BUTTON(_menuButtonData[4], 0x10, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
+	GUI_V1_BUTTON(_menuButtonData[5], 0x11, 1, 1, 1, 0x487, 0, 0, 0, 0, 0, 0);
 
-	_buttonData = buttonData;
-	_buttonDataListPtr = buttonDataListPtr;
-}
+	delete [] _menu;
+	_menu = new Menu[6];
+	assert(_menu);
 
-Button KyraEngine_v1::_scrollUpButton =  {0, 0x12, 1, 1, 1, 0x483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x18, 0x0f, 0, 0};
-Button KyraEngine_v1::_scrollDownButton = {0, 0x13, 1, 1, 1, 0x483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x18, 0x0f, 0, 0};
+	Button::Callback quitPlayingFunctor = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::quitPlaying);
+	Button::Callback loadGameMenuFunctor = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::loadGameMenu);
+	Button::Callback cancelSubMenuFunctor = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::cancelSubMenu);
 
-Button KyraEngine_v1::_menuButtonData[] = {
-	{ 0, 0x0c, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ },
-	{ 0, 0x0d, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ },
-	{ 0, 0x0e, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ },
-	{ 0, 0x0f, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ },
-	{ 0, 0x10, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ },
-	{ 0, 0x11, /*XXX,*/1, 1, 1, /*XXX,*/ 0x487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*XXX,*/ 0, 0 /*, XXX*/ }
-};
+	GUI_V1_MENU(_menu[0], -1, -1, 208, 136, 248, 249, 250, 0, 251, -1, 8, 0, 5, -1, -1, -1, -1);
+	GUI_V1_MENU_ITEM(_menu[0].item[0], 1, 0, 0, 0, -1, -1, 30, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[0].item[1], 1, 0, 0, 0, -1, -1, 47, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[0].item[2], 1, 0, 0, 0, -1, -1, 64, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[0].item[3], 1, 0, 0, 0, -1, -1, 81, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[0].item[4], 1, 0, 0, 0, 86, 0, 110, 92, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	_menu[0].item[0].callback = loadGameMenuFunctor;
+	_menu[0].item[1].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::saveGameMenu);
+	_menu[0].item[2].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::gameControlsMenu);
+	_menu[0].item[3].callback = quitPlayingFunctor;
+	_menu[0].item[4].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::resumeGame);
+	
+	GUI_V1_MENU(_menu[1], -1, -1, 288, 56, 248, 249, 250, 0, 254,-1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V1_MENU_ITEM(_menu[1].item[0], 1, 0, 0, 0, 24, 0, 30, 72, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[1].item[1], 1, 0, 0, 0, 192, 0, 30, 72, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	_menu[1].item[0].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::quitConfirmYes);
+	_menu[1].item[1].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::quitConfirmNo);
+	
+	GUI_V1_MENU(_menu[2], -1, -1, 288, 160, 248, 249, 250, 0, 251, -1, 8, 0, 6, 132, 22, 132, 124);
+	GUI_V1_MENU_ITEM(_menu[2].item[0], 1, 0, 0, 0, -1, 255, 39, 256, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[2].item[1], 1, 0, 0, 0, -1, 255, 56, 256, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[2].item[2], 1, 0, 0, 0, -1, 255, 73, 256, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[2].item[3], 1, 0, 0, 0, -1, 255, 90, 256, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[2].item[4], 1, 0, 0, 0, -1, 255, 107, 256, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[2].item[5], 1, 0, 0, 0, 184, 0, 134, 88, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	_menu[2].item[5].callback = cancelSubMenuFunctor;
+	
+	GUI_V1_MENU(_menu[3], -1, -1, 288, 67, 248, 249, 250, 0, 251, -1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V1_MENU_ITEM(_menu[3].item[0], 1, 0, 0, 0, 24, 0, 44, 72, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[3].item[1], 1, 0, 0, 0, 192, 0, 44, 72, 15, 252, 253, -1, 255, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	_menu[3].item[0].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::savegameConfirm);
+	_menu[3].item[1].callback = cancelSubMenuFunctor;
+	
+	GUI_V1_MENU(_menu[4], -1, -1, 208, 76, 248, 249, 250, 0, 251, -1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V1_MENU_ITEM(_menu[4].item[0], 1, 0, 0, 0, -1, -1, 30, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[4].item[1], 1, 0, 0, 0, -1, -1, 47, 148, 15, 252, 253, 24, 0, 248, 249, 250, -1, 0, 0, 0, 0, 0);
+	_menu[4].item[0].callback = loadGameMenuFunctor;
+	_menu[4].item[1].callback = quitPlayingFunctor;
 
-void KyraEngine_v1::setupMenu() {
-	static Menu menu[] = {
-		{ -1, -1, 208, 136, 248, 249, 250, 0, 251, -1, 8, 0, 5, -1, -1, -1, -1,
-			{
-				{1, 0, 0, 0, -1, -1, 30, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_loadGameMenu, -1, 0, 0, 0, 0, 0},
+	GUI_V1_MENU(_menu[5], -1, -1, 208, 153, 248, 249, 250, 0, 251, -1, 8, 0, 6, -1, -1, -1, -1);
+	GUI_V1_MENU_ITEM(_menu[5].item[0], 1, 0, 0, 0, 110, 0, 30, 64, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 34, 32, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[5].item[1], 1, 0, 0, 0, 110, 0, 47, 64, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 34, 49, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[5].item[2], 1, 0, 0, 0, 110, 0, 64, 64, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 34, 66, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[5].item[3], 1, 0, 0, 0, 110, 0, 81, 64, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 34, 83, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[5].item[4], 1, 0, 0, 0, 110, 0, 98, 64, 15, 252, 253, 5, 0, 248, 249, 250, -1, 0, 34, 100, 0, 0);
+	GUI_V1_MENU_ITEM(_menu[5].item[5], 1, 0, 0, 0, 64, 0, 127, 92, 15, 252, 253, -1, 255, 248, 249, 250, -1, -0, 0, 0, 0, 0);
+	_menu[5].item[0].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsChangeMusic);
+	_menu[5].item[1].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsChangeSounds);
+	_menu[5].item[2].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsChangeWalk);
+	_menu[5].item[4].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsChangeText);
+	_menu[5].item[5].callback = BUTTON_FUNCTOR(GUI_v1, this, &GUI_v1::controlsApply);
+}
 
-				{1, 0, 0, 0, -1, -1, 47, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_saveGameMenu, -1, 0, 0, 0, 0, 0},
+void KyraEngine_v1::setupButtonData() {
+	delete [] _buttonData;
+	delete [] _buttonDataListPtr;
 
-				{1, 0, 0, 0, -1, -1, 64, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_gameControlsMenu, -1, 0, 0, 0, 0, 0},
+	_buttonData = new Button[15];
+	assert(_buttonData);
+	_buttonDataListPtr = new Button*[15];
+	assert(_buttonDataListPtr);
 
-				{1, 0, 0, 0, -1, -1, 81, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_quitPlaying, -1, 0, 0, 0, 0, 0},
+	GUI_V1_BUTTON(_buttonData[1], 0x01, 1, 1, 1, 0x0487, 0, 0x009, 0xA4, 0x36, 0x1E, 0);
+	_buttonData[1].buttonCallback = BUTTON_FUNCTOR(GUI_v1, _gui, &GUI_v1::buttonMenuCallback);
 
-				{1, 0, 0, 0, 86, 0, 110, 92, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_resumeGame, -1, 0, 0, 0, 0, 0}
-			}
-		},
-		{ -1, -1, 288, 56, 248, 249, 250, 0, 254,-1, 8, 0, 2, -1, -1, -1, -1,
-			{
-				{1, 0, 0, 0, 24, 0, 30, 72, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_quitConfirmYes, -1, 0, 0, 0, 0, 0},
+	Button::Callback inventoryFunctor = BUTTON_FUNCTOR(KyraEngine_v1, this, &KyraEngine_v1::buttonInventoryCallback);
+	for (int i = 2; i <= 10; ++i)
+		_buttonData[i].buttonCallback = inventoryFunctor;
+	_buttonData[0].buttonCallback = inventoryFunctor;
+	GUI_V1_BUTTON(_buttonData[0], 0x02, 0, 0, 0, 0x0400, 0, 0x05D, 0x9E, 0x13, 0x13, 0);
+	GUI_V1_BUTTON(_buttonData[2], 0x03, 0, 0, 0, 0x0400, 0, 0x071, 0x9E, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[3], 0x04, 0, 0, 0, 0x0400, 0, 0x085, 0x9E, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[4], 0x05, 0, 0, 0, 0x0400, 0, 0x099, 0x9E, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[5], 0x06, 0, 0, 0, 0x0400, 0, 0x0AD, 0x9E, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[6], 0x07, 0, 0, 0, 0x0400, 0, 0x05D, 0xB3, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[7], 0x08, 0, 0, 0, 0x0400, 0, 0x071, 0xB3, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[8], 0x09, 0, 0, 0, 0x0400, 0, 0x085, 0xB3, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[9], 0x0A, 0, 0, 0, 0x0400, 0, 0x099, 0xB3, 0x13, 0x14, 0);
+	GUI_V1_BUTTON(_buttonData[10], 0x0B, 0, 0, 0, 0x0400, 0, 0x0AD, 0xB3, 0x13, 0x14, 0);
 
-				{1, 0, 0, 0, 192, 0, 30, 72, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_quitConfirmNo, -1, 0, 0, 0, 0, 0}
-			}
-		},
-		{ -1, -1, 288, 160, 248, 249, 250, 0, 251, -1, 8, 0, 6, 132, 22, 132, 124,
-			{
-				{1, 0, 0, 0, -1, 255, 39, 256, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 0, 0, 0, 0},
+	Button::Callback amuletFunctor = BUTTON_FUNCTOR(KyraEngine_v1, this, &KyraEngine_v1::buttonAmuletCallback);
+	GUI_V1_BUTTON(_buttonData[11], 0x15, 1, 1, 1, 0x0487, 0, 0x0FD, 0x9C, 0x1A, 0x12, 0);
+	GUI_V1_BUTTON(_buttonData[12], 0x16, 1, 1, 1, 0x0487, 0, 0x0E7, 0xAA, 0x1A, 0x12, 0);
+	GUI_V1_BUTTON(_buttonData[13], 0x17, 1, 1, 1, 0x0487, 0, 0x0FD, 0xB5, 0x1A, 0x12, 0);
+	GUI_V1_BUTTON(_buttonData[14], 0x18, 1, 1, 1, 0x0487, 0, 0x113, 0xAA, 0x1A, 0x12, 0);
+	for (int i = 11; i <= 14; ++i)
+		_buttonData[i].buttonCallback = amuletFunctor;
 
-				{1, 0, 0, 0, -1, 255, 56, 256, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, -1, 255, 73, 256, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, -1, 255, 90, 256, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, -1, 255, 107, 256, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, 184, 0, 134, 88, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_cancelSubMenu, -1, 0, 0, 0, 0, 0},
-			}
-		},
-		{ -1, -1, 288, 67, 248, 249, 250, 0, 251, -1, 8, 0, 3, -1, -1, -1, -1,
-			{
-				{1, 0, 0, 0, 24, 0, 44, 72, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_savegameConfirm, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, 192, 0, 44, 72, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_cancelSubMenu, -1, 0, 0, 0, 0, 0}
-			}
-		},
-		{ -1, -1, 208, 76, 248, 249, 250, 0, 251, -1, 8, 0, 2, -1, -1, -1, -1,
-			{
-				{1, 0, 0, 0, -1, -1, 30, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_loadGameMenu, -1, 0, 0, 0, 0, 0},
-
-				{1, 0, 0, 0, -1, -1, 47, 148, 15, 252, 253, 24, 0,
-				248, 249, 250, &KyraEngine_v1::gui_quitPlaying, -1, 0, 0, 0, 0, 0}
-			}
-		},
-		{ -1, -1, 208, 153, 248, 249, 250, 0, 251, -1, 8, 0, 6, -1, -1, -1, -1,
-			{
-				{1, 0, 0, 0, 110, 0, 30, 64, 15, 252, 253, 5, 0,
-				248, 249, 250, &KyraEngine_v1::gui_controlsChangeMusic, -1, 0, 34, 32, 0, 0},
-
-				{1, 0, 0, 0, 110, 0, 47, 64, 15, 252, 253, 5, 0,
-				248, 249, 250, &KyraEngine_v1::gui_controlsChangeSounds, -1, 0, 34, 49, 0, 0},
-
-				{1, 0, 0, 0, 110, 0, 64, 64, 15, 252, 253, 5, 0,
-				248, 249, 250, &KyraEngine_v1::gui_controlsChangeWalk, -1, 0, 34, 66, 0, 0},
-
-				{1, 0, 0, 0, 110, 0, 81, 64, 15, 252, 253, 5, 0,
-				248, 249, 250, 0, -1, 0, 34, 83, 0, 0 },
-
-				{1, 0, 0, 0, 110, 0, 98, 64, 15, 252, 253, 5, 0,
-				248, 249, 250, &KyraEngine_v1::gui_controlsChangeText, -1, 0, 34, 100, 0, 0 },
-
-				{1, 0, 0, 0, 64, 0, 127, 92, 15, 252, 253, -1, 255,
-				248, 249, 250, &KyraEngine_v1::gui_controlsApply, -1, -0, 0, 0, 0, 0}
-			}
-		}
-	};
-
-	_menu = menu;
+	for (int i = 1; i < 15; ++i)
+		_buttonDataListPtr[i-1] = &_buttonData[i];
+	_buttonDataListPtr[14] = 0;
 }
 
 const uint8 KyraEngine_v1::_magicMouseItemStartFrame[] = {


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