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

athrxx at users.sourceforge.net athrxx at users.sourceforge.net
Mon Jun 15 22:52:09 CEST 2009


Revision: 41557
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41557&view=rev
Author:   athrxx
Date:     2009-06-15 20:52:09 +0000 (Mon, 15 Jun 2009)

Log Message:
-----------
LOL: - started on the ingame menu code (death menu, load menu and main menu)
- fixed regression in kyra gui code (broken menu highlighting)
- fixed minor bug in animation code

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/gui.h
    scummvm/trunk/engines/kyra/gui_hof.cpp
    scummvm/trunk/engines/kyra/gui_lok.cpp
    scummvm/trunk/engines/kyra/gui_lok.h
    scummvm/trunk/engines/kyra/gui_lol.cpp
    scummvm/trunk/engines/kyra/gui_lol.h
    scummvm/trunk/engines/kyra/gui_mr.cpp
    scummvm/trunk/engines/kyra/gui_v2.cpp
    scummvm/trunk/engines/kyra/gui_v2.h
    scummvm/trunk/engines/kyra/lol.cpp
    scummvm/trunk/engines/kyra/lol.h
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h
    scummvm/trunk/engines/kyra/screen_lol.cpp
    scummvm/trunk/engines/kyra/script_tim.cpp
    scummvm/trunk/engines/kyra/sequences_lol.cpp
    scummvm/trunk/engines/kyra/staticres.cpp

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -83,17 +83,21 @@
 	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);
+	_screen->drawShadedBox(menu.x, menu.y, menu_x2, menu_y2, menu.color1, menu.color2, _vm->gameFlags().gameID == GI_LOL ? Screen::kShadeTypeLol : Screen::kShadeTypeKyra);
 
 	if (menu.titleX != -1)
 		textX = menu.titleX;
 	else
-		textX = _text->getCenterStringX(getMenuTitle(menu), menu.x, menu_x2);
+		textX = getMenuCenterStringX(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);
+	if (_vm->gameFlags().gameID == GI_LOL) {
+		printMenuText(getMenuTitle(menu), textX, textY, menu.textColor, 0, 9);
+	} else {
+		printMenuText(getMenuTitle(menu), textX - 1, textY + 1, defaultColor1(), defaultColor2(), 0);
+		printMenuText(getMenuTitle(menu), textX, textY, menu.textColor, 0, 0);
+	}
 
 	int x1, y1, x2, y2;
 	for (int i = 0; i < menu.numberOfItems; ++i) {
@@ -114,35 +118,47 @@
 			menuButtonData->width  = menu.item[i].width - 1;
 			menuButtonData->height = menu.item[i].height - 1;
 			menuButtonData->buttonCallback = menu.item[i].callback;
-			menuButtonData->keyCode = menu.item[i].unk1F;
+			menuButtonData->keyCode = menu.item[i].keyCode;
 			menuButtonData->keyCode2 = 0;
+			menuButtonData->arg = menu.item[i].itemId;
 
 			_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);
+		_screen->drawShadedBox(x1, y1, x2, y2, menu.item[i].color1, menu.item[i].color2, _vm->gameFlags().gameID == GI_LOL ? Screen::kShadeTypeLol : Screen::kShadeTypeKyra);
 
 		if (getMenuItemTitle(menu.item[i])) {
 			if (menu.item[i].titleX != -1)
 				textX = x1 + menu.item[i].titleX + 3;
 			else
-				textX = _text->getCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
+				textX = getMenuCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
 
 			textY = y1 + 2;
-			_text->printText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);
-
-			if (i == menu.highlightedItem)
-				_text->printText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 0);
-			else
-				_text->printText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 0);
+			if (_vm->gameFlags().gameID == GI_LOL) {
+				textY++;
+				if (i == menu.highlightedItem)
+					printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 8);
+				else
+					printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 8);
+			} else {
+				printMenuText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);				
+				if (i == menu.highlightedItem)
+					printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 0);
+				else
+					printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 0);
+			}			
 		}
 	}
 
 	for (int i = 0; i < menu.numberOfItems; ++i) {
 		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 (_vm->gameFlags().gameID == GI_LOL) {
+				printMenuText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX, menu.y + menu.item[i].labelY, menu.item[i].textColor, 0, 8);
+			} else {
+				printMenuText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX - 1, menu.y + menu.item[i].labelY + 1, defaultColor1(), 0, 0);
+				printMenuText(getMenuItemLabel(menu.item[i]), menu.x + menu.item[i].labelX, menu.y + menu.item[i].labelY, menu.item[i].textColor, 0, 0);
+			}
 		}
 	}
 
@@ -172,8 +188,11 @@
 	_screen->updateScreen();
 }
 
-void GUI::processHighlights(Menu &menu, int mouseX, int mouseY) {
+void GUI::processHighlights(Menu &menu) {
 	int x1, y1, x2, y2;
+	Common::Point p = _vm->getMousePos();
+	int mouseX = p.x;
+	int mouseY = p.y;
 
 	for (int i = 0; i < menu.numberOfItems; ++i) {
 		if (!menu.item[i].enabled)
@@ -189,8 +208,12 @@
 			mouseY > y1 && mouseY < y2) {
 
 			if (menu.highlightedItem != i) {
-				if (menu.item[menu.highlightedItem].enabled)
-					redrawText(menu);
+				// LoL doesnt't have default highlighted items. 
+				// We use a highlightedItem value of 255 for this.
+				if (menu.highlightedItem != 255) {
+					if (menu.item[menu.highlightedItem].enabled)
+						redrawText(menu);
+				}
 
 				menu.highlightedItem = i;
 				redrawHighlight(menu);
@@ -212,11 +235,16 @@
 	if (menu.item[i].titleX >= 0)
 		textX = x1 + menu.item[i].titleX + 3;
 	else
-		textX = _text->getCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
+		textX = getMenuCenterStringX(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);
+	if (_vm->gameFlags().gameID == GI_LOL) {
+		textY++;
+		printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 8);
+	} else {
+		printMenuText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);
+		printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].textColor, 0, 0);
+	}
 }
 
 void GUI::redrawHighlight(const Menu &menu) {
@@ -231,11 +259,17 @@
 	if (menu.item[i].titleX != -1)
 		textX = x1 + menu.item[i].titleX + 3;
 	else
-		textX = _text->getCenterStringX(getMenuItemTitle(menu.item[i]), x1, x2);
+		textX = getMenuCenterStringX(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);
+
+	if (_vm->gameFlags().gameID == GI_LOL) {
+		textY++;
+		printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 8);
+	} else {
+		printMenuText(getMenuItemTitle(menu.item[i]), textX - 1, textY + 1, defaultColor1(), 0, 0);
+		printMenuText(getMenuItemTitle(menu.item[i]), textX, textY, menu.item[i].highlightColor, 0, 0);
+	}
 }
 
 void GUI::updateAllMenuButtons() {
@@ -296,7 +330,7 @@
 	return 0;
 }
 
-void GUI::updateSaveList() {
+void GUI::updateSaveList(bool excludeQuickSaves) {
 	Common::String pattern = _vm->_targetName + ".???";
 	Common::StringList saveFileList = _vm->_saveFileMan->listSavefiles(pattern);
 	_saveSlots.clear();
@@ -311,6 +345,8 @@
 		s1 -= '0';
 		s2 -= '0';
 		s3 -= '0';
+		if (excludeQuickSaves && s1 == 9 && s2 == 9)
+			continue;
 		_saveSlots.push_back(s1*100+s2*10+s3);
 	}
 
@@ -383,6 +419,14 @@
 	_vm->_system->delayMillis(3);
 }
 
+void GUI::printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2, Screen::FontId font) {
+	_text->printText(str, x, y, c0, c1, c2, font);
+}
+
+int GUI::getMenuCenterStringX(const char *str, int x1, int x2) {
+	return _text->getCenterStringX(str, x1, x2);
+}
+
 #pragma mark -
 
 MainMenu::MainMenu(KyraEngine_v1 *vm) : _vm(vm), _screen(0) {

Modified: scummvm/trunk/engines/kyra/gui.h
===================================================================
--- scummvm/trunk/engines/kyra/gui.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -114,7 +114,7 @@
 	uint16 labelId;
 	int16 labelX, labelY;
 
-	uint16 unk1F;
+	uint16 keyCode;
 };
 
 struct Menu {
@@ -161,7 +161,7 @@
 	virtual void initMenuLayout(Menu &menu);
 	void initMenu(Menu &menu);
 
-	void processHighlights(Menu &menu, int mouseX, int mouseY);
+	void processHighlights(Menu &menu);
 
 	// utilities for thumbnail creation
 	virtual void createScreenThumbnail(Graphics::Surface &dst) = 0;
@@ -176,6 +176,9 @@
 	bool _displaySubMenu;
 	bool _cancelSubMenu;
 
+	virtual void printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 c2, Screen::FontId font=Screen::FID_8_FNT);
+	virtual int getMenuCenterStringX(const char *str, int x1, int x2);
+
 	Button::Callback _redrawShadedButtonFunctor;
 	Button::Callback _redrawButtonFunctor;
 
@@ -201,7 +204,7 @@
 	void redrawHighlight(const Menu &menu);
 
 	Common::Array<int> _saveSlots;
-	void updateSaveList();
+	void updateSaveList(bool excludeQuickSaves = false);
 	int getNextSavegameSlot();
 
 	uint32 _lastScreenUpdate;

Modified: scummvm/trunk/engines/kyra/gui_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_hof.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_hof.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -763,7 +763,7 @@
 	}
 
 	while (_displayMenu) {
-		processHighlights(*_currentMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(*_currentMenu);
 		getInput();
 	}
 
@@ -908,7 +908,7 @@
 	updateAllMenuButtons();
 	bool speechEnabled = _vm->speechEnabled();
 	while (_isOptionsMenu) {
-		processHighlights(_audioOptions, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_audioOptions);
 		getInput();
 	}
 
@@ -956,7 +956,7 @@
 	}
 
 	while (_isOptionsMenu) {
-		processHighlights(_gameOptions, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_gameOptions);
 		getInput();
 	}
 
@@ -983,7 +983,7 @@
 	_isOptionsMenu = true;
 
 	while (_isOptionsMenu) {
-		processHighlights(_gameOptions, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_gameOptions);
 		getInput();
 	}
 
@@ -1175,7 +1175,7 @@
 
 	_screen->updateScreen();
 	while (_isLoadMenu) {
-		processHighlights(_loadMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_loadMenu);
 		getInput();
 	}
 

Modified: scummvm/trunk/engines/kyra/gui_lok.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lok.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_lok.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -479,7 +479,7 @@
 	}
 
 	while (_displayMenu && !_vm->shouldQuit()) {
-		processHighlights(_menu[_toplevelMenu], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[_toplevelMenu]);
 		getInput();
 	}
 
@@ -570,7 +570,7 @@
 	_cancelSubMenu = false;
 
 	while (_displaySubMenu && !_vm->shouldQuit()) {
-		processHighlights(_menu[2], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[2]);
 		getInput();
 	}
 
@@ -616,7 +616,7 @@
 	_vm->_gameToLoad = -1;
 
 	while (_displaySubMenu && !_vm->shouldQuit()) {
-		processHighlights(_menu[2], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[2]);
 		getInput();
 	}
 
@@ -703,7 +703,7 @@
 	while (_displaySubMenu && !_vm->shouldQuit()) {
 		checkTextfieldInput();
 		updateSavegameString();
-		processHighlights(_menu[3], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[3]);
 	}
 
 	if (_cancelSubMenu) {
@@ -773,7 +773,7 @@
 	_cancelSubMenu = true;
 
 	while (_displaySubMenu && !_vm->shouldQuit()) {
-		processHighlights(_menu[1], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[1]);
 		getInput();
 	}
 
@@ -833,7 +833,7 @@
 	_cancelSubMenu = false;
 
 	while (_displaySubMenu && !_vm->shouldQuit()) {
-		processHighlights(_menu[5], _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_menu[5]);
 		getInput();
 	}
 

Modified: scummvm/trunk/engines/kyra/gui_lok.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_lok.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_lok.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -89,7 +89,7 @@
 		item.labelString = r; \
 		item.labelX = s; \
 		item.labelY = t; \
-		item.unk1F = v; \
+		item.keyCode = v; \
 	} while (0)
 
 class KyraEngine_LoK;

Modified: scummvm/trunk/engines/kyra/gui_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_lol.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -28,7 +28,12 @@
 #include "kyra/lol.h"
 #include "kyra/screen_lol.h"
 #include "kyra/gui_lol.h"
+#include "kyra/resource.h"
 
+#include "common/savefile.h"
+
+#include "base/version.h"
+
 namespace Kyra {
 
 void LoLEngine::gui_drawPlayField() {
@@ -1536,10 +1541,48 @@
 }
 
 int LoLEngine::clickedOptions(Button *button) {
+	removeInputTop();
 	gui_toggleButtonDisplayMode(76, 1);
+		
+	_updateFlags |= 4;
+	
+	Button b;
+	b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe;
+	b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01;
 
+	if (_weaponsDisabled)
+		clickedExitCharInventory(&b);
+
+	initTextFading(0, 1);
+	updatePortraits();
+	setLampMode(true);
+	setMouseCursorToIcon(0);		
+	disableSysTimer(2);
+
 	gui_toggleButtonDisplayMode(76, 0);
 
+	_gui->runMenu(_gui->_mainMenu);
+
+	_updateFlags &= 0xfffb;
+	setMouseCursorToItemInHand();
+	resetLampStatus();
+	gui_enableDefaultPlayfieldButtons();
+	enableSysTimer(2);
+	updateDrawPage2();
+
+	char filename[13];
+	snprintf(filename, sizeof(filename), "LEVEL%02d.%s", _currentLevel, _languageExt[_lang]);
+	if (_levelLangFile)
+		delete[] _levelLangFile;
+	_levelLangFile = _res->fileData(filename, 0);
+	snprintf(filename, sizeof(filename), "LANDS.%s", _languageExt[_lang]);
+	if (_landsFile)
+		delete[] _landsFile;
+	_landsFile = _res->fileData(filename, 0);
+
+//	if (!_speechFlag)
+//		enableText()	
+
 	return 1;
 }
 
@@ -1826,6 +1869,9 @@
 GUI_LoL::GUI_LoL(LoLEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) {
 	_scrollUpFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::scrollUp);
 	_scrollDownFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::scrollDown);
+	_redrawButtonFunctor = BUTTON_FUNCTOR(GUI, this, &GUI::redrawButtonCallback);
+	_redrawShadedButtonFunctor = BUTTON_FUNCTOR(GUI, this, &GUI::redrawShadedButtonCallback);
+
 	_specialProcessButton = _backUpButtonList = 0;
 	_flagsModifier = 0;
 	_mouseClick = 0;
@@ -1942,8 +1988,9 @@
 		}
 	}
 
-	int mouseX = _vm->_mouseX;
-	int mouseY = _vm->_mouseY;
+	Common::Point p = _vm->getMousePos();
+	int mouseX = p.x;
+	int mouseY = p.y;
 
 	uint16 flags = 0;
 
@@ -2164,6 +2211,275 @@
 	return returnValue;
 }
 
+int GUI_LoL::redrawButtonCallback(Button *button) {
+	if (!_displayMenu)
+		return 0;
+
+	_screen->drawBox(button->x + 1, button->y + 1, button->x + button->width - 1, button->y + button->height - 1, 225);
+	return 0;
+}
+
+int GUI_LoL::redrawShadedButtonCallback(Button *button) {
+	if (!_displayMenu)
+		return 0;
+
+	_screen->drawShadedBox(button->x, button->y, button->x + button->width, button->y + button->height, 223, 227, Screen::kShadeTypeLol);
+	return 0;
+}
+
+int GUI_LoL::runMenu(Menu &menu) {
+	_currentMenu = &menu;
+	_lastMenu = _currentMenu;
+	_newMenu = 0;
+	_displayMenu = true;
+	_menuResult = 1;
+	_savegameOffset = 0;
+	backupPage0();
+
+	// LoL doesnt't have default higlighted items. No item should be
+	// highlighted when entering a new menu.
+	// Instead, the respevtive struct entry is used to determine whether
+	// a menu has scroll buttons or not.
+	uint8 hasScrollButtons = 0;
+			
+	while (_displayMenu) {
+		_vm->_mouseX = _vm->_mouseY = 0;
+
+		if (_currentMenu == &_loadMenu || _currentMenu == &_saveMenu) {
+			updateSaveList(true);
+			Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
+			setupSavegameNames(*_currentMenu, 4);
+		}
+
+		hasScrollButtons = _currentMenu->highlightedItem;
+		_currentMenu->highlightedItem = 255;
+
+		if (hasScrollButtons) {
+			if (_savegameOffset == 0) {
+				_scrollUpButton.data0ShapePtr = _scrollUpButton.data1ShapePtr = _scrollUpButton.data2ShapePtr = 0;
+			} else {
+				_scrollUpButton.data0ShapePtr = _vm->_gameShapes[17];
+				_scrollUpButton.data1ShapePtr = _scrollUpButton.data2ShapePtr = _vm->_gameShapes[19];
+			}
+			if ((uint)_savegameOffset == _saveSlots.size() - 4) {
+				_scrollDownButton.data0ShapePtr = _scrollDownButton.data1ShapePtr = _scrollDownButton.data2ShapePtr = 0;
+			} else {
+				_scrollDownButton.data0ShapePtr = _vm->_gameShapes[18];
+				_scrollDownButton.data1ShapePtr = _scrollDownButton.data2ShapePtr = _vm->_gameShapes[20];
+			}
+		}
+
+		for (uint i = 0; i < _currentMenu->numberOfItems; ++i) {
+			_menuButtons[i].data0Val1 = _menuButtons[i].data1Val1 = _menuButtons[i].data2Val1 = 4;
+			_menuButtons[i].data0Callback = _redrawShadedButtonFunctor;
+			_menuButtons[i].data1Callback = _menuButtons[i].data2Callback = _redrawButtonFunctor;
+			_menuButtons[i].flags = 0x4487;
+			_menuButtons[i].flags2 = 0;
+		}
+
+		initMenu(*_currentMenu);
+
+		if (_currentMenu == &_mainMenu) {
+			Screen::FontId f = _screen->setFont(Screen::FID_6_FNT);
+			_screen->fprintString("SVN %s", menu.x + 8, menu.y + menu.height - 12, 204, 0, 8, gScummVMVersion);
+			_screen->setFont(f);
+			_screen->updateScreen();
+		}
+
+		while (!_newMenu && _displayMenu) {
+			processHighlights(*_currentMenu);			
+			if (getInput()) {
+				if (!_newMenu)
+					_newMenu = _currentMenu;
+				else
+					_lastMenu = _currentMenu;
+			}
+
+			if (!_menuResult)
+				_displayMenu = false;
+		}
+
+		if (_newMenu != _currentMenu || !_displayMenu)
+			restorePage0();
+
+		_currentMenu->highlightedItem = hasScrollButtons;
+
+		if (_newMenu)
+			_currentMenu = _newMenu;
+
+		_newMenu = 0;
+	}
+
+	return _menuResult;
+}
+
+void GUI_LoL::backupPage0() {
+	_screen->copyPage(0, 7);
+}
+
+void GUI_LoL::restorePage0() {
+	_screen->copyPage(7, 0);
+	_screen->updateScreen();
+}
+
+void GUI_LoL::setupSavegameNames(Menu &menu, int num) {
+	char *s = (char *)_vm->_tempBuffer5120;
+
+	for (int i = 0; i < num; ++i) {
+		menu.item[i].saveSlot = -1;
+		menu.item[i].enabled = false;
+	}
+
+	int startSlot = 0;
+	if (&menu == &_saveMenu && _savegameOffset == 0)
+		startSlot = 1;
+
+	KyraEngine_v1::SaveHeader header;
+	Common::InSaveFile *in;
+	for (int i = startSlot; i < num && uint(_savegameOffset + i) < _saveSlots.size(); ++i) {
+		if ((in = _vm->openSaveForReading(_vm->getSavegameFilename(_saveSlots[i + _savegameOffset]), header)) != 0) {
+			strncpy(s, header.description.c_str(), 80);
+			s[79] = 0;
+			menu.item[i].itemString = s;
+			s += (strlen(s) + 1);
+			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
+			menu.item[i].enabled = true;
+			delete in;
+		}
+	}
+
+	if (_savegameOffset == 0) {
+		/*if (&menu == &_saveMenu) {
+			char *dst = _vm->getLangString(menu.item[0].itemId);
+			const char *src = _vm->getLangString(_vm->gameFlags().isTalkie ? 10 : 18);
+			strcpy(dst, src);
+			menu.item[0].saveSlot = -2;
+			menu.item[0].enabled = true;
+		}*/
+	}
+}
+
+void GUI_LoL::printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags, Screen::FontId font) {
+	_screen->fprintString(str, x, y, c0, c1, flags);
+}
+
+int GUI_LoL::getMenuCenterStringX(const char *str, int x1, int x2) {
+	if (!str)
+		return 0;
+
+	int strWidth = _screen->getTextWidth(str);
+	int w = x2 - x1 + 1;
+	return x1 + (w - strWidth) / 2;
+}
+
+int GUI_LoL::getInput() {
+	if (!_displayMenu)
+		return 0;
+
+	int inputFlag = _vm->checkInput(_menuButtonList);
+	_vm->removeInputTop();
+
+	if (_vm->shouldQuit())
+		_displayMenu = false;
+
+	_vm->delay(10);
+	return inputFlag & 0x8000 ? 1 : 0;
+}
+
+int GUI_LoL::clickedMainMenu(Button *button) {
+	updateMenuButton(button);
+	switch (button->arg) {
+	case 0x4001:
+		_newMenu = &_loadMenu;
+		break;
+	case 0x4002:
+		//_newMenu = &_saveMenu;
+		break;		
+	case 0x4003:
+		//_newMenu = &_deleteMenu;
+		break;
+	case 0x4004:
+		//_newMenu = &_gameOptions;
+		break;
+	case 0x42D9:
+		//_newMenu = &_audioOptions;
+		break;
+	case 0x4006:
+		//_newMenu = &_choiceMenu;
+		break;
+	case 0x4005:
+		_displayMenu = false;
+		break;
+	}
+	return 1;
+}
+
+int GUI_LoL::clickedLoadMenu(Button *button) {
+	updateMenuButton(button);
+	
+	if (button->arg == 0x4011) {
+		if (_currentMenu != _lastMenu)
+			_newMenu = _lastMenu;
+		else
+			_menuResult = 0;		
+		return 1;
+	}
+
+	int16 s = (int16)button->arg;
+	_vm->_gameToLoad = _loadMenu.item[-s - 2].saveSlot;
+	_displayMenu = false;
+
+	return 1;
+}
+
+int GUI_LoL::clickedDeathMenu(Button *button) {
+	updateMenuButton(button);
+	if (button->arg == _deathMenu.item[0].itemId) {
+		_vm->quitGame();
+	} else if (button->arg == _deathMenu.item[1].itemId) {
+		_newMenu = &_loadMenu;
+	}
+	return 1;
+}
+
+int GUI_LoL::scrollUp(Button *button) {
+	updateButton(button);
+	if (_savegameOffset > 0) {
+		_savegameOffset--;
+		_newMenu = _currentMenu;
+	}
+	return 1;
+}
+
+int GUI_LoL::scrollDown(Button *button) {
+	updateButton(button);
+	if ((uint)_savegameOffset < _saveSlots.size() - 4) {
+		_savegameOffset++;
+		_newMenu = _currentMenu;
+	}
+	return 1;
+}
+
+const char *GUI_LoL::getMenuTitle(const Menu &menu) {
+	if (!menu.menuNameId)
+		return 0;
+	return _vm->getLangString(menu.menuNameId);
+}
+
+const char *GUI_LoL::getMenuItemTitle(const MenuItem &menuItem) {
+	if (menuItem.itemId & 0x8000 && menuItem.itemString)
+		return menuItem.itemString;
+	else if (menuItem.itemId & 0x8000)
+		return 0;
+	return _vm->getLangString(menuItem.itemId);
+}
+
+const char *GUI_LoL::getMenuItemLabel(const MenuItem &menuItem) {
+	if (!menuItem.labelId)
+		return 0;
+	return _vm->getLangString(menuItem.labelId);
+}
+
 } // end of namespace Kyra
 
 #endif // ENABLE_LOL

Modified: scummvm/trunk/engines/kyra/gui_lol.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_lol.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_lol.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -31,7 +31,49 @@
 #include "kyra/gui.h"
 
 namespace Kyra {
+#define GUI_LOL_MENU(menu, a, b, c, d, e, f, g, i) \
+	do { \
+		const ScreenDim *dim = _screen->getScreenDim(a); \
+		menu.x = (dim->sx << 3); \
+		menu.y = (dim->sy); \
+		menu.width = (dim->w << 3); \
+		menu.height = (dim->h); \
+		menu.bkgdColor = 225; \
+		menu.color1 = 223; \
+		menu.color2 = 227; \
+		menu.menuNameId = b; \
+		menu.highlightedItem = c; \
+		menu.numberOfItems = d; \
+		menu.titleX = (dim->sx << 3) + (dim->w << 2); \
+		menu.titleY = 6; \
+		menu.textColor = 254; \
+		menu.scrollUpButtonX = e; \
+		menu.scrollUpButtonY = f; \
+		menu.scrollDownButtonX = g; \
+		menu.scrollDownButtonY = i; \
+	} while (0)
 
+	#define GUI_LOL_MENU_ITEM(item, a, b, c, d, e, f, g) \
+	do { \
+		item.enabled = 1; \
+		item.itemId = a; \
+		item.x = b; \
+		item.y = c; \
+		item.width = d; \
+		item.height = e; \
+		item.textColor = 204; \
+		item.highlightColor = 254; \
+		item.titleX = -1; \
+		item.bkgdColor = 225; \
+		item.color1 = 223; \
+		item.color2 = 227; \
+		item.saveSlot = 0; \
+		item.labelId = f; \
+		item.labelX = 0; \
+		item.labelY = 0; \
+		item.keyCode = g; \
+	} while (0)
+
 class LoLEngine;
 class Screen_LoL;
 
@@ -40,14 +82,60 @@
 public:
 	GUI_LoL(LoLEngine *vm);
 
+	void initStaticData();
+
 	// button specific
 	void processButton(Button *button);
 	int processButtonList(Button *buttonList, uint16 inputFlags, int8 mouseWheel);
 
+	int redrawShadedButtonCallback(Button *button);
+	int redrawButtonCallback(Button *button);
+
+	int runMenu(Menu &menu);
+
 	// utilities for thumbnail creation
 	void createScreenThumbnail(Graphics::Surface &dst) {}
 
 private:
+	void backupPage0();
+	void restorePage0();
+
+	void setupSavegameNames(Menu &menu, int num);
+
+	void printMenuText(const char *str, int x, int y, uint8 c0, uint8 c1, uint8 flags, Screen::FontId font=Screen::FID_9_FNT);
+	int getMenuCenterStringX(const char *str, int x1, int x2);
+
+	int getInput();
+
+	int clickedMainMenu(Button *button);
+	int clickedLoadMenu(Button *button);
+	int clickedDeathMenu(Button *button);
+
+	int scrollUp(Button *button);
+	int scrollDown(Button *button);
+
+	Button *getButtonListData() { return _menuButtons; }
+	Button *getScrollUpButton() { return &_scrollUpButton; }
+	Button *getScrollDownButton() { return &_scrollDownButton; }
+
+	
+	Button::Callback getScrollUpButtonHandler() const { return _scrollUpFunctor; }
+	Button::Callback getScrollDownButtonHandler() const { return _scrollDownFunctor; }
+
+	uint8 defaultColor1() const { return 0xFE; }
+	uint8 defaultColor2() const { return 0x00; }
+
+	const char *getMenuTitle(const Menu &menu);
+	const char *getMenuItemTitle(const MenuItem &menuItem);
+	const char *getMenuItemLabel(const MenuItem &menuItem);
+
+	Button _menuButtons[7];
+	Button _scrollUpButton;
+	Button _scrollDownButton;
+	Menu _mainMenu, _gameOptions, _audioOptions, _choiceMenu, _loadMenu, _saveMenu, _savenameMenu, _deathMenu;
+	Menu *_currentMenu, *_lastMenu, *_newMenu;
+	int _menuResult;
+
 	LoLEngine *_vm;
 	Screen_LoL *_screen;
 
@@ -59,24 +147,10 @@
 	uint16 _flagsModifier;
 	uint8 _mouseClick;
 
-	int scrollUp(Button *button) { return 0; }
-	int scrollDown(Button *button) { return 0; }
+	int _savegameOffset;
 
-	Button *getButtonListData() { return 0; }
-	Button *getScrollUpButton() { return 0; }
-	Button *getScrollDownButton() { return 0; }
-
 	Button::Callback _scrollUpFunctor;
 	Button::Callback _scrollDownFunctor;
-	Button::Callback getScrollUpButtonHandler() const { return _scrollUpFunctor; }
-	Button::Callback getScrollDownButtonHandler() const { return _scrollDownFunctor; }
-
-	uint8 defaultColor1() const { return 0; }
-	uint8 defaultColor2() const { return 0; }
-
-	const char *getMenuTitle(const Menu &menu) { return 0; }
-	const char *getMenuItemTitle(const MenuItem &menuItem) { return 0; }
-	const char *getMenuItemLabel(const MenuItem &menuItem) { return 0; }
 };
 
 } // end of namespace Kyra

Modified: scummvm/trunk/engines/kyra/gui_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_mr.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -1269,7 +1269,7 @@
 	}
 
 	while (_displayMenu) {
-		processHighlights(*_currentMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(*_currentMenu);
 		getInput();
 	}
 
@@ -1312,7 +1312,7 @@
 
 	_screen->updateScreen();
 	while (_isLoadMenu) {
-		processHighlights(_loadMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_loadMenu);
 		getInput();
 	}
 
@@ -1362,7 +1362,7 @@
 	_isOptionsMenu = true;
 
 	while (_isOptionsMenu) {
-		processHighlights(_gameOptions, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_gameOptions);
 		getInput();
 	}
 
@@ -1525,7 +1525,7 @@
 	updateAllMenuButtons();
 	bool speechEnabled = _vm->speechEnabled();
 	while (_isOptionsMenu) {
-		processHighlights(_audioOptions, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_audioOptions);
 		getInput();
 	}
 

Modified: scummvm/trunk/engines/kyra/gui_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_v2.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -601,7 +601,7 @@
 	updateAllMenuButtons();
 
 	while (_isSaveMenu) {
-		processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_saveMenu);
 		getInput();
 	}
 
@@ -697,7 +697,7 @@
 		updateAllMenuButtons();
 
 		while (_isDeleteMenu) {
-			processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
+			processHighlights(_saveMenu);
 			getInput();
 		}
 
@@ -749,7 +749,7 @@
 	_cancelNameInput = _finishNameInput = false;
 	while (running && !_vm->shouldQuit()) {
 		checkTextfieldInput();
-		processHighlights(_savenameMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_savenameMenu);
 		if (_keyPressed.keycode == Common::KEYCODE_RETURN || _keyPressed.keycode == Common::KEYCODE_KP_ENTER || _finishNameInput) {
 			if (checkSavegameDescription(buffer, curPos)) {
 				buffer[curPos] = 0;
@@ -840,7 +840,7 @@
 	_choice = false;
 
 	while (_isChoiceMenu) {
-		processHighlights(_choiceMenu, _vm->_mouseX, _vm->_mouseY);
+		processHighlights(_choiceMenu);
 		getInput();
 	}
 

Modified: scummvm/trunk/engines/kyra/gui_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/gui_v2.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -96,7 +96,7 @@
 		item.labelId = n; \
 		item.labelX = o; \
 		item.labelY = p; \
-		item.unk1F = q; \
+		item.keyCode = q; \
 	} while (0)
 
 class KyraEngine_v2;

Modified: scummvm/trunk/engines/kyra/lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/lol.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/lol.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -436,6 +436,7 @@
 
 	_gui = new GUI_LoL(this);
 	assert(_gui);
+	_gui->initStaticData();
 
 	_txt = new TextDisplayer_LoL(this, _screen);
 
@@ -561,7 +562,7 @@
 
 	// Usually fonts etc. would be setup by the prologue code, if we skip
 	// the prologue code we need to setup them manually here.
-	if (_gameToLoad != -1) {
+	if (_gameToLoad != -1 && action != 3) {
 		preInit();
 		_screen->setFont(Screen::FID_9_FNT);
 	}
@@ -591,8 +592,6 @@
 		if (loadGameState(_gameToLoad) != Common::kNoError)
 			error("Couldn't load game slot %d on startup", _gameToLoad);
 		_gameToLoad = -1;
-	} else if (action == 3) {
-		// XXX
 	}
 
 	_screen->_fadeFlag = 3;
@@ -639,6 +638,15 @@
 		_itemIconShapes[i] = _screen->makeShapeCopy(shp, i);
 
 	_screen->setMouseCursor(0, 0, _itemIconShapes[0]);
+
+	if (!_gameShapes) {
+		_screen->loadBitmap("GAMESHP.SHP", 3, 3, 0);
+		shp = _screen->getCPagePtr(3);
+		_numGameShapes = READ_LE_UINT16(shp);
+		_gameShapes = new uint8*[_numGameShapes];
+		for (int i = 0; i < _numGameShapes; i++)
+			_gameShapes[i] = _screen->makeShapeCopy(shp, i);
+	}
 }
 
 void LoLEngine::setMouseCursorToIcon(int icon) {
@@ -754,13 +762,6 @@
 	for (int i = 0; i < _numItemShapes; i++)
 		_itemShapes[i] = _screen->makeShapeCopy(shp, i);
 
-	_screen->loadBitmap("GAMESHP.SHP", 3, 3, 0);
-	shp = _screen->getCPagePtr(3);
-	_numGameShapes = READ_LE_UINT16(shp);
-	_gameShapes = new uint8*[_numGameShapes];
-	for (int i = 0; i < _numGameShapes; i++)
-		_gameShapes[i] = _screen->makeShapeCopy(shp, i);
-
 	_screen->loadBitmap("THROWN.SHP", 3, 3, 0);
 	shp = _screen->getCPagePtr(3);
 	_numThrownShapes = READ_LE_UINT16(shp);
@@ -858,6 +859,12 @@
 	_flagsTable[73] |= 0x08;
 
 	while (!shouldQuit() && _runFlag) {
+		if (_gameToLoad != -1) {
+			if (loadGameState(_gameToLoad) != Common::kNoError)
+				error("Couldn't load game slot %d", _gameToLoad);
+			_gameToLoad = -1;
+		}
+
 		if (_nextScriptFunc) {
 			runLevelScript(_nextScriptFunc, 2);
 			_nextScriptFunc = 0;
@@ -3282,6 +3289,52 @@
 }
 
 void LoLEngine::checkForPartyDeath() {
+	Button b;
+	b.data0Val2 = b.data1Val2 = b.data2Val2 = 0xfe;
+	b.data0Val3 = b.data1Val3 = b.data2Val3 = 0x01;
+
+	for (int i = 0; i < 4; i++) {
+		if (!(_characters[i].flags & 1) || _characters[i].hitPointsCur <= 0)
+			continue;
+		return;
+	}
+	
+	if (_weaponsDisabled)
+		clickedExitCharInventory(&b);
+
+	gui_drawAllCharPortraitsWithStats();
+
+	if (_partyDamageFlags & 0x40) {
+		_screen->fadeToBlack(40);
+		for (int i = 0; i < 4; i++) {
+			if (_characters[i].flags & 1)
+				increaseCharacterHitpoints(i, 1, true);
+		}
+		gui_drawAllCharPortraitsWithStats();
+		_screen->fadeToPalette1(40);
+
+	} else {
+		_screen->fadeClearSceneWindow(10);
+		restoreAfterSpecialScene(0, 1, 1, 0);
+
+		snd_playTrack(325);
+		updatePortraits();
+		initTextFading(0, 1);
+		setMouseCursorToIcon(0);
+		_updateFlags |= 4;
+		setLampMode(true);
+		disableSysTimer(2);
+	
+		_gui->runMenu(_gui->_deathMenu);
+
+		setMouseCursorToItemInHand();
+		_updateFlags &= 0xfffb;
+		resetLampStatus();
+
+		gui_enableDefaultPlayfieldButtons();
+		enableSysTimer(2);
+		updateDrawPage2();
+	}
 }
 
 void LoLEngine::applyMonsterAttackSkill(MonsterInPlay *monster, int16 target, int16 damage) {

Modified: scummvm/trunk/engines/kyra/lol.h
===================================================================
--- scummvm/trunk/engines/kyra/lol.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/lol.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -587,7 +587,7 @@
 	int clickedAutomap(Button *button);
 	int clickedLamp(Button *button);
 	int clickedStatusIcon(Button *button);
-
+	
 	const ButtonDef *_buttonData;
 	int _buttonDataSize;
 	const int16 *_buttonList1;

Modified: scummvm/trunk/engines/kyra/screen.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/screen.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -887,17 +887,26 @@
 	drawClippedLine(x1, y2, x2, y2, color);
 }
 
-void Screen::drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2) {
+void Screen::drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2, ShadeType shadeType) {
 	assert(x1 >= 0 && y1 >= 0);
 	hideMouse();
 
 	fillRect(x1, y1, x2, y1 + 1, color1);
-	fillRect(x2 - 1, y1, x2, y2, color1);
+	if (shadeType == kShadeTypeLol)
+		fillRect(x1, y1, x1 + 1, y2, color1);
+	else
+		fillRect(x2 - 1, y1, x2, y2, color1);
 
-	drawClippedLine(x1, y1, x1, y2, color2);
-	drawClippedLine(x1 + 1, y1 + 1, x1 + 1, y2 - 1, color2);
-	drawClippedLine(x1, y2, x2, y2, color2);
-	drawClippedLine(x1, y2 - 1, x2 - 1, y2 - 1, color2);
+	if (shadeType == kShadeTypeLol) {
+		drawClippedLine(x2, y1, x2, y2, color2);
+		drawClippedLine(x2 - 1, y1 + 1, x2 - 1, y2 - 1, color2);
+		drawClippedLine(x1 + 1, y2 - 1, x2, y2 - 1, color2);
+	} else {
+		drawClippedLine(x1, y1, x1, y2, color2);
+		drawClippedLine(x1 + 1, y1 + 1, x1 + 1, y2 - 1, color2);
+		drawClippedLine(x1, y2 - 1, x2 - 1, y2 - 1, color2);
+	}
+	drawClippedLine(x1, y2, x2, y2, color2);	
 
 	showMouse();
 }

Modified: scummvm/trunk/engines/kyra/screen.h
===================================================================
--- scummvm/trunk/engines/kyra/screen.h	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/screen.h	2009-06-15 20:52:09 UTC (rev 41557)
@@ -153,9 +153,13 @@
 	uint8 *getPalette(int num);
 
 	// gui specific (processing on _curPage)
+	enum ShadeType {
+		kShadeTypeKyra,
+		kShadeTypeLol
+	};
 	void drawLine(bool vertical, int x, int y, int length, int color);
 	void drawClippedLine(int x1, int y1, int x2, int y2, int color);
-	void drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2);
+	void drawShadedBox(int x1, int y1, int x2, int y2, int color1, int color2, ShadeType shadeType = kShadeTypeKyra);
 	void drawBox(int x1, int y1, int x2, int y2, int color);
 
 	// font/text handling

Modified: scummvm/trunk/engines/kyra/screen_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen_lol.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/screen_lol.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -105,7 +105,7 @@
 	va_end(vaList);
 
 	if (flags & 1)
-		x -= getTextWidth(string) >> 1;
+		x -= (getTextWidth(string) >> 1);
 
 	if (flags & 2)
 		x -= getTextWidth(string);
@@ -956,7 +956,7 @@
 		t += d;
 
 		for (int ii = 0; ii < 768; ii++) {
-			int val = (((int8)*p3++ * t) >> 8) + (int8)*p2++;
+			int16 val = (((int8)*p3++ * t) >> 8) + (int8)*p2++;
 			*dst++ = (uint8)val;
 		}
 	}

Modified: scummvm/trunk/engines/kyra/script_tim.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_tim.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/script_tim.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -1133,7 +1133,9 @@
 			anim->wsa->displayFrame(i - 1, 0, anim->x, anim->y, 0, 0, 0);
 			_screen->updateScreen();
 		}
-		_vm->delayUntil(next);
+		int32 del  = (int32)(next - _system->getMillis());
+		if (del > 0)
+			_vm->delay(del, true);
 	}
 }
 
@@ -1166,7 +1168,8 @@
 	int x = _dialogueButtonPosX;
 
 	for (int i = 0; i < _dialogueNumButtons; i++) {
-		if (_vm->posWithinRect(_vm->_mouseX, _vm->_mouseY, x, _dialogueButtonPosY, x + 74, _dialogueButtonPosY + 9)) {
+		Common::Point p = _vm->getMousePos();
+		if (_vm->posWithinRect(p.x, p.y, x, _dialogueButtonPosY, x + 74, _dialogueButtonPosY + 9)) {
 			_dialogueHighlightedButton = i;
 			break;
 		}
@@ -1226,7 +1229,8 @@
 			x = _dialogueButtonPosX;
 
 			for (int i = 0; i < _dialogueNumButtons; i++) {
-				if (_vm->posWithinRect(_vm->_mouseX, _vm->_mouseY, x, _dialogueButtonPosY, x + 74, _dialogueButtonPosY + 9)) {
+				Common::Point p = _vm->getMousePos();
+				if (_vm->posWithinRect(p.x, p.y, x, _dialogueButtonPosY, x + 74, _dialogueButtonPosY + 9)) {
 					_dialogueHighlightedButton = i;
 					res = _dialogueHighlightedButton + 1;
 					break;

Modified: scummvm/trunk/engines/kyra/sequences_lol.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sequences_lol.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/sequences_lol.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -71,12 +71,14 @@
 
 		_eventList.clear();
 		int selection = mainMenu();
-		_screen->hideMouse();
+		
+		if (selection != 3) {
+			_screen->hideMouse();
+			// Unlike the original, we add a nice fade to black
+			memset(_screen->getPalette(0), 0, 768);
+			_screen->fadePalette(_screen->getPalette(0), 0x54);
+		}
 
-		// Unlike the original, we add a nice fade to black
-		memset(_screen->getPalette(0), 0, 768);
-		_screen->fadePalette(_screen->getPalette(0), 0x54);
-
 		switch (selection) {
 		case 0:		// New game
 			processSelection = 0;
@@ -90,7 +92,8 @@
 			break;
 
 		case 3:		// Load game
-			//processSelection = 3;
+			if (_gui->runMenu(_gui->_loadMenu))
+				processSelection = 3;
 			break;
 
 		case 4:		// Quit game
@@ -100,7 +103,7 @@
 		}
 	}
 
-	if (processSelection == 0 || processSelection == 3) {
+	if (processSelection == 0) {
 		_sound->loadSoundFile(0);
 		_sound->playTrack(6);
 		chooseCharacter();

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2009-06-15 19:46:00 UTC (rev 41556)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2009-06-15 20:52:09 UTC (rev 41557)
@@ -2011,7 +2011,43 @@
 #undef cb
 }
 
+void GUI_LoL::initStaticData() {
+	GUI_V2_BUTTON(_scrollUpButton, 20, 96, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0);
+	GUI_V2_BUTTON(_scrollDownButton, 21, 98, 0, 1, 1, 1, 0x4487, 0, 0, 0, 25, 16, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0);
 
+	for (uint i = 0; i < ARRAYSIZE(_menuButtons); ++i)
+		GUI_V2_BUTTON(_menuButtons[i], i, 0, 0, 0, 0, 0, 0x4487, 0, 0, 0, 0, 0, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0);
+	
+	GUI_LOL_MENU(_mainMenu, 9, 0x4000, 0, 7, -1, -1, -1, -1);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[0], 0x4001, 16, 23, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[1], 0x4002, 16, 40, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[2], 0x4003, 16, 57, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[3], 0x4004, 16, 74, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[4], 0x42D9, 16, 91, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[5], 0x4006, 16, 108, 176, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_mainMenu.item[6], 0x4005, 88, 127, 104, 15, 0, 110);
+	Button::Callback mainMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedMainMenu);
+	for (int i = 0; i < 7; ++i)
+		_mainMenu.item[i].callback = mainMenuFunctor;
+
+	GUI_LOL_MENU(_loadMenu, 10, 0x400e, 1, 5, 128, 20, 128, 118);
+	GUI_LOL_MENU_ITEM(_loadMenu.item[0], 0xfffe, 8, 39, 256, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_loadMenu.item[1], 0xfffd, 8, 56, 256, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_loadMenu.item[2], 0xfffc, 8, 73, 256, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_loadMenu.item[3], 0xfffb, 8, 90, 256, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_loadMenu.item[4], 0x4011, 168, 118, 96, 15, 0, 110);	
+	Button::Callback loadMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedLoadMenu);
+	for (int i = 0; i < 5; ++i)
+		_loadMenu.item[i].callback = loadMenuFunctor;
+
+	GUI_LOL_MENU(_deathMenu, 11, 0x4013, 0, 2, -1, -1, -1, -1);
+	GUI_LOL_MENU_ITEM(_deathMenu.item[0], 0x4006, 8, 30, 104, 15, 0, 0);
+	GUI_LOL_MENU_ITEM(_deathMenu.item[1], 0x4001, 176, 30, 104, 15, 0, 0);
+	Button::Callback deathMenuFunctor = BUTTON_FUNCTOR(GUI_LoL, this, &GUI_LoL::clickedDeathMenu);
+	for (int i = 0; i < 2; ++i)
+		_deathMenu.item[i].callback = deathMenuFunctor;
+}
+
 #endif // ENABLE_LOL
 
 const ScreenDim Screen_LoK::_screenDimTable[] = {


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