diff options
| author | Johannes Schickel | 2008-05-05 16:05:56 +0000 | 
|---|---|---|
| committer | Johannes Schickel | 2008-05-05 16:05:56 +0000 | 
| commit | 2afff044689a9d25c11d46b56a42d5948b95da1a (patch) | |
| tree | 5fbebdea8b2c52858d4542a61e1b79d2ca55270e | |
| parent | 4eb9abe99f27d867f3d549bb15c8a4d71af7df3c (diff) | |
| download | scummvm-rg350-2afff044689a9d25c11d46b56a42d5948b95da1a.tar.gz scummvm-rg350-2afff044689a9d25c11d46b56a42d5948b95da1a.tar.bz2 scummvm-rg350-2afff044689a9d25c11d46b56a42d5948b95da1a.zip | |
- Added support for Kyra3 GUI (audio and game options not working yet)
- Added support for loading directly from command line for Kyra3
svn-id: r31876
| -rw-r--r-- | engines/kyra/gui.cpp | 2 | ||||
| -rw-r--r-- | engines/kyra/gui.h | 4 | ||||
| -rw-r--r-- | engines/kyra/gui_hof.cpp | 602 | ||||
| -rw-r--r-- | engines/kyra/gui_hof.h | 101 | ||||
| -rw-r--r-- | engines/kyra/gui_mr.cpp | 331 | ||||
| -rw-r--r-- | engines/kyra/gui_mr.h | 28 | ||||
| -rw-r--r-- | engines/kyra/gui_v2.cpp | 473 | ||||
| -rw-r--r-- | engines/kyra/gui_v2.h | 102 | ||||
| -rw-r--r-- | engines/kyra/kyra_hof.cpp | 4 | ||||
| -rw-r--r-- | engines/kyra/kyra_hof.h | 1 | ||||
| -rw-r--r-- | engines/kyra/kyra_mr.cpp | 90 | ||||
| -rw-r--r-- | engines/kyra/kyra_mr.h | 9 | ||||
| -rw-r--r-- | engines/kyra/kyra_v2.cpp | 8 | ||||
| -rw-r--r-- | engines/kyra/kyra_v2.h | 2 | ||||
| -rw-r--r-- | engines/kyra/scene_mr.cpp | 2 | ||||
| -rw-r--r-- | engines/kyra/staticres.cpp | 115 | ||||
| -rw-r--r-- | engines/kyra/timer_v1.cpp | 2 | 
17 files changed, 1194 insertions, 682 deletions
| diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp index 43137ac866..d2e02671c9 100644 --- a/engines/kyra/gui.cpp +++ b/engines/kyra/gui.cpp @@ -314,6 +314,8 @@ void GUI::updateSaveList() {  		s1 -= '0';  		s2 -= '0';  		s3 -= '0'; +		if (s1 == 9 && s2 == 9 && s3 == 9) +			continue;  		_saveSlots.push_back(s1*100+s2*10+s3);  	} diff --git a/engines/kyra/gui.h b/engines/kyra/gui.h index dfbca22441..a04ac20de3 100644 --- a/engines/kyra/gui.h +++ b/engines/kyra/gui.h @@ -142,8 +142,8 @@ public:  	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); diff --git a/engines/kyra/gui_hof.cpp b/engines/kyra/gui_hof.cpp index 9916104a30..ce00a418f6 100644 --- a/engines/kyra/gui_hof.cpp +++ b/engines/kyra/gui_hof.cpp @@ -81,13 +81,6 @@ void KyraEngine_HoF::setupLangButtonShapes() {  }  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 @@ const char *GUI_HoF::getMenuItemLabel(const MenuItem &menuItem) {  	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 @@ int KyraEngine_HoF::cauldronButton(Button *button) {  #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 @@ int GUI_HoF::optionsButton(Button *button) {  #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 @@ void GUI_HoF::restorePalette() {  	_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,81 +817,27 @@ void GUI_HoF::resetState(int item) {  	_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; -	} - -	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; -		} -	} - -	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); -		} -	} -} - -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; -} +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 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); +	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;  	} -	return 0; +	position = MAX(2, position); +	position = MIN(97, position); +	_screen->drawShape(0, shape, x+position, y, 0, 0);  }  #pragma mark - @@ -953,9 +860,54 @@ int GUI_HoF::quitGame(Button *caller) {  	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 @@ int GUI_HoF::gameOptionsTalkie(Button *caller) {  	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 @@ void GUI_HoF::setupOptionsButtons() {  	}  } -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 @@ int GUI_HoF::sliderHandler(Button *caller) {  	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 @@ int GUI_HoF::loadMenu(Button *caller) {  	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 diff --git a/engines/kyra/gui_hof.h b/engines/kyra/gui_hof.h index f48f6c88c9..6abaff3797 100644 --- a/engines/kyra/gui_hof.h +++ b/engines/kyra/gui_hof.h @@ -38,74 +38,36 @@ friend class KyraEngine_HoF;  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 @@ private:  	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[];  }; diff --git a/engines/kyra/gui_mr.cpp b/engines/kyra/gui_mr.cpp index 7ca6bbae7a..c894c3ed74 100644 --- a/engines/kyra/gui_mr.cpp +++ b/engines/kyra/gui_mr.cpp @@ -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 @@ void GUI_MR::flagButtonDisable(Button *button) {  	}  } +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 diff --git a/engines/kyra/gui_mr.h b/engines/kyra/gui_mr.h index 5eeb829703..36c250d32b 100644 --- a/engines/kyra/gui_mr.h +++ b/engines/kyra/gui_mr.h @@ -38,24 +38,34 @@ friend class KyraEngine_MR;  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;  }; diff --git a/engines/kyra/gui_v2.cpp b/engines/kyra/gui_v2.cpp index e449c6b22c..dd6a774ca0 100644 --- a/engines/kyra/gui_v2.cpp +++ b/engines/kyra/gui_v2.cpp @@ -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 @@ void GUI_v2::updateButton(Button *button) {  	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 diff --git a/engines/kyra/gui_v2.h b/engines/kyra/gui_v2.h index 3fdc64e34f..a007ce84d8 100644 --- a/engines/kyra/gui_v2.h +++ b/engines/kyra/gui_v2.h @@ -98,6 +98,8 @@ class GUI_v2 : public GUI {  public:  	GUI_v2(KyraEngine_v2 *vm); +	virtual void initStaticData() = 0; +  	Button *addButtonToList(Button *list, Button *newButton);  	void processButton(Button *button); @@ -112,6 +114,106 @@ protected:  	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 diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp index 64ec7e2905..fff96f456c 100644 --- a/engines/kyra/kyra_hof.cpp +++ b/engines/kyra/kyra_hof.cpp @@ -105,7 +105,6 @@ KyraEngine_HoF::KyraEngine_HoF(OSystem *system, const GameFlags &flags) : KyraEn  	_gamePlayBuffer = 0;  	_unkBuf500Bytes = 0; -	_screenBuffer = 0;  	_inventorySaved = false;  	_unkBuf200kByte = 0;  	memset(&_sceneShapeTable, 0, sizeof(_sceneShapeTable)); @@ -189,6 +188,7 @@ int KyraEngine_HoF::init() {  	assert(_text);  	_gui = new GUI_HoF(this);  	assert(_gui); +	_gui->initStaticData();  	_tim = new TIMInterpreter(this, _system);  	assert(_tim); @@ -255,6 +255,7 @@ int KyraEngine_HoF::go() {  	}  	_menuDirectlyToLoad = (_menuChoice == 3) ? true : false; +	_menuDirectlyToLoad &= saveFileLoadable(0);  	if (_menuChoice & 1) {  		startup(); @@ -764,7 +765,6 @@ void KyraEngine_HoF::cleanup() {  	delete [] _gamePlayBuffer; _gamePlayBuffer = 0;  	delete [] _unkBuf500Bytes; _unkBuf500Bytes = 0; -	delete [] _screenBuffer; _screenBuffer = 0;  	delete [] _unkBuf200kByte; _unkBuf200kByte = 0;  	freeSceneShapePtrs(); diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h index b24ea02262..1e6c23331e 100644 --- a/engines/kyra/kyra_hof.h +++ b/engines/kyra/kyra_hof.h @@ -337,7 +337,6 @@ protected:  	int inputSceneChange(int x, int y, int unk1, int unk2);  	// gfx/animation specific -	uint8 *_screenBuffer;  	bool _inventorySaved;  	void backUpPage0();  	void restorePage0(); diff --git a/engines/kyra/kyra_mr.cpp b/engines/kyra/kyra_mr.cpp index fbd5ed5492..ab9c558abb 100644 --- a/engines/kyra/kyra_mr.cpp +++ b/engines/kyra/kyra_mr.cpp @@ -137,41 +137,43 @@ KyraEngine_MR::KyraEngine_MR(OSystem *system, const GameFlags &flags) : KyraEngi  	_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 @@ KyraEngine_MR::~KyraEngine_MR() {  	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 @@ int KyraEngine_MR::init() {  	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 @@ int KyraEngine_MR::go() {  	_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 @@ int KyraEngine_MR::go() {  		}  		switch (_menu->handle(3)) { +		case 2: +			if (saveFileLoadable(0)) +				_menuDirectlyToLoad = true; +			else +				break; +  		case 0:  			uninitMainMenu(); @@ -267,12 +285,6 @@ int KyraEngine_MR::go() {  			_screen->hideMouse();  			break; -		case 2: -			//uninitMainMenu(); -			//show load dialog -			//running = false; -			break; -  		case 3:  		default:  			fadeOutMusic(60); @@ -548,9 +560,8 @@ void KyraEngine_MR::startup() {  		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 @@ void KyraEngine_MR::startup() {  	resetItemList();  	loadShadowShape(); -	//loadButtonShapes();  	musicUpdate(0);  	loadExtrasShapes();  	musicUpdate(0); @@ -593,6 +603,7 @@ void KyraEngine_MR::startup() {  	updateMalcolmShapes();  	musicUpdate(0);  	initMainButtonList(true); +	loadButtonShapes();  	loadInterfaceShapes();  	musicUpdate(0); @@ -628,13 +639,23 @@ void KyraEngine_MR::startup() {  	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 @@ void KyraEngine_MR::runLoop() {  	_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) diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h index 4d83eee7bb..359228ef7a 100644 --- a/engines/kyra/kyra_mr.h +++ b/engines/kyra/kyra_mr.h @@ -76,6 +76,8 @@ protected:  	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 @@ private:  	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 @@ private:  	uint8 *_cCodeFile;  	uint8 *_scenesFile;  	uint8 *_itemFile; +	uint8 *_optionsFile;  	uint8 *_actorFile;  	uint32 _actorFileSize;  	uint8 *_sceneStrings; @@ -462,7 +470,6 @@ private:  	// unk  	uint8 *_costPalBuffer; -	uint8 *_screenBuffer;  	uint8 *_paletteOverlay;  	bool _useActorBuffer; diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index 6e58d8592a..e981522662 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -65,26 +65,28 @@ KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags, const Engi  	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) { diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index 7134d62872..7636f92e7c 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -162,6 +162,8 @@ protected:  	virtual int getScale(int x, int y) = 0; +	uint8 *_screenBuffer; +  	// Scene  	struct SceneDesc {  		char filename1[10]; diff --git a/engines/kyra/scene_mr.cpp b/engines/kyra/scene_mr.cpp index 17fbdac87b..27f4fabb49 100644 --- a/engines/kyra/scene_mr.cpp +++ b/engines/kyra/scene_mr.cpp @@ -634,7 +634,7 @@ void KyraEngine_MR::initSceneScreen(int unk1) {  	updateCharPal(0); -	if (1/*!_menuDirectlyToLoad*/) { +	if (!_menuDirectlyToLoad) {  		_emc->start(&_sceneScriptState, 3);  		_sceneScriptState.regs[5] = unk1; diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index a6b2588b7b..83ae17ba1c 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -1518,6 +1518,10 @@ const int8 KyraEngine_v2::_updateCharPosYTable[] = {  	-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 @@ const uint16 GUI_HoF::_menuStringsOther[] = {  	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 @@ void KyraEngine_MR::initMainButtonList(bool disable) {  		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 KyraEngine_MR::initMainButtonList(bool disable) {  	}  } +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 diff --git a/engines/kyra/timer_v1.cpp b/engines/kyra/timer_v1.cpp index f2a31da554..f5e7c52ba1 100644 --- a/engines/kyra/timer_v1.cpp +++ b/engines/kyra/timer_v1.cpp @@ -170,7 +170,7 @@ void KyraEngine_v1::timerRedrawAmulet(int timerNum) {  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]); | 
