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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Mon May 5 18:05:56 CEST 2008


Revision: 31876
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31876&view=rev
Author:   lordhoto
Date:     2008-05-05 09:05:56 -0700 (Mon, 05 May 2008)

Log Message:
-----------
- Added support for Kyra3 GUI (audio and game options not working yet)
- Added support for loading directly from command line for Kyra3

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_hof.h
    scummvm/trunk/engines/kyra/gui_mr.cpp
    scummvm/trunk/engines/kyra/gui_mr.h
    scummvm/trunk/engines/kyra/gui_v2.cpp
    scummvm/trunk/engines/kyra/gui_v2.h
    scummvm/trunk/engines/kyra/kyra_hof.cpp
    scummvm/trunk/engines/kyra/kyra_hof.h
    scummvm/trunk/engines/kyra/kyra_mr.cpp
    scummvm/trunk/engines/kyra/kyra_mr.h
    scummvm/trunk/engines/kyra/kyra_v2.cpp
    scummvm/trunk/engines/kyra/kyra_v2.h
    scummvm/trunk/engines/kyra/scene_mr.cpp
    scummvm/trunk/engines/kyra/staticres.cpp
    scummvm/trunk/engines/kyra/timer_v1.cpp

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -314,6 +314,8 @@
 		s1 -= '0';
 		s2 -= '0';
 		s3 -= '0';
+		if (s1 == 9 && s2 == 9 && s3 == 9)
+			continue;
 		_saveSlots.push_back(s1*100+s2*10+s3);
 	}
 

Modified: scummvm/trunk/engines/kyra/gui.h
===================================================================
--- scummvm/trunk/engines/kyra/gui.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -142,8 +142,8 @@
 	virtual void processButton(Button *button) = 0;
 	virtual int processButtonList(Button *buttonList, uint16 inputFlags) = 0;
 
-	int redrawShadedButtonCallback(Button *button);
-	int redrawButtonCallback(Button *button);
+	virtual int redrawShadedButtonCallback(Button *button);
+	virtual int redrawButtonCallback(Button *button);
 
 	// menu specific
 	virtual void initMenuLayout(Menu &menu);

Modified: scummvm/trunk/engines/kyra/gui_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_hof.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_hof.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -81,13 +81,6 @@
 }
 
 GUI_HoF::GUI_HoF(KyraEngine_HoF *vm) : GUI_v2(vm), _vm(vm), _screen(_vm->_screen) {
-	initStaticData();
-	_currentMenu = 0;
-	_isDeathMenu = false;
-	_isSaveMenu = false;
-	_isLoadMenu = false;
-	_scrollUpFunctor = BUTTON_FUNCTOR(GUI_HoF, this, &GUI_HoF::scrollUpButton);
-	_scrollDownFunctor = BUTTON_FUNCTOR(GUI_HoF, this, &GUI_HoF::scrollDownButton);
 	_sliderHandlerFunctor = BUTTON_FUNCTOR(GUI_HoF, this, &GUI_HoF::sliderHandler);
 }
 
@@ -112,6 +105,10 @@
 	return _vm->getTableString(menuItem.labelId, _vm->_optionsBuffer, 1);
 }
 
+char *GUI_HoF::getTableString(int id) {
+	return _vm->getTableString(id, _vm->_optionsBuffer, 0);
+}
+
 #pragma mark -
 
 
@@ -669,21 +666,6 @@
 
 #pragma mark -
 
-void GUI_HoF::getInput() {
-	if (!_displayMenu)
-		return;
-
-	_vm->checkInput(_menuButtonList);
-	_vm->removeInputTop();
-	if (_vm->quit()) {
-		_displayMenu = false;
-		_isLoadMenu = false;
-		_isSaveMenu = false;
-		_isOptionsMenu = false;
-		_isDeleteMenu = false;
-	}
-}
-
 int GUI_HoF::optionsButton(Button *button) {
 	_restartGame = false;
 	_reloadTemporarySave = false;
@@ -797,19 +779,6 @@
 
 #pragma mark -
 
-void GUI_HoF::renewHighlight(Menu &menu) {
-	if (!_displayMenu)
-		return;
-
-	MenuItem &item = menu.item[menu.highlightedItem];
-	int x = item.x + menu.x; int y = item.y + menu.y;
-	int x2 = x + item.width - 1; int y2 = y + item.height - 1;
-	redrawText(menu);
-	_screen->fillRect(x+2, y+2, x2-2, y2-2, item.bkgdColor);
-	redrawHighlight(menu);
-	_screen->updateScreen();
-}
-
 void GUI_HoF::setupPalette() {
 	memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
 
@@ -833,14 +802,6 @@
 	_screen->setScreenPalette(_screen->getPalette(0));
 }
 
-void GUI_HoF::backUpPage1(uint8 *buffer) {
-	_screen->copyRegionToBuffer(1, 0, 0, 320, 200, buffer);
-}
-
-void GUI_HoF::restorePage1(const uint8 *buffer) {
-	_screen->copyBlockToPage(1, 0, 0, 320, 200, buffer);
-}
-
 void GUI_HoF::resetState(int item) {
 	_vm->_timer->resetNextRun();
 	_vm->setNextIdleAnimTimer();
@@ -856,83 +817,29 @@
 	_buttonListChanged = true;
 }
 
-void GUI_HoF::setupSavegameNames(Menu &menu, int num) {
-	for (int i = 0; i < num; ++i) {
-		strcpy(_vm->getTableString(menu.item[i].itemId, _vm->_optionsBuffer, 0), "");
-		menu.item[i].saveSlot = -1;
-		menu.item[i].enabled = false;
-	}
+void GUI_HoF::drawSliderBar(int slider, const uint8 *shape) {
+	const int menuX = _audioOptions.x;
+	const int menuY = _audioOptions.y;
+	int x = menuX + _sliderBarsPosition[slider*2+0] + 10;
+	int y = menuY + _sliderBarsPosition[slider*2+1];
 
-	int startSlot = 0;
-	if (_isSaveMenu && _savegameOffset == 0)
-		startSlot = 1;
-
-	KyraEngine::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(_vm->getTableString(menu.item[i].itemId, _vm->_optionsBuffer, 0), header.description.c_str(), 80);
-			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
-			menu.item[i].enabled = true;
-			delete in;
-		}
+	int position = 0;
+	if (_vm->gameFlags().isTalkie) {
+		position = _vm->getVolume(KyraEngine::kVolumeEntry(slider));
+	} else {
+		if (slider < 2)
+			position = _vm->getVolume(KyraEngine::kVolumeEntry(slider));
+		else if (slider == 2)
+			position = (_vm->_configWalkspeed == 3) ? 97 : 2;
+		else if (slider == 3)
+			position = _vm->_configTextspeed;
 	}
 
-	if (_savegameOffset == 0) {
-		if (_isSaveMenu) {
-			char *dst = _vm->getTableString(menu.item[0].itemId, _vm->_optionsBuffer, 0);
-			const char *src = _vm->getTableString(_vm->gameFlags().isTalkie ? 10 : 18, _vm->_optionsBuffer, 0);
-			strcpy(dst, src);
-			menu.item[0].saveSlot = -2;
-			menu.item[0].enabled = true;
-		} else {
-			char *dst = _vm->getTableString(menu.item[0].itemId, _vm->_optionsBuffer, 0);
-			const char *src = _vm->getTableString(_vm->gameFlags().isTalkie ? 34 : 42, _vm->_optionsBuffer, 0);
-			strcpy(dst, src);
-		}
-	}
+	position = MAX(2, position);
+	position = MIN(97, position);
+	_screen->drawShape(0, shape, x+position, y, 0, 0);
 }
 
-int GUI_HoF::scrollUpButton(Button *button) {
-	updateMenuButton(button);
-
-	if (_savegameOffset == (_isDeleteMenu ? 1 : 0))
-		return 0;
-
-	--_savegameOffset;
-	if (_isLoadMenu) {
-		setupSavegameNames(_loadMenu, 5);
-		// original calls something different here...
-		initMenu(_loadMenu);
-	} else if (_isSaveMenu || _isDeleteMenu) {
-		setupSavegameNames(_saveMenu, 5);
-		// original calls something different here...
-		initMenu(_saveMenu);
-	}
-
-	return 0;
-}
-
-int GUI_HoF::scrollDownButton(Button *button) {
-	updateMenuButton(button);
-	++_savegameOffset;
-
-	if (uint(_savegameOffset + 5) >= _saveSlots.size())
-		_savegameOffset = MAX<int>(_saveSlots.size() - 5, _isDeleteMenu ? 1 : 0);
-
-	if (_isLoadMenu) {
-		setupSavegameNames(_loadMenu, 5);
-		// original calls something different here...
-		initMenu(_loadMenu);
-	} else if (_isSaveMenu || _isDeleteMenu) {
-		setupSavegameNames(_saveMenu, 5);
-		// original calls something different here...
-		initMenu(_saveMenu);
-	}
-
-	return 0;
-}
-
 #pragma mark -
 
 int GUI_HoF::quitGame(Button *caller) {
@@ -953,9 +860,54 @@
 	return 0;
 }
 
-int GUI_HoF::resumeGame(Button *caller) {
+int GUI_HoF::audioOptions(Button *caller) {
 	updateMenuButton(caller);
-	_displayMenu = false;
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	initMenu(_audioOptions);
+	const int menuX = _audioOptions.x;
+	const int menuY = _audioOptions.y;
+	const int maxButton = 3;	// 2 if voc is disabled
+
+	for (int i = 0; i < maxButton; ++i) {
+		int x = menuX + _sliderBarsPosition[i*2+0];
+		int y = menuY + _sliderBarsPosition[i*2+1];
+		_screen->drawShape(0, _vm->_buttonShapes[16], x, y, 0, 0);
+		drawSliderBar(i, _vm->_buttonShapes[17]);
+		_sliderButtons[0][i].buttonCallback = _sliderHandlerFunctor;
+		_sliderButtons[0][i].x = x;
+		_sliderButtons[0][i].y = y;
+		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[0][i]);
+		_sliderButtons[2][i].buttonCallback = _sliderHandlerFunctor;
+		_sliderButtons[2][i].x = x + 10;
+		_sliderButtons[2][i].y = y;
+		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[2][i]);
+		_sliderButtons[1][i].buttonCallback = _sliderHandlerFunctor;
+		_sliderButtons[1][i].x = x + 120;
+		_sliderButtons[1][i].y = y;
+		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[1][i]);
+	}
+
+	_isOptionsMenu = true;
+	updateAllMenuButtons();
+	bool speechEnabled = _vm->speechEnabled();
+	while (_isOptionsMenu) {
+		processHighlights(_audioOptions, _vm->_mouseX, _vm->_mouseY);
+		getInput();
+	}
+
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	if (speechEnabled && !_vm->textEnabled() && (!_vm->speechEnabled() || _vm->getVolume(KyraEngine::kVolumeSpeech) == 2)) {
+		_vm->_configVoice = 0;
+		_vm->setVolume(KyraEngine::kVolumeSpeech, 75);
+		choiceDialog(0x1D, 0);
+	}
+
+	_vm->writeSettings();
+
+	initMenu(*_currentMenu);
+	updateAllMenuButtons();
 	return 0;
 }
 
@@ -1048,12 +1000,6 @@
 	return 0;
 }
 
-int GUI_HoF::quitOptionsMenu(Button *caller) {
-	updateMenuButton(caller);
-	_isOptionsMenu = false;
-	return 0;
-}
-
 int GUI_HoF::toggleWalkspeed(Button *caller) {
 	updateMenuButton(caller);
 	if (_vm->_configWalkspeed == 5)
@@ -1124,57 +1070,6 @@
 	}
 }
 
-int GUI_HoF::audioOptions(Button *caller) {
-	updateMenuButton(caller);
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	initMenu(_audioOptions);
-	const int menuX = _audioOptions.x;
-	const int menuY = _audioOptions.y;
-	const int maxButton = 3;	// 2 if voc is disabled
-
-	for (int i = 0; i < maxButton; ++i) {
-		int x = menuX + _sliderBarsPosition[i*2+0];
-		int y = menuY + _sliderBarsPosition[i*2+1];
-		_screen->drawShape(0, _vm->_buttonShapes[16], x, y, 0, 0);
-		drawSliderBar(i, _vm->_buttonShapes[17]);
-		_sliderButtons[0][i].buttonCallback = _sliderHandlerFunctor;
-		_sliderButtons[0][i].x = x;
-		_sliderButtons[0][i].y = y;
-		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[0][i]);
-		_sliderButtons[2][i].buttonCallback = _sliderHandlerFunctor;
-		_sliderButtons[2][i].x = x + 10;
-		_sliderButtons[2][i].y = y;
-		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[2][i]);
-		_sliderButtons[1][i].buttonCallback = _sliderHandlerFunctor;
-		_sliderButtons[1][i].x = x + 120;
-		_sliderButtons[1][i].y = y;
-		_menuButtonList = addButtonToList(_menuButtonList, &_sliderButtons[1][i]);
-	}
-
-	_isOptionsMenu = true;
-	updateAllMenuButtons();
-	bool speechEnabled = _vm->speechEnabled();
-	while (_isOptionsMenu) {
-		processHighlights(_audioOptions, _vm->_mouseX, _vm->_mouseY);
-		getInput();
-	}
-
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	if (speechEnabled && !_vm->textEnabled() && (!_vm->speechEnabled() || _vm->getVolume(KyraEngine::kVolumeSpeech) == 2)) {
-		_vm->_configVoice = 0;
-		_vm->setVolume(KyraEngine::kVolumeSpeech, 75);
-		choiceDialog(0x1D, 0);
-	}
-
-	_vm->writeSettings();
-
-	initMenu(*_currentMenu);
-	updateAllMenuButtons();
-	return 0;
-}
-
 int GUI_HoF::sliderHandler(Button *caller) {
 	int button = 0;
 	if (caller->index >= 24 && caller->index <= 27)
@@ -1270,29 +1165,6 @@
 	return 0;
 }
 
-void GUI_HoF::drawSliderBar(int slider, const uint8 *shape) {
-	const int menuX = _audioOptions.x;
-	const int menuY = _audioOptions.y;
-	int x = menuX + _sliderBarsPosition[slider*2+0] + 10;
-	int y = menuY + _sliderBarsPosition[slider*2+1];
-
-	int position = 0;
-	if (_vm->gameFlags().isTalkie) {
-		position = _vm->getVolume(KyraEngine::kVolumeEntry(slider));
-	} else {
-		if (slider < 2)
-			position = _vm->getVolume(KyraEngine::kVolumeEntry(slider));
-		else if (slider == 2)
-			position = (_vm->_configWalkspeed == 3) ? 97 : 2;
-		else if (slider == 3)
-			position = _vm->_configTextspeed;
-	}
-
-	position = MAX(2, position);
-	position = MIN(97, position);
-	_screen->drawShape(0, shape, x+position, y, 0, 0);
-}
-
 int GUI_HoF::loadMenu(Button *caller) {
 	updateSaveList();
 
@@ -1340,341 +1212,5 @@
 	return 0;
 }
 
-int GUI_HoF::clickLoadSlot(Button *caller) {
-	updateMenuButton(caller);
-	
-	assert((caller->index-0x10) >= 0 && (caller->index-0x10 <= 6));
-	MenuItem &item = _loadMenu.item[caller->index-0x10];
-
-	if (item.saveSlot >= 0) {
-		_vm->_gameToLoad = item.saveSlot;
-		_isLoadMenu = false;
-	}
-
-	return 0;
-}
-
-int GUI_HoF::cancelLoadMenu(Button *caller) {
-	updateMenuButton(caller);
-	_isLoadMenu = false;
-	_noLoadProcess = true;
-	return 0;
-}
-
-int GUI_HoF::saveMenu(Button *caller) {
-	updateSaveList();
-
-	updateMenuButton(caller);
-
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-
-	_isSaveMenu = true;
-	_noSaveProcess = false;
-	_saveSlot = -1;
-	_savegameOffset = 0;
-	setupSavegameNames(_saveMenu, 5);
-	initMenu(_saveMenu);
-
-	updateAllMenuButtons();
-
-	while (_isSaveMenu) {
-		processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
-		getInput();
-	}
-
-	if (_noSaveProcess) {
-		restorePage1(_vm->_screenBuffer);
-		backUpPage1(_vm->_screenBuffer);
-		initMenu(*_currentMenu);
-		updateAllMenuButtons();
-		return 0;
-	} else if(_saveSlot <= -1) {
-		return 0;
-	}
-
-	restorePage1(_vm->_screenBuffer);
-	restorePalette();
-	_vm->saveGame(_vm->getSavegameFilename(_saveSlot), _saveDescription);
-	_displayMenu = false;
-	_madeSave = true;
-
-	return 0;
-}
-
-int GUI_HoF::clickSaveSlot(Button *caller) {
-	updateMenuButton(caller);
-
-	assert((caller->index-0x10) >= 0 && (caller->index-0x10 <= 6));
-	MenuItem &item = _saveMenu.item[caller->index-0x10];
-	
-	if (item.saveSlot >= 0) {
-		if (_isDeleteMenu) {
-			_slotToDelete = item.saveSlot;
-			_isDeleteMenu = false;
-			return 0;
-		} else {
-			_saveSlot = item.saveSlot;
-			strcpy(_saveDescription, _vm->getTableString(item.itemId, _vm->_optionsBuffer, 0));
-		}
-	} else if (item.saveSlot == -2) {
-		_saveSlot = getNextSavegameSlot();
-		memset(_saveDescription, 0, sizeof(_saveDescription));
-	}
-
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-
-	initMenu(_savenameMenu);
-	_screen->fillRect(0x26, 0x5B, 0x11F, 0x66, 0xFA);
-	const char *desc = nameInputProcess(_saveDescription, 0x27, 0x5C, 0xFD, 0xFA, 0xFE, 0x50);
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	if (desc) {
-		_isSaveMenu = false;
-		_isDeleteMenu = false;
-	} else {
-		initMenu(_saveMenu);
-	}
-
-	return 0;
-}
-
-int GUI_HoF::cancelSaveMenu(Button *caller) {
-	updateMenuButton(caller);
-	_isSaveMenu = false;
-	_isDeleteMenu = false;
-	_noSaveProcess = true;
-	return 0;
-}
-
-int GUI_HoF::deleteMenu(Button *caller) {
-	updateSaveList();
-
-	updateMenuButton(caller);
-	if (_saveSlots.size() < 2) {
-		_vm->snd_playSoundEffect(0x0D);
-		return 0;
-	}
-
-	do {
-		restorePage1(_vm->_screenBuffer);
-		backUpPage1(_vm->_screenBuffer);
-		_savegameOffset = 1;
-		_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 35 : 1;
-		setupSavegameNames(_saveMenu, 5);
-		initMenu(_saveMenu);
-		_isDeleteMenu = true;
-		_slotToDelete = -1;
-		updateAllMenuButtons();
-
-		while (_isDeleteMenu) {
-			processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
-			getInput();
-		}
-		
-		if (_slotToDelete < 1) {
-			restorePage1(_vm->_screenBuffer);
-			backUpPage1(_vm->_screenBuffer);
-			initMenu(*_currentMenu);
-			updateAllMenuButtons();
-			_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 9 : 17;
-			return 0;
-		}
-	} while (choiceDialog(_vm->gameFlags().isTalkie ? 0x24 : 2, 1) == 0);
-
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	initMenu(*_currentMenu);
-	updateAllMenuButtons();
-	_vm->_saveFileMan->removeSavefile(_vm->getSavegameFilename(_slotToDelete));
-	Common::Array<int>::iterator i = Common::find(_saveSlots.begin(), _saveSlots.end(), _slotToDelete);
-	while (i != _saveSlots.end()) {
-		++i;
-		if (i == _saveSlots.end())
-			break;
-		// We are only renaming all savefiles until we get some slots missing
-		// Also not rename quicksave slot filenames
-		if (*(i-1) != *i || *i >= 990)
-			break;
-		Common::String oldName = _vm->getSavegameFilename(*i);
-		Common::String newName = _vm->getSavegameFilename(*i-1);
-		_vm->_saveFileMan->renameSavefile(oldName.c_str(), newName.c_str());
-	}	
-	_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 9 : 17;
-	return 0;
-}
-
-const char *GUI_HoF::nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8 c2, uint8 c3, int bufferSize) {
-	bool running = true;
-	int curPos = strlen(buffer);
-
-	int x2 = x, y2 = y;
-	_text->printText(buffer, x, y, c1, c2, c2);
-
-	for (int i = 0; i < curPos; ++i)
-		x2 += getCharWidth(buffer[i]);
-
-	drawTextfieldBlock(x2, y2, c3);
-
-	_keyPressed.reset();
-	_cancelNameInput = _finishNameInput = false;
-	while (running && !_vm->quit()) {
-		processHighlights(_savenameMenu, _vm->_mouseX, _vm->_mouseY);
-		checkTextfieldInput();
-		if (_keyPressed.keycode == Common::KEYCODE_RETURN || _keyPressed.keycode == Common::KEYCODE_KP_ENTER || _finishNameInput) {
-			if (checkSavegameDescription(buffer, curPos)) {
-				buffer[curPos] = 0;
-				running = false;
-			} else {
-				_finishNameInput = false;
-			}
-		} else if (_keyPressed.keycode == Common::KEYCODE_ESCAPE || _cancelNameInput) {
-			running = false;
-			return 0;
-		} else if ((_keyPressed.keycode == Common::KEYCODE_BACKSPACE || _keyPressed.keycode == Common::KEYCODE_DELETE) && curPos > 0) {
-			drawTextfieldBlock(x2, y2, c2);
-			--curPos;
-			x2 -= getCharWidth(buffer[curPos]);
-			drawTextfieldBlock(x2, y2, c3);
-			_screen->updateScreen();
-		} else if (_keyPressed.ascii > 31 && _keyPressed.ascii < 127 && curPos < bufferSize) {
-			if (x2 + getCharWidth(_keyPressed.ascii) + 7 < 0x11F) {
-				buffer[curPos] = _keyPressed.ascii;
-				const char text[2] = { buffer[curPos], 0 };
-				_text->printText(text, x2, y2, c1, c2, c2);
-				x2 += getCharWidth(_keyPressed.ascii);
-				drawTextfieldBlock(x2, y2, c3);
-				++curPos;
-				_screen->updateScreen();
-			}
-		}
-
-		_keyPressed.reset();
-	}
-
-	return buffer;
-}
-
-int GUI_HoF::finishSavename(Button *caller) {
-	updateMenuButton(caller);
-	_finishNameInput = true;
-	return 0;
-}
-
-int GUI_HoF::cancelSavename(Button *caller) {
-	updateMenuButton(caller);
-	_cancelNameInput = true;
-	return 0;
-}
-
-bool GUI_HoF::checkSavegameDescription(const char *buffer, int size) {
-	if (!buffer || !size)
-		return false;
-	if (buffer[0] == 0)
-		return false;
-	for (int i = 0; i < size; ++i) {
-		if (buffer[i] != 0x20)
-			return true;
-		else if (buffer[i] == 0x00)
-			return false;
-	}
-	return false;
-}
-
-int GUI_HoF::getCharWidth(uint8 c) {
-	Screen::FontId old = _screen->setFont(Screen::FID_8_FNT);
-	_screen->_charWidth = -2;
-	int width = _screen->getCharWidth(c);
-	_screen->_charWidth = 0;
-	_screen->setFont(old);
-	return width;
-}
-
-void GUI_HoF::checkTextfieldInput() {
-	Common::Event event;
-
-	bool running = true;
-	int keys = 0;
-	while (_vm->_eventMan->pollEvent(event) && running) {
-		switch (event.type) {
-		case Common::EVENT_QUIT:
-			_vm->_quitFlag = true;
-			break;
-
-		case Common::EVENT_KEYDOWN:
-			if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
-				_vm->_quitFlag = true;
-			else
-				_keyPressed = event.kbd; 
-			running = false;
-			break;
-
-		case Common::EVENT_LBUTTONDOWN:
-		case Common::EVENT_LBUTTONUP: {
-			Common::Point pos = _vm->getMousePos();
-			_vm->_mouseX = pos.x;
-			_vm->_mouseY = pos.y;
-			keys = event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800);
-			running = false;
-			} break;
-
-		case Common::EVENT_MOUSEMOVE: {
-			Common::Point pos = _vm->getMousePos();
-			_vm->_mouseX = pos.x;
-			_vm->_mouseY = pos.y;
-			_screen->updateScreen();
-			} break;
-
-		default:
-			break;
-		}
-	}
-
-	processButtonList(_menuButtonList, keys | 0x8000);
-}
-
-void GUI_HoF::drawTextfieldBlock(int x, int y, uint8 c) {
-	_screen->fillRect(x+1, y+1, x+7, y+8, c);
-}
-
-bool GUI_HoF::choiceDialog(int name, bool type) {
-	_choiceMenu.highlightedItem = 0;
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	if (type)
-		_choiceMenu.numberOfItems = 2;
-	else
-		_choiceMenu.numberOfItems = 1;
-	_choiceMenu.menuNameId = name;
-
-	initMenu(_choiceMenu);
-	_isChoiceMenu = true;
-	_choice = false;
-
-	while (_isChoiceMenu) {
-		processHighlights(_choiceMenu, _vm->_mouseX, _vm->_mouseY);
-		getInput();
-	}
-
-	restorePage1(_vm->_screenBuffer);
-	backUpPage1(_vm->_screenBuffer);
-	return _choice;
-}
-
-int GUI_HoF::choiceYes(Button *caller) {
-	updateMenuButton(caller);
-	_choice = true;
-	_isChoiceMenu = false;
-	return 0;
-}
-
-int GUI_HoF::choiceNo(Button *caller) {
-	updateMenuButton(caller);
-	_choice = false;
-	_isChoiceMenu = false;
-	return 0;
-}
-
 } // end of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/gui_hof.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_hof.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_hof.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -38,74 +38,36 @@
 public:
 	GUI_HoF(KyraEngine_HoF *engine);
 
-	int optionsButton(Button *button);
-private:
-	void getInput();
-
-	Button _menuButtons[7];
-	Button _scrollUpButton;
-	Button _scrollDownButton;
-	Menu _mainMenu, _gameOptions, _audioOptions, _choiceMenu, _loadMenu, _saveMenu, _savenameMenu, _deathMenu;
 	void initStaticData();
 
+	int optionsButton(Button *button);
+private:
 	const char *getMenuTitle(const Menu &menu);
 	const char *getMenuItemTitle(const MenuItem &menuItem);
 	const char *getMenuItemLabel(const MenuItem &menuItem);
 
-	Button *getButtonListData() { return _menuButtons; }
-
-	Button *getScrollUpButton() { return &_scrollUpButton; }
-	Button *getScrollDownButton() { return &_scrollDownButton; }
-
-	int scrollUpButton(Button *button);
-	int scrollDownButton(Button *button);
-	Button::Callback _scrollUpFunctor;
-	Button::Callback _scrollDownFunctor;
-	Button::Callback getScrollUpButtonHandler() const { return _scrollUpFunctor; }
-	Button::Callback getScrollDownButtonHandler() const { return _scrollDownFunctor; }
-
-	Button _sliderButtons[3][4];
-
 	uint8 defaultColor1() const { return 0xCF; }
 	uint8 defaultColor2() const { return 0xF8; }
 
-	void renewHighlight(Menu &menu);
+	uint8 textFieldColor1() const { return 0xFD; }
+	uint8 textFieldColor2() const { return 0xFA; }
+	uint8 textFieldColor3() const { return 0xFE; }
 
 	void setupPalette();
 	void restorePalette();
 
-	void backUpPage1(uint8 *buffer);
-	void restorePage1(const uint8 *buffer);
-
 	void resetState(int item);
 
+	char *getTableString(int id);
+
 	KyraEngine_HoF *_vm;
 	Screen_HoF *_screen;
 
-	Menu *_currentMenu;
-	bool _isLoadMenu;
-	bool _isDeathMenu;
-	bool _isSaveMenu;
-	bool _isDeleteMenu;
-	bool _isChoiceMenu;
-	bool _isOptionsMenu;
-	bool _madeSave;
-	bool _loadedSave;
-	bool _restartGame;
-	bool _reloadTemporarySave;
-
-	int _savegameOffset;
-
-	void setupSavegameNames(Menu &menu, int num);
-
-	// main menu
 	int quitGame(Button *caller);
-	int resumeGame(Button *caller);
-
-	// options menu
+	int loadMenu(Button *caller);
+	int audioOptions(Button *caller);
 	int gameOptions(Button *caller);
 	int gameOptionsTalkie(Button *caller);
-	int quitOptionsMenu(Button *caller);
 
 	int toggleWalkspeed(Button *caller);
 	int changeLanguage(Button *caller);
@@ -113,55 +75,10 @@
 
 	void setupOptionsButtons();
 
-	// audio menu
-	int audioOptions(Button *caller);
-
 	Button::Callback _sliderHandlerFunctor;
 	int sliderHandler(Button *caller);
-
 	void drawSliderBar(int slider, const uint8 *shape);
 
-	static const int _sliderBarsPosition[];
-
-	// load menu
-	bool _noLoadProcess;
-	int loadMenu(Button *caller);
-	int clickLoadSlot(Button *caller);
-	int cancelLoadMenu(Button *caller);
-
-	// save menu
-	bool _noSaveProcess;
-	int _saveSlot;
-	char _saveDescription[0x50];
-
-	int saveMenu(Button *caller);
-	int clickSaveSlot(Button *caller);
-	int cancelSaveMenu(Button *caller);
-
-	// delete menu
-	int _slotToDelete;
-	int deleteMenu(Button *caller);
-
-	// savename menu
-	bool _finishNameInput, _cancelNameInput;
-	Common::KeyState _keyPressed;
-
-	const char *nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8 c2, uint8 c3, int bufferSize);
-	int finishSavename(Button *caller);
-	int cancelSavename(Button *caller);
-
-	bool checkSavegameDescription(const char *buffer, int size);
-	int getCharWidth(uint8 c);
-	void checkTextfieldInput();
-	void drawTextfieldBlock(int x, int y, uint8 c);
-
-	// choice menu
-	bool _choice;
-
-	bool choiceDialog(int name, bool type);
-	int choiceYes(Button *caller);
-	int choiceNo(Button *caller);
-
 	static const uint16 _menuStringsTalkie[];
 	static const uint16 _menuStringsOther[];
 };

Modified: scummvm/trunk/engines/kyra/gui_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_mr.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -28,9 +28,83 @@
 #include "kyra/text_mr.h"
 #include "kyra/wsamovie.h"
 #include "kyra/resource.h"
+#include "kyra/sound.h"
+#include "kyra/timer.h"
 
+#include "common/savefile.h"
+
 namespace Kyra {
 
+void KyraEngine_MR::loadButtonShapes() {
+	debugC(9, kDebugLevelMain, "KyraEngine_MR::loadButtonShapes()");
+	_res->exists("BUTTONS.SHP", true);
+	uint8 *data = _res->fileData("BUTTONS.SHP", 0);
+	assert(data);
+	for (int i = 0; i <= 10; ++i)
+		addShapeToPool(data, 0x1C7+i, i);
+	delete[] data;
+
+	Button::Callback callback1 = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::callbackButton1);
+	Button::Callback callback2 = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::callbackButton2);
+	Button::Callback callback3 = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::callbackButton3);
+
+	_gui->getScrollUpButton()->data0Callback = callback1;
+	_gui->getScrollUpButton()->data1Callback = callback2;
+	_gui->getScrollUpButton()->data2Callback = callback3;
+	_gui->getScrollDownButton()->data0Callback = callback1;
+	_gui->getScrollDownButton()->data1Callback = callback2;
+	_gui->getScrollDownButton()->data2Callback = callback3;
+
+	_mainButtonData[0].data0Callback = callback1;
+	_mainButtonData[0].data1Callback = callback2;
+	_mainButtonData[0].data2Callback = callback3;
+}
+
+int KyraEngine_MR::callbackButton1(Button *button) {
+	const uint8 *shapePtr = 0;
+	if (button->index == 1)
+		shapePtr = getShapePtr(0x1CD);
+	else if (button->index == 22)
+		shapePtr = getShapePtr(0x1C7);
+	else if (button->index == 23)
+		shapePtr = getShapePtr(0x1CA);
+
+	if (shapePtr)
+		_screen->drawShape(0, shapePtr, button->x, button->y, 0, 0, 0);
+
+	return 0;
+}
+
+int KyraEngine_MR::callbackButton2(Button *button) {
+	const uint8 *shapePtr = 0;
+	if (button->index == 1)
+		shapePtr = getShapePtr(0x1CE);
+	else if (button->index == 22)
+		shapePtr = getShapePtr(0x1C9);
+	else if (button->index == 23)
+		shapePtr = getShapePtr(0x1CC);
+
+	if (shapePtr)
+		_screen->drawShape(0, shapePtr, button->x, button->y, 0, 0, 0);
+
+	return 0;
+}
+
+int KyraEngine_MR::callbackButton3(Button *button) {
+	const uint8 *shapePtr = 0;
+	if (button->index == 1)
+		shapePtr = getShapePtr(0x1CE);
+	else if (button->index == 22)
+		shapePtr = getShapePtr(0x1C8);
+	else if (button->index == 23)
+		shapePtr = getShapePtr(0x1CB);
+
+	if (shapePtr)
+		_screen->drawShape(0, shapePtr, button->x, button->y, 0, 0, 0);
+
+	return 0;
+}
+
 void KyraEngine_MR::showMessage(const char *string, uint8 c0, uint8 c1) {
 	debugC(9, kDebugLevelMain, "KyraEngine_MR::showMessage('%s', %d, %d)", string, c0, c1);
 	_shownMessage = string;
@@ -630,5 +704,262 @@
 	}
 }
 
+const char *GUI_MR::getMenuTitle(const Menu &menu) {
+	if (!menu.menuNameId)
+		return 0;
+
+	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menu.menuNameId);
+}
+
+const char *GUI_MR::getMenuItemTitle(const MenuItem &menuItem) {
+	if (!menuItem.itemId)
+		return 0;
+
+	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menuItem.itemId);
+}
+
+const char *GUI_MR::getMenuItemLabel(const MenuItem &menuItem) {
+	if (!menuItem.labelId)
+		return 0;
+
+	return (const char *)_vm->getTableEntry(_vm->_optionsFile, menuItem.labelId);
+}
+
+char *GUI_MR::getTableString(int id) {
+	return (char *)_vm->getTableEntry(_vm->_optionsFile, id);
+}
+
+int GUI_MR::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, 0xD0);
+	_screen->showMouse();
+
+	return 0;
+}
+
+int GUI_MR::redrawShadedButtonCallback(Button *button) {
+	if (!_displayMenu)
+		return 0;
+
+	_screen->hideMouse();
+	_screen->drawShadedBox(button->x, button->y, button->x + button->width, button->y + button->height, 0xD1, 0xCF);
+	_screen->showMouse();
+
+	return 0;
+}
+void GUI_MR::resetState(int item) {
+	_vm->_timer->resetNextRun();
+	_vm->setNextIdleAnimTimer();
+	_isDeathMenu = false;
+	if (!_loadedSave) {
+		_vm->setHandItem(item);
+	} else {
+		_vm->setHandItem(_vm->_itemInHand);
+		_vm->setCommandLineRestoreTimer(7);
+		_vm->_shownMessage = " ";
+		_vm->_restoreCommandLine = false;
+	}
+	_buttonListChanged = true;
+}
+
+int GUI_MR::quitGame(Button *caller) {
+	updateMenuButton(caller);
+	if (choiceDialog(0x0F, 1)) {
+		_displayMenu = false;
+		_vm->_runFlag = false;
+		_vm->fadeOutMusic(60);
+		_screen->fadeToBlack();
+		_screen->clearCurPage();
+	}
+
+	if (_vm->_runFlag) {
+		initMenu(*_currentMenu);
+		updateAllMenuButtons();
+	}
+
+	return 0;
+}
+
+int GUI_MR::optionsButton(Button *button) {
+	_vm->musicUpdate(0);
+
+	_screen->hideMouse();
+	updateButton(&_vm->_mainButtonData[0]);
+	_screen->showMouse();
+
+	if (!_vm->_inventoryState && button && !_vm->_menuDirectlyToLoad)
+		return 0;
+
+	_restartGame = false;
+	_reloadTemporarySave = false;
+
+	if (!_screen->isMouseVisible() && button && !_vm->_menuDirectlyToLoad)
+		return 0;
+
+	_vm->showMessage(0, 0xF0, 0xF0);
+
+	if (_vm->_handItemSet < -1) {
+		_vm->_handItemSet = -1;
+		_screen->hideMouse();
+		_screen->setMouseCursor(1, 1, _vm->getShapePtr(0));
+		_screen->showMouse();
+		return 0;
+	}
+
+	int oldHandItem = _vm->_itemInHand;
+	_screen->setMouseCursor(0, 0, _vm->getShapePtr(0));
+	_vm->musicUpdate(0);
+
+	_displayMenu = true;
+	for (int i = 0; i < 4; ++i) {
+		if (_vm->_musicSoundChannel != i)
+			_vm->_soundDigital->stopSound(i);
+	}
+
+	for (uint i = 0; i < ARRAYSIZE(_menuButtons); ++i) {
+		_menuButtons[i].data0Val1 = _menuButtons[i].data1Val1 = _menuButtons[i].data2Val1 = 4;
+		_menuButtons[i].data0Callback = _redrawShadedButtonFunctor;
+		_menuButtons[i].data1Callback = _menuButtons[i].data2Callback = _redrawButtonFunctor;
+	}
+
+	initMenuLayout(_mainMenu);
+	initMenuLayout(_gameOptions);
+	initMenuLayout(_audioOptions);
+	initMenuLayout(_choiceMenu);
+	_loadMenu.numberOfItems = 6;
+	initMenuLayout(_loadMenu);
+	initMenuLayout(_saveMenu);
+	initMenuLayout(_savenameMenu);
+	initMenuLayout(_deathMenu);
+	
+	_currentMenu = &_mainMenu;
+
+	_vm->musicUpdate(0);
+
+	if (_vm->_menuDirectlyToLoad) {
+		backUpPage1(_vm->_screenBuffer);
+
+		_loadedSave = false;
+		
+		--_loadMenu.numberOfItems;
+		loadMenu(0);
+		++_loadMenu.numberOfItems;
+
+		if (_loadedSave) {
+			if (_restartGame)
+				_vm->_itemInHand = -1;
+		} else {
+			restorePage1(_vm->_screenBuffer);
+		}
+
+		resetState(-1);
+		_vm->_menuDirectlyToLoad = false;
+		return 0;
+	}
+
+	if (!button) {
+		_currentMenu = &_deathMenu;
+		_isDeathMenu = true;
+	} else {
+		_isDeathMenu = false;
+	}
+
+	_vm->musicUpdate(0);
+	backUpPage1(_vm->_screenBuffer);
+	initMenu(*_currentMenu);
+	_madeSave = false;
+	_loadedSave = false;
+	_vm->_itemInHand = -1;
+	updateAllMenuButtons();
+
+	if (_isDeathMenu) {
+		while (!_screen->isMouseVisible())
+			_screen->showMouse();
+	}
+
+	while (_displayMenu) {
+		processHighlights(*_currentMenu, _vm->_mouseX, _vm->_mouseY);
+		getInput();
+	}
+
+	if (_vm->_runFlag && !_loadedSave && !_madeSave) {
+		restorePalette();
+		restorePage1(_vm->_screenBuffer);
+	}
+
+	if (_vm->_runFlag)
+		updateMenuButton(&_vm->_mainButtonData[0]);
+
+	resetState(oldHandItem);
+
+	if (!_loadedSave && _reloadTemporarySave) {
+		_vm->_unkSceneScreenFlag1 = true;
+		_vm->loadGame(_vm->getSavegameFilename(999));
+		_vm->_saveFileMan->removeSavefile(_vm->getSavegameFilename(999));
+		_vm->_unkSceneScreenFlag1 = false;
+	}
+
+	return 0;
+}
+
+int GUI_MR::loadMenu(Button *caller) {
+	updateSaveList();
+
+	if (!_vm->_menuDirectlyToLoad) {
+		updateMenuButton(caller);
+		restorePage1(_vm->_screenBuffer);
+		backUpPage1(_vm->_screenBuffer);
+	}
+
+	_savegameOffset = 0;
+	setupSavegameNames(_loadMenu, 5);
+	initMenu(_loadMenu);
+	_isLoadMenu = true;
+	_noLoadProcess = false;
+	_vm->_gameToLoad = -1;
+	updateAllMenuButtons();
+
+	_screen->updateScreen();
+	while (_isLoadMenu) {
+		processHighlights(_loadMenu, _vm->_mouseX, _vm->_mouseY);
+		getInput();
+	}
+
+	if (_noLoadProcess) {
+		if (!_vm->_menuDirectlyToLoad) {
+			restorePage1(_vm->_screenBuffer);
+			backUpPage1(_vm->_screenBuffer);
+			initMenu(*_currentMenu);
+			updateAllMenuButtons();
+		}
+	} else if (_vm->_gameToLoad >= 0) {
+		restorePage1(_vm->_screenBuffer);
+		restorePalette();
+		_vm->loadGame(_vm->getSavegameFilename(_vm->_gameToLoad));
+		if (_vm->_gameToLoad == 0) {
+			_restartGame = true;
+			_vm->runStartupScript(1, 1);
+		}
+		_displayMenu = false;
+		_loadedSave = true;
+	}
+
+	return 0;
+}
+
+int GUI_MR::loadSecondChance(Button *button) {
+	updateMenuButton(button);
+
+	_vm->_gameToLoad = 999;
+	restorePage1(_vm->_screenBuffer);
+	_vm->loadGame(_vm->getSavegameFilename(_vm->_gameToLoad));
+	_displayMenu = false;
+	_loadedSave = true;
+	return 0;
+}
+
 } // end of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/gui_mr.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_mr.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_mr.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -38,24 +38,34 @@
 public:
 	GUI_MR(KyraEngine_MR *engine);
 
+	void initStaticData();
+
 	void flagButtonEnable(Button *button);
 	void flagButtonDisable(Button *button);
-private:
-	const char *getMenuTitle(const Menu &menu) { return 0; }
-	const char *getMenuItemTitle(const MenuItem &menuItem) { return 0; }
-	const char *getMenuItemLabel(const MenuItem &menuItem) { return 0; }
 
-	Button *getButtonListData() { return 0; }
+	int redrawShadedButtonCallback(Button *button);
+	int redrawButtonCallback(Button *button);
 
-	Button *getScrollUpButton() { return 0; }
-	Button *getScrollDownButton() { return 0; }
+	int optionsButton(Button *button);
+private:
+	const char *getMenuTitle(const Menu &menu);
+	const char *getMenuItemTitle(const MenuItem &menuItem);
+	const char *getMenuItemLabel(const MenuItem &menuItem);
+	char *getTableString(int id);
 
-	Button::Callback getScrollUpButtonHandler() const { return Button::Callback(); }
-	Button::Callback getScrollDownButtonHandler() const { return Button::Callback(); }
+	uint8 textFieldColor1() const { return 0xFF; }
+	uint8 textFieldColor2() const { return 0xCF; }
+	uint8 textFieldColor3() const { return 0xBA; }
 
 	uint8 defaultColor1() const { return 0xF0; }
 	uint8 defaultColor2() const { return 0xD0; }
 
+	void resetState(int item);
+
+	int quitGame(Button *button);
+	int loadMenu(Button *button);
+	int loadSecondChance(Button *button);
+
 	KyraEngine_MR *_vm;
 	Screen_MR *_screen;
 };

Modified: scummvm/trunk/engines/kyra/gui_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_v2.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -26,12 +26,22 @@
 #include "kyra/gui_v2.h"
 #include "kyra/kyra_v2.h"
 #include "kyra/screen_v2.h"
+#include "kyra/text.h"
 
+#include "common/savefile.h"
+
 namespace Kyra {
 
 GUI_v2::GUI_v2(KyraEngine_v2 *vm) : GUI(vm), _vm(vm), _screen(vm->screen_v2()) {
 	_backUpButtonList = _unknownButtonList = 0;
 	_buttonListChanged = false;
+
+	_currentMenu = 0;
+	_isDeathMenu = false;
+	_isSaveMenu = false;
+	_isLoadMenu = false;
+	_scrollUpFunctor = BUTTON_FUNCTOR(GUI_v2, this, &GUI_v2::scrollUpButton);
+	_scrollDownFunctor = BUTTON_FUNCTOR(GUI_v2, this, &GUI_v2::scrollDownButton);
 }
 
 Button *GUI_v2::addButtonToList(Button *list, Button *newButton) {
@@ -383,5 +393,468 @@
 	processButton(button);
 }
 
+void GUI_v2::getInput() {
+	if (!_displayMenu)
+		return;
+
+	_vm->checkInput(_menuButtonList);
+	_vm->removeInputTop();
+	if (_vm->quit()) {
+		_displayMenu = false;
+		_isLoadMenu = false;
+		_isSaveMenu = false;
+		_isOptionsMenu = false;
+		_isDeleteMenu = false;
+	}
+}
+
+void GUI_v2::renewHighlight(Menu &menu) {
+	if (!_displayMenu)
+		return;
+
+	MenuItem &item = menu.item[menu.highlightedItem];
+	int x = item.x + menu.x; int y = item.y + menu.y;
+	int x2 = x + item.width - 1; int y2 = y + item.height - 1;
+	redrawText(menu);
+	_screen->fillRect(x+2, y+2, x2-2, y2-2, item.bkgdColor);
+	redrawHighlight(menu);
+	_screen->updateScreen();
+}
+
+void GUI_v2::backUpPage1(uint8 *buffer) {
+	_screen->copyRegionToBuffer(1, 0, 0, 320, 200, buffer);
+}
+
+void GUI_v2::restorePage1(const uint8 *buffer) {
+	_screen->copyBlockToPage(1, 0, 0, 320, 200, buffer);
+}
+
+void GUI_v2::setupSavegameNames(Menu &menu, int num) {
+	for (int i = 0; i < num; ++i) {
+		strcpy(getTableString(menu.item[i].itemId), "");
+		menu.item[i].saveSlot = -1;
+		menu.item[i].enabled = false;
+	}
+
+	int startSlot = 0;
+	if (_isSaveMenu && _savegameOffset == 0)
+		startSlot = 1;
+
+	KyraEngine::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(getTableString(menu.item[i].itemId), header.description.c_str(), 80);
+			menu.item[i].saveSlot = _saveSlots[i + _savegameOffset];
+			menu.item[i].enabled = true;
+			delete in;
+		}
+	}
+
+	if (_savegameOffset == 0) {
+		if (_isSaveMenu) {
+			char *dst = getTableString(menu.item[0].itemId);
+			const char *src = getTableString(_vm->gameFlags().isTalkie ? 10 : 18);
+			strcpy(dst, src);
+			menu.item[0].saveSlot = -2;
+			menu.item[0].enabled = true;
+		} else {
+			char *dst = getTableString(menu.item[0].itemId);
+			const char *src = getTableString(_vm->gameFlags().isTalkie ? 34 : 42);
+			strcpy(dst, src);
+		}
+	}
+}
+
+int GUI_v2::scrollUpButton(Button *button) {
+	updateMenuButton(button);
+
+	if (_savegameOffset == (_isDeleteMenu ? 1 : 0))
+		return 0;
+
+	--_savegameOffset;
+	if (_isLoadMenu) {
+		setupSavegameNames(_loadMenu, 5);
+		// original calls something different here...
+		initMenu(_loadMenu);
+	} else if (_isSaveMenu || _isDeleteMenu) {
+		setupSavegameNames(_saveMenu, 5);
+		// original calls something different here...
+		initMenu(_saveMenu);
+	}
+
+	return 0;
+}
+
+int GUI_v2::scrollDownButton(Button *button) {
+	updateMenuButton(button);
+	++_savegameOffset;
+
+	if (uint(_savegameOffset + 5) >= _saveSlots.size())
+		_savegameOffset = MAX<int>(_saveSlots.size() - 5, _isDeleteMenu ? 1 : 0);
+
+	if (_isLoadMenu) {
+		setupSavegameNames(_loadMenu, 5);
+		// original calls something different here...
+		initMenu(_loadMenu);
+	} else if (_isSaveMenu || _isDeleteMenu) {
+		setupSavegameNames(_saveMenu, 5);
+		// original calls something different here...
+		initMenu(_saveMenu);
+	}
+
+	return 0;
+}
+
+int GUI_v2::resumeGame(Button *caller) {
+	updateMenuButton(caller);
+	_displayMenu = false;
+	return 0;
+}
+
+int GUI_v2::quitOptionsMenu(Button *caller) {
+	updateMenuButton(caller);
+	_isOptionsMenu = false;
+	return 0;
+}
+
+int GUI_v2::clickLoadSlot(Button *caller) {
+	updateMenuButton(caller);
+
+	int index = caller->index - _menuButtons[0].index;
+	assert(index >= 0 && index <= 6);
+	MenuItem &item = _loadMenu.item[index];
+
+	if (item.saveSlot >= 0) {
+		_vm->_gameToLoad = item.saveSlot;
+		_isLoadMenu = false;
+	}
+
+	return 0;
+}
+
+int GUI_v2::cancelLoadMenu(Button *caller) {
+	updateMenuButton(caller);
+	_isLoadMenu = false;
+	_noLoadProcess = true;
+	return 0;
+}
+
+int GUI_v2::saveMenu(Button *caller) {
+	updateSaveList();
+
+	updateMenuButton(caller);
+
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+
+	_isSaveMenu = true;
+	_noSaveProcess = false;
+	_saveSlot = -1;
+	_savegameOffset = 0;
+	setupSavegameNames(_saveMenu, 5);
+	initMenu(_saveMenu);
+
+	updateAllMenuButtons();
+
+	while (_isSaveMenu) {
+		processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
+		getInput();
+	}
+
+	if (_noSaveProcess) {
+		restorePage1(_vm->_screenBuffer);
+		backUpPage1(_vm->_screenBuffer);
+		initMenu(*_currentMenu);
+		updateAllMenuButtons();
+		return 0;
+	} else if(_saveSlot <= -1) {
+		return 0;
+	}
+
+	restorePage1(_vm->_screenBuffer);
+	restorePalette();
+	_vm->saveGame(_vm->getSavegameFilename(_saveSlot), _saveDescription);
+	_displayMenu = false;
+	_madeSave = true;
+
+	return 0;
+}
+
+int GUI_v2::clickSaveSlot(Button *caller) {
+	updateMenuButton(caller);
+
+	int index = caller->index - _menuButtons[0].index;
+	assert(index >= 0 && index <= 6);
+	MenuItem &item = _saveMenu.item[index];
+	
+	if (item.saveSlot >= 0) {
+		if (_isDeleteMenu) {
+			_slotToDelete = item.saveSlot;
+			_isDeleteMenu = false;
+			return 0;
+		} else {
+			_saveSlot = item.saveSlot;
+			strcpy(_saveDescription, getTableString(item.itemId));
+		}
+	} else if (item.saveSlot == -2) {
+		_saveSlot = getNextSavegameSlot();
+		memset(_saveDescription, 0, sizeof(_saveDescription));
+	}
+
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+
+	initMenu(_savenameMenu);
+	_screen->fillRect(0x26, 0x5B, 0x11F, 0x66, textFieldColor2());
+	const char *desc = nameInputProcess(_saveDescription, 0x27, 0x5C, textFieldColor1(), textFieldColor2(), textFieldColor3(), 0x50);
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	if (desc) {
+		_isSaveMenu = false;
+		_isDeleteMenu = false;
+	} else {
+		initMenu(_saveMenu);
+	}
+
+	return 0;
+}
+
+int GUI_v2::cancelSaveMenu(Button *caller) {
+	updateMenuButton(caller);
+	_isSaveMenu = false;
+	_isDeleteMenu = false;
+	_noSaveProcess = true;
+	return 0;
+}
+
+int GUI_v2::deleteMenu(Button *caller) {
+	updateSaveList();
+
+	updateMenuButton(caller);
+	if (_saveSlots.size() < 2) {
+		_vm->snd_playSoundEffect(0x0D);
+		return 0;
+	}
+
+	do {
+		restorePage1(_vm->_screenBuffer);
+		backUpPage1(_vm->_screenBuffer);
+		_savegameOffset = 1;
+		_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 35 : 1;
+		setupSavegameNames(_saveMenu, 5);
+		initMenu(_saveMenu);
+		_isDeleteMenu = true;
+		_slotToDelete = -1;
+		updateAllMenuButtons();
+
+		while (_isDeleteMenu) {
+			processHighlights(_saveMenu, _vm->_mouseX, _vm->_mouseY);
+			getInput();
+		}
+		
+		if (_slotToDelete < 1) {
+			restorePage1(_vm->_screenBuffer);
+			backUpPage1(_vm->_screenBuffer);
+			initMenu(*_currentMenu);
+			updateAllMenuButtons();
+			_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 9 : 17;
+			return 0;
+		}
+	} while (choiceDialog(_vm->gameFlags().isTalkie ? 0x24 : 2, 1) == 0);
+
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	initMenu(*_currentMenu);
+	updateAllMenuButtons();
+	_vm->_saveFileMan->removeSavefile(_vm->getSavegameFilename(_slotToDelete));
+	Common::Array<int>::iterator i = Common::find(_saveSlots.begin(), _saveSlots.end(), _slotToDelete);
+	while (i != _saveSlots.end()) {
+		++i;
+		if (i == _saveSlots.end())
+			break;
+		// We are only renaming all savefiles until we get some slots missing
+		// Also not rename quicksave slot filenames
+		if (*(i-1) != *i || *i >= 990)
+			break;
+		Common::String oldName = _vm->getSavegameFilename(*i);
+		Common::String newName = _vm->getSavegameFilename(*i-1);
+		_vm->_saveFileMan->renameSavefile(oldName.c_str(), newName.c_str());
+	}	
+	_saveMenu.menuNameId = _vm->gameFlags().isTalkie ? 9 : 17;
+	return 0;
+}
+
+const char *GUI_v2::nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8 c2, uint8 c3, int bufferSize) {
+	bool running = true;
+	int curPos = strlen(buffer);
+
+	int x2 = x, y2 = y;
+	_text->printText(buffer, x, y, c1, c2, c2);
+
+	for (int i = 0; i < curPos; ++i)
+		x2 += getCharWidth(buffer[i]);
+
+	drawTextfieldBlock(x2, y2, c3);
+
+	_keyPressed.reset();
+	_cancelNameInput = _finishNameInput = false;
+	while (running && !_vm->quit()) {
+		processHighlights(_savenameMenu, _vm->_mouseX, _vm->_mouseY);
+		checkTextfieldInput();
+		if (_keyPressed.keycode == Common::KEYCODE_RETURN || _keyPressed.keycode == Common::KEYCODE_KP_ENTER || _finishNameInput) {
+			if (checkSavegameDescription(buffer, curPos)) {
+				buffer[curPos] = 0;
+				running = false;
+			} else {
+				_finishNameInput = false;
+			}
+		} else if (_keyPressed.keycode == Common::KEYCODE_ESCAPE || _cancelNameInput) {
+			running = false;
+			return 0;
+		} else if ((_keyPressed.keycode == Common::KEYCODE_BACKSPACE || _keyPressed.keycode == Common::KEYCODE_DELETE) && curPos > 0) {
+			drawTextfieldBlock(x2, y2, c2);
+			--curPos;
+			x2 -= getCharWidth(buffer[curPos]);
+			drawTextfieldBlock(x2, y2, c3);
+			_screen->updateScreen();
+		} else if (_keyPressed.ascii > 31 && _keyPressed.ascii < 127 && curPos < bufferSize) {
+			if (x2 + getCharWidth(_keyPressed.ascii) + 7 < 0x11F) {
+				buffer[curPos] = _keyPressed.ascii;
+				const char text[2] = { buffer[curPos], 0 };
+				_text->printText(text, x2, y2, c1, c2, c2);
+				x2 += getCharWidth(_keyPressed.ascii);
+				drawTextfieldBlock(x2, y2, c3);
+				++curPos;
+				_screen->updateScreen();
+			}
+		}
+
+		_keyPressed.reset();
+	}
+
+	return buffer;
+}
+
+int GUI_v2::finishSavename(Button *caller) {
+	updateMenuButton(caller);
+	_finishNameInput = true;
+	return 0;
+}
+
+int GUI_v2::cancelSavename(Button *caller) {
+	updateMenuButton(caller);
+	_cancelNameInput = true;
+	return 0;
+}
+
+bool GUI_v2::checkSavegameDescription(const char *buffer, int size) {
+	if (!buffer || !size)
+		return false;
+	if (buffer[0] == 0)
+		return false;
+	for (int i = 0; i < size; ++i) {
+		if (buffer[i] != 0x20)
+			return true;
+		else if (buffer[i] == 0x00)
+			return false;
+	}
+	return false;
+}
+
+int GUI_v2::getCharWidth(uint8 c) {
+	Screen::FontId old = _screen->setFont(Screen::FID_8_FNT);
+	_screen->_charWidth = -2;
+	int width = _screen->getCharWidth(c);
+	_screen->_charWidth = 0;
+	_screen->setFont(old);
+	return width;
+}
+
+void GUI_v2::checkTextfieldInput() {
+	Common::Event event;
+
+	bool running = true;
+	int keys = 0;
+	while (_vm->_eventMan->pollEvent(event) && running) {
+		switch (event.type) {
+		case Common::EVENT_QUIT:
+			_vm->_quitFlag = true;
+			break;
+
+		case Common::EVENT_KEYDOWN:
+			if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
+				_vm->_quitFlag = true;
+			else
+				_keyPressed = event.kbd; 
+			running = false;
+			break;
+
+		case Common::EVENT_LBUTTONDOWN:
+		case Common::EVENT_LBUTTONUP: {
+			Common::Point pos = _vm->getMousePos();
+			_vm->_mouseX = pos.x;
+			_vm->_mouseY = pos.y;
+			keys = event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800);
+			running = false;
+			} break;
+
+		case Common::EVENT_MOUSEMOVE: {
+			Common::Point pos = _vm->getMousePos();
+			_vm->_mouseX = pos.x;
+			_vm->_mouseY = pos.y;
+			_screen->updateScreen();
+			} break;
+
+		default:
+			break;
+		}
+	}
+
+	processButtonList(_menuButtonList, keys | 0x8000);
+}
+
+void GUI_v2::drawTextfieldBlock(int x, int y, uint8 c) {
+	_screen->fillRect(x+1, y+1, x+7, y+8, c);
+}
+
+bool GUI_v2::choiceDialog(int name, bool type) {
+	_choiceMenu.highlightedItem = 0;
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	if (type)
+		_choiceMenu.numberOfItems = 2;
+	else
+		_choiceMenu.numberOfItems = 1;
+	_choiceMenu.menuNameId = name;
+
+	initMenu(_choiceMenu);
+	_isChoiceMenu = true;
+	_choice = false;
+
+	while (_isChoiceMenu) {
+		processHighlights(_choiceMenu, _vm->_mouseX, _vm->_mouseY);
+		getInput();
+	}
+
+	restorePage1(_vm->_screenBuffer);
+	backUpPage1(_vm->_screenBuffer);
+	return _choice;
+}
+
+int GUI_v2::choiceYes(Button *caller) {
+	updateMenuButton(caller);
+	_choice = true;
+	_isChoiceMenu = false;
+	return 0;
+}
+
+int GUI_v2::choiceNo(Button *caller) {
+	updateMenuButton(caller);
+	_choice = false;
+	_isChoiceMenu = false;
+	return 0;
+}
+
 } // end of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/gui_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/gui_v2.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -98,6 +98,8 @@
 public:
 	GUI_v2(KyraEngine_v2 *vm);
 
+	virtual void initStaticData() = 0;
+
 	Button *addButtonToList(Button *list, Button *newButton);
 
 	void processButton(Button *button);
@@ -112,6 +114,106 @@
 	bool _buttonListChanged;
 	Button *_backUpButtonList;
 	Button *_unknownButtonList;
+
+protected:
+	virtual void setupPalette() {}
+	virtual void restorePalette() {}
+
+	virtual char *getTableString(int id) = 0;
+	
+	virtual uint8 textFieldColor1() const = 0;
+	virtual uint8 textFieldColor2() const = 0;
+	virtual uint8 textFieldColor3() const = 0;
+protected:
+	void getInput();
+
+	Button _menuButtons[7];
+	Button _scrollUpButton;
+	Button _scrollDownButton;
+	Menu _mainMenu, _gameOptions, _audioOptions, _choiceMenu, _loadMenu, _saveMenu, _savenameMenu, _deathMenu;
+
+	Button *getButtonListData() { return _menuButtons; }
+
+	Button *getScrollUpButton() { return &_scrollUpButton; }
+	Button *getScrollDownButton() { return &_scrollDownButton; }
+
+	int scrollUpButton(Button *button);
+	int scrollDownButton(Button *button);
+	Button::Callback _scrollUpFunctor;
+	Button::Callback _scrollDownFunctor;
+	Button::Callback getScrollUpButtonHandler() const { return _scrollUpFunctor; }
+	Button::Callback getScrollDownButtonHandler() const { return _scrollDownFunctor; }
+
+	Button _sliderButtons[3][4];
+
+	void renewHighlight(Menu &menu);
+
+	void backUpPage1(uint8 *buffer);
+	void restorePage1(const uint8 *buffer);
+
+	Menu *_currentMenu;
+	bool _isLoadMenu;
+	bool _isDeathMenu;
+	bool _isSaveMenu;
+	bool _isDeleteMenu;
+	bool _isChoiceMenu;
+	bool _isOptionsMenu;
+	bool _madeSave;
+	bool _loadedSave;
+	bool _restartGame;
+	bool _reloadTemporarySave;
+
+	int _savegameOffset;
+
+	void setupSavegameNames(Menu &menu, int num);
+
+	// main menu
+	int resumeGame(Button *caller);
+
+	// audio menu
+	static const int _sliderBarsPosition[];
+
+	// load menu
+	bool _noLoadProcess;
+	int clickLoadSlot(Button *caller);
+	int cancelLoadMenu(Button *caller);
+
+	// save menu
+	bool _noSaveProcess;
+	int _saveSlot;
+	char _saveDescription[0x50];
+
+	int saveMenu(Button *caller);
+	int clickSaveSlot(Button *caller);
+	int cancelSaveMenu(Button *caller);
+
+	// delete menu
+	int _slotToDelete;
+	int deleteMenu(Button *caller);
+
+	// options menu
+	int quitOptionsMenu(Button *caller);
+
+	// savename menu
+	bool _finishNameInput, _cancelNameInput;
+	Common::KeyState _keyPressed;
+
+	const char *nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8 c2, uint8 c3, int bufferSize);
+	int finishSavename(Button *caller);
+	int cancelSavename(Button *caller);
+
+	bool checkSavegameDescription(const char *buffer, int size);
+	int getCharWidth(uint8 c);
+	void checkTextfieldInput();
+	void drawTextfieldBlock(int x, int y, uint8 c);
+
+	// choice menu
+	bool _choice;
+
+	bool choiceDialog(int name, bool type);
+	int choiceYes(Button *caller);
+	int choiceNo(Button *caller);
+
 };
 
 } // end of namespace Kyra

Modified: scummvm/trunk/engines/kyra/kyra_hof.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_hof.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_hof.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -105,7 +105,6 @@
 
 	_gamePlayBuffer = 0;
 	_unkBuf500Bytes = 0;
-	_screenBuffer = 0;
 	_inventorySaved = false;
 	_unkBuf200kByte = 0;
 	memset(&_sceneShapeTable, 0, sizeof(_sceneShapeTable));
@@ -189,6 +188,7 @@
 	assert(_text);
 	_gui = new GUI_HoF(this);
 	assert(_gui);
+	_gui->initStaticData();
 	_tim = new TIMInterpreter(this, _system);
 	assert(_tim);
 
@@ -255,6 +255,7 @@
 	}
 
 	_menuDirectlyToLoad = (_menuChoice == 3) ? true : false;
+	_menuDirectlyToLoad &= saveFileLoadable(0);
 
 	if (_menuChoice & 1) {
 		startup();
@@ -764,7 +765,6 @@
 
 	delete [] _gamePlayBuffer; _gamePlayBuffer = 0;
 	delete [] _unkBuf500Bytes; _unkBuf500Bytes = 0;
-	delete [] _screenBuffer; _screenBuffer = 0;
 	delete [] _unkBuf200kByte; _unkBuf200kByte = 0;
 
 	freeSceneShapePtrs();

Modified: scummvm/trunk/engines/kyra/kyra_hof.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_hof.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_hof.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -337,7 +337,6 @@
 	int inputSceneChange(int x, int y, int unk1, int unk2);
 
 	// gfx/animation specific
-	uint8 *_screenBuffer;
 	bool _inventorySaved;
 	void backUpPage0();
 	void restorePage0();

Modified: scummvm/trunk/engines/kyra/kyra_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_mr.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_mr.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -137,41 +137,43 @@
 	_goodConscienceShown = false;
 	_goodConscienceAnim = -1;
 	_goodConsciencePosition = false;
+	_menuDirectlyToLoad = false;
+	_optionsFile = 0;
 }
 
 KyraEngine_MR::~KyraEngine_MR() {
 	delete _screen;
 	delete _soundDigital;
 
-	delete [] _itemBuffer1;
-	delete [] _itemBuffer2;
-	delete [] _scoreFile;
-	delete [] _cCodeFile;
-	delete [] _scenesFile;
-	delete [] _itemFile;
-	delete [] _gamePlayBuffer;
-	delete [] _interface;
-	delete [] _interfaceCommandLine;
-	delete [] _costPalBuffer;
+	delete[] _itemBuffer1;
+	delete[] _itemBuffer2;
+	delete[] _scoreFile;
+	delete[] _cCodeFile;
+	delete[] _scenesFile;
+	delete[] _itemFile;
+	delete[] _gamePlayBuffer;
+	delete[] _interface;
+	delete[] _interfaceCommandLine;
+	delete[] _costPalBuffer;
 
 	for (uint i = 0; i < ARRAYSIZE(_sceneShapes); ++i)
-		delete [] _sceneShapes[i];
+		delete[] _sceneShapes[i];
 
 	for (uint i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
 		delete _sceneAnimMovie[i];
 
-	delete [] _gfxBackUpRect;
-	delete [] _paletteOverlay;
-	delete [] _sceneList;
+	delete[] _gfxBackUpRect;
+	delete[] _paletteOverlay;
+	delete[] _sceneList;
 
 	for (ShapeMap::iterator i = _gameShapes.begin(); i != _gameShapes.end(); ++i) {
-		delete [] i->_value;
+		delete[] i->_value;
 		i->_value = 0;
 	}
 	_gameShapes.clear();
 
-	delete [] _sceneStrings;
-	delete [] _talkObjectList;
+	delete[] _sceneStrings;
+	delete[] _talkObjectList;
 
 	for (Common::Array<const Opcode*>::iterator i = _opcodesDialog.begin(); i != _opcodesDialog.end(); ++i)
 		delete *i;
@@ -179,10 +181,11 @@
 
 	delete _cnvFile;
 	delete _dlgBuffer;
-	delete [] _stringBuffer;
+	delete[] _stringBuffer;
 	delete _invWsa;
-	delete [] _mainButtonData;
+	delete[] _mainButtonData;
 	delete _gui;
+	delete[] _optionsFile;
 }
 
 int KyraEngine_MR::init() {
@@ -203,6 +206,7 @@
 	assert(_text);
 	_gui = new GUI_MR(this);
 	assert(_gui);
+	_gui->initStaticData();
 
 	_screen->loadFont(Screen::FID_6_FNT, "6.FNT");
 	_screen->loadFont(Screen::FID_8_FNT, "8FAT.FNT");
@@ -226,6 +230,14 @@
 	_screen->clearPage(0);
 	_screen->clearPage(2);
 
+	if (_gameToLoad != -1) {
+		uninitMainMenu();
+		_musicSoundChannel = -1;
+		startup();
+		runLoop();
+		running = false;
+	}
+
 	while (running && !_quitFlag) {
 		_screen->_curPage = 0;
 		_screen->clearPage(0);
@@ -250,6 +262,12 @@
 		}
 
 		switch (_menu->handle(3)) {
+		case 2:
+			if (saveFileLoadable(0))
+				_menuDirectlyToLoad = true;
+			else
+				break;
+
 		case 0:
 			uninitMainMenu();
 
@@ -267,12 +285,6 @@
 			_screen->hideMouse();
 			break;
 
-		case 2:
-			//uninitMainMenu();
-			//show load dialog
-			//running = false;
-			break;
-
 		case 3:
 		default:
 			fadeOutMusic(60);
@@ -548,9 +560,8 @@
 		error("Couldn't load C_CODE");
 	if (!loadLanguageFile("SCENES.", _scenesFile))
 		error("Couldn't load SCENES");
-
-	//XXX
-
+	if (!loadLanguageFile("OPTIONS.", _optionsFile))
+		error("Couldn't load OPTIONS");
 	if ((_actorFileSize = loadLanguageFile("_ACTOR.", _actorFile)) == 0)
 		error("couldn't load _ACTOR");
 
@@ -584,7 +595,6 @@
 	resetItemList();
 
 	loadShadowShape();
-	//loadButtonShapes();
 	musicUpdate(0);
 	loadExtrasShapes();
 	musicUpdate(0);
@@ -593,6 +603,7 @@
 	updateMalcolmShapes();
 	musicUpdate(0);
 	initMainButtonList(true);
+	loadButtonShapes();
 	loadInterfaceShapes();
 
 	musicUpdate(0);
@@ -628,13 +639,23 @@
 	assert(_invWsa);
 	_invWsa->open("MOODOMTR.WSA", 1, 0);
 	_invWsaFrame = 6;
+	saveGame(getSavegameFilename(0), (const char*)getTableEntry(_optionsFile, 33));
 	_soundDigital->beginFadeOut(_musicSoundChannel, 60);
 	delayWithTicks(60);
-	enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
+	if (_gameToLoad == -1)
+		enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
+	else
+		loadGame(getSavegameFilename(_gameToLoad));
+
+	if (_menuDirectlyToLoad)
+		(*_mainButtonData[0].buttonCallback)(&_mainButtonData[0]);
+
 	_screen->updateScreen();
 	musicUpdate(0);
 	_screen->showMouse();
-	//XXX
+
+	setNextIdleAnimTimer();
+	setWalkspeed(_configWalkspeed);
 }
 
 void KyraEngine_MR::loadCostPal() {
@@ -926,8 +947,11 @@
 	_runFlag = true;
 	while (_runFlag && !_quitFlag) {
 		if (_deathHandler >= 0) {
-			// TODO: add menu etc.
-			loadGame(getSavegameFilename(999));
+			removeHandItem();
+			delay(5);
+			_drawNoShapeFlag = 0;
+			_gui->optionsButton(0);
+			_deathHandler = -1;
 		}
 		
 		if (_system->getMillis() >= _nextIdleAnim)

Modified: scummvm/trunk/engines/kyra/kyra_mr.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_mr.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_mr.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -76,6 +76,8 @@
 	void setupOpcodeTable();
 
 	// run
+	bool _menuDirectlyToLoad;
+
 	void runLoop();
 	void handleInput(int x, int y);
 	int inputSceneChange(int x, int y, int unk1, int unk2);
@@ -134,6 +136,11 @@
 	int buttonShowScore(Button *button);
 	int buttonJesterStaff(Button *button);
 
+	void loadButtonShapes();
+	int callbackButton1(Button *button);
+	int callbackButton2(Button *button);
+	int callbackButton3(Button *button);
+
 	// -> main menu
 	void initMainMenu();
 	void uninitMainMenu();
@@ -236,6 +243,7 @@
 	uint8 *_cCodeFile;
 	uint8 *_scenesFile;
 	uint8 *_itemFile;
+	uint8 *_optionsFile;
 	uint8 *_actorFile;
 	uint32 _actorFileSize;
 	uint8 *_sceneStrings;
@@ -462,7 +470,6 @@
 
 	// unk
 	uint8 *_costPalBuffer;
-	uint8 *_screenBuffer;
 	uint8 *_paletteOverlay;
 	bool _useActorBuffer;
 

Modified: scummvm/trunk/engines/kyra/kyra_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v2.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_v2.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -65,26 +65,28 @@
 	memset(_hiddenItems, -1, sizeof(_hiddenItems));
 
 	_debugger = 0;
+	_screenBuffer = 0;
 }
 
 KyraEngine_v2::~KyraEngine_v2() {
 	for (ShapeMap::iterator i = _gameShapes.begin(); i != _gameShapes.end(); ++i) {
-		delete [] i->_value;
+		delete[] i->_value;
 		i->_value = 0;
 	}
 	_gameShapes.clear();
 
-	delete [] _itemList;
+	delete[] _itemList;
 
 	_emc->unload(&_sceneScriptData);
 
-	delete [] _animObjects;
+	delete[] _animObjects;
 
 	for (Common::Array<const Opcode*>::iterator i = _opcodesAnimation.begin(); i != _opcodesAnimation.end(); ++i)
 		delete *i;
 	_opcodesAnimation.clear();
 
 	delete _debugger;
+	delete[] _screenBuffer;
 }
 
 int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) {

Modified: scummvm/trunk/engines/kyra/kyra_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v2.h	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/kyra_v2.h	2008-05-05 16:05:56 UTC (rev 31876)
@@ -162,6 +162,8 @@
 
 	virtual int getScale(int x, int y) = 0;
 
+	uint8 *_screenBuffer;
+
 	// Scene
 	struct SceneDesc {
 		char filename1[10];

Modified: scummvm/trunk/engines/kyra/scene_mr.cpp
===================================================================
--- scummvm/trunk/engines/kyra/scene_mr.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/scene_mr.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -634,7 +634,7 @@
 
 	updateCharPal(0);
 
-	if (1/*!_menuDirectlyToLoad*/) {
+	if (!_menuDirectlyToLoad) {
 		_emc->start(&_sceneScriptState, 3);
 		_sceneScriptState.regs[5] = unk1;
 

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -1518,6 +1518,10 @@
 	-2, -2, 0, 2, 2, 2, 0, -2
 };
 
+const int GUI_v2::_sliderBarsPosition[] = {
+	0x92, 0x1F, 0x92, 0x30, 0x92, 0x41, 0x92, 0x52
+};
+
 // kyra 2 static res
 
 const uint8 KyraEngine_HoF::_seqTextColorPresets[] = { 0x01, 0x01, 0x00, 0x3f, 0x3f, 0x3f };
@@ -1819,10 +1823,6 @@
 	0x016, 0x00A, 0x00D, 0x000, 0x000, 0x000, 0x000, 0x000	// Death Menu String IDs
 };
 
-const int GUI_HoF::_sliderBarsPosition[] = {
-	0x92, 0x1F, 0x92, 0x30, 0x92, 0x41, 0x92, 0x52
-};
-
 const uint16 KyraEngine_HoF::_itemMagicTable[] = {
 	0x0D,  0x0A,  0x0B,    0,
 	0x0D,  0x0B,  0x0A,    0,
@@ -2446,6 +2446,7 @@
 		assert(_mainButtonData);
 
 		GUI_V2_BUTTON(_mainButtonData[0], 1, 0, 0, 4, 4, 4, 0x4487, 0,   5, 162, 50, 25, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+		_mainButtonData[0].buttonCallback = BUTTON_FUNCTOR(GUI_MR, _gui, &GUI_MR::optionsButton);
 		GUI_V2_BUTTON(_mainButtonData[1], 2, 0, 0, 1, 1, 1, 0x4487, 0, 245, 156, 69, 33, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
 		_mainButtonData[1].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::buttonMoodChange);
 		GUI_V2_BUTTON(_mainButtonData[2], 3, 0, 0, 1, 1, 1, 0x4487, 0, 215, 191, 24,  9, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
@@ -2478,5 +2479,111 @@
 	}
 }
 
+void GUI_MR::initStaticData() {
+	GUI_V2_BUTTON(_scrollUpButton, 22, 0, 0, 4, 4, 4, 0x4487, 0, 0, 0, 0x18, 0x0F, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+	GUI_V2_BUTTON(_scrollDownButton, 23, 0, 0, 4, 4, 4, 0x4487, 0, 0, 0, 0x18, 0x0F, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+
+	for (int i = 0; i < 4; ++i) {
+		GUI_V2_BUTTON(_sliderButtons[0][i], 0x18+i, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0x0A, 0x0E, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+	}
+	for (int i = 0; i < 4; ++i) {
+		GUI_V2_BUTTON(_sliderButtons[1][i], 0x1C+i, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0x0A, 0x0E, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+	}
+	for (int i = 0; i < 4; ++i) {
+		GUI_V2_BUTTON(_sliderButtons[2][i], 0x20+i, 0, 0, 0, 0, 0, 0x2200, 0, 0, 0, 0x6E, 0x0E, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+	}
+
+	for (uint i = 0; i < ARRAYSIZE(_menuButtons); ++i) {
+		GUI_V2_BUTTON(_menuButtons[i], 0x0F+i, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+	}
+
+	Button::Callback clickLoadSlotFunctor = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::clickLoadSlot);
+	Button::Callback clickSaveSlotFunctor = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::clickSaveSlot);
+	Button::Callback clickLoadMenuFunctor = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::loadMenu);
+	Button::Callback clickQuitOptionsFunctor = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::quitOptionsMenu);
+
+	GUI_V2_MENU(_mainMenu, -1, -1, 256, 172, 0xD0, 0xD1, 0xCF, 1, 0xBD, -1, 8, 0, 7, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_mainMenu.item[0], 1, 2, -1, 30, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_mainMenu.item[0].callback = clickLoadMenuFunctor;
+	GUI_V2_MENU_ITEM(_mainMenu.item[1], 1, 3, -1, 47, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_mainMenu.item[1].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::saveMenu);
+	GUI_V2_MENU_ITEM(_mainMenu.item[2], 1, 35, -1, 64, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_mainMenu.item[2].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::deleteMenu);
+	GUI_V2_MENU_ITEM(_mainMenu.item[3], 1, 4, -1, 81, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_mainMenu.item[4], 1, 37, -1, 98, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_mainMenu.item[5], 1, 5, -1, 115, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_mainMenu.item[5].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::quitGame);
+	GUI_V2_MENU_ITEM(_mainMenu.item[6], 1, 6, -1, 144, 220, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_mainMenu.item[6].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::resumeGame);
+
+	GUI_V2_MENU(_audioOptions, -1, -1, 288, 136, 0xD0, 0xD1, 0xCF, 37, 0xBD, -1, 8, 4, 5, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_audioOptions.item[0], 0, 0, 160, 30, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 23, 8, 32, 0x0000);
+	GUI_V2_MENU_ITEM(_audioOptions.item[1], 0, 0, 160, 47, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 24, 8, 49, 0x0000);
+	GUI_V2_MENU_ITEM(_audioOptions.item[2], 0, 0, 160, 64, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 39, 8, 66, 0x0000);
+	GUI_V2_MENU_ITEM(_audioOptions.item[3], 1, 0, 152, 81, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 47, 8, 83, 0x0000);
+	GUI_V2_MENU_ITEM(_audioOptions.item[4], 1, 16, -1, 110, 92, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_audioOptions.item[4].callback = clickQuitOptionsFunctor;
+	for (int i = 5; i < 7; ++i)
+		_audioOptions.item[i].enabled = false;
+
+	GUI_V2_MENU(_gameOptions, -1, -1, 288, 154, 0xD0, 0xD1, 0xCF, 7, 0xBD, -1, 8, 0, 6, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_gameOptions.item[0], 1, 0, 160, 30, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 21, 8, 32, 0x0000);
+	GUI_V2_MENU_ITEM(_gameOptions.item[1], 1, 0, 160, 47, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 26, 8, 49, 0x0000);
+	GUI_V2_MENU_ITEM(_gameOptions.item[2], 1, 0, 160, 64, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 40, 8, 66, 0x0000);
+	GUI_V2_MENU_ITEM(_gameOptions.item[3], 1, 0, 160, 81, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 46, 8, 83, 0x0000);
+	GUI_V2_MENU_ITEM(_gameOptions.item[4], 1, 0, 160, 98, 116, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 22, 8, 100, 0x0000);
+	GUI_V2_MENU_ITEM(_gameOptions.item[5], 1, 16, -1, 127, 125, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_gameOptions.item[5].callback = clickQuitOptionsFunctor;
+	_gameOptions.item[6].enabled = false;
+
+	GUI_V2_MENU(_choiceMenu, -1, -1, 320, 56, 0xD0, 0xD1, 0xCF, 0, 0xBA, -1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_choiceMenu.item[0], 1, 20, 24, 30, 72, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_choiceMenu.item[0].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::choiceYes);
+	GUI_V2_MENU_ITEM(_choiceMenu.item[1], 1, 19, 216, 30, 72, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_choiceMenu.item[1].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::choiceNo);
+	for (int i = 2; i < 7; ++i)
+		_choiceMenu.item[i].enabled = false;
+
+	GUI_V2_MENU(_loadMenu, -1, -1, 288, 160, 0xD0, 0xD1, 0xCF, 8, 0xBD, -1, 8, 0, 6, 132, 22, 132, 124);
+	GUI_V2_MENU_ITEM(_loadMenu.item[0], 1, 41, -1, 39, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_loadMenu.item[1], 1, 42, -1, 56, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_loadMenu.item[2], 1, 43, -1, 73, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_loadMenu.item[3], 1, 44, -1, 90, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_loadMenu.item[4], 1, 45, -1, 107, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	for (int i = 0; i <= 4; ++i)
+		_loadMenu.item[i].callback = clickLoadSlotFunctor;
+	GUI_V2_MENU_ITEM(_loadMenu.item[5], 1, 11, 184, 134, 88, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_loadMenu.item[5].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::cancelLoadMenu);
+	_loadMenu.item[6].enabled = false;
+
+	GUI_V2_MENU(_saveMenu, -1, -1, 288, 160, 0xD0, 0xD1, 0xCF, 9, 0xBD, -1, 8, 0, 6, 132, 22, 132, 124);
+	GUI_V2_MENU_ITEM(_saveMenu.item[0], 1, 41, -1, 39, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_saveMenu.item[1], 1, 42, -1, 56, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_saveMenu.item[2], 1, 43, -1, 73, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_saveMenu.item[3], 1, 44, -1, 90, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	GUI_V2_MENU_ITEM(_saveMenu.item[4], 1, 45, -1, 107, 256, 15, 0xFA, 0xFF, 5, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	for (int i = 0; i <= 4; ++i)
+		_saveMenu.item[i].callback = clickSaveSlotFunctor;
+	GUI_V2_MENU_ITEM(_saveMenu.item[5], 1, 11, 184, 134, 88, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_saveMenu.item[5].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::cancelSaveMenu);
+	_saveMenu.item[6].enabled = false;
+
+	GUI_V2_MENU(_savenameMenu, -1, -1, 320, 67, 0xD0, 0xD1, 0xCF, 12, 0xBD, -1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_savenameMenu.item[0], 1, 13, 24, 44, 88, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_savenameMenu.item[0].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::finishSavename);
+	GUI_V2_MENU_ITEM(_savenameMenu.item[1], 1, 11, 208, 44, 88, 15, 0xFA, 0xFF, -1, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_savenameMenu.item[1].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::cancelSavename);
+	for (int i = 2; i < 7; ++i)
+		_savenameMenu.item[i].enabled = false;
+
+	GUI_V2_MENU(_deathMenu, -1, -1, 208, 76, 0xD0, 0xD1, 0xCF, 14, 0xBD, -1, 8, 0, 2, -1, -1, -1, -1);
+	GUI_V2_MENU_ITEM(_deathMenu.item[0], 1, 2, -1, 30, 180, 15, 0xFA, 0xFF, 8, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_deathMenu.item[0].callback = clickLoadMenuFunctor;
+	GUI_V2_MENU_ITEM(_deathMenu.item[1], 1, 38, -1, 47, 180, 15, 0xFA, 0xFF, 8, 0xD0, 0xD1, 0xCF, -1, 0, 0, 0, 0x0000);
+	_deathMenu.item[1].callback = BUTTON_FUNCTOR(GUI_MR, this, &GUI_MR::loadSecondChance);
+	for (int i = 2; i < 7; ++i)
+		_deathMenu.item[i].enabled = false;
+}
+
 } // End of namespace Kyra
 

Modified: scummvm/trunk/engines/kyra/timer_v1.cpp
===================================================================
--- scummvm/trunk/engines/kyra/timer_v1.cpp	2008-05-05 13:11:34 UTC (rev 31875)
+++ scummvm/trunk/engines/kyra/timer_v1.cpp	2008-05-05 16:05:56 UTC (rev 31876)
@@ -170,7 +170,7 @@
 
 void KyraEngine_v1::setWalkspeed(uint8 newSpeed) {
 	debugC(9, kDebugLevelMain | kDebugLevelTimer, "KyraEngine_v1::setWalkspeed(%i)", newSpeed);
-	static const uint8 speeds[] = {11, 9, 6, 5, 3};
+	static const uint8 speeds[] = { 11, 9, 6, 5, 3 };
 
 	assert(newSpeed < ARRAYSIZE(speeds));
 	_timer->setDelay(5, speeds[newSpeed]);


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