diff options
| -rw-r--r-- | engines/kyra/gui.cpp | 48 | ||||
| -rw-r--r-- | engines/kyra/gui.h | 4 | ||||
| -rw-r--r-- | engines/kyra/gui_lok.cpp | 95 | ||||
| -rw-r--r-- | engines/kyra/gui_lok.h | 6 | ||||
| -rw-r--r-- | engines/kyra/gui_v2.cpp | 61 | ||||
| -rw-r--r-- | engines/kyra/gui_v2.h | 4 | ||||
| -rw-r--r-- | engines/kyra/kyra_hof.h | 2 | ||||
| -rw-r--r-- | engines/kyra/kyra_lok.cpp | 171 | ||||
| -rw-r--r-- | engines/kyra/kyra_lok.h | 16 | ||||
| -rw-r--r-- | engines/kyra/kyra_mr.h | 2 | ||||
| -rw-r--r-- | engines/kyra/kyra_v1.cpp | 142 | ||||
| -rw-r--r-- | engines/kyra/kyra_v1.h | 28 | ||||
| -rw-r--r-- | engines/kyra/kyra_v2.cpp | 135 | ||||
| -rw-r--r-- | engines/kyra/kyra_v2.h | 22 | ||||
| -rw-r--r-- | engines/kyra/saveload_lok.cpp | 3 | ||||
| -rw-r--r-- | engines/kyra/scene_lok.cpp | 20 | ||||
| -rw-r--r-- | engines/kyra/script_lok.cpp | 59 | ||||
| -rw-r--r-- | engines/kyra/sequences_lok.cpp | 9 | ||||
| -rw-r--r-- | engines/kyra/sound_lok.cpp | 2 | ||||
| -rw-r--r-- | engines/kyra/text_lok.cpp | 28 | 
20 files changed, 365 insertions, 492 deletions
| diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp index 06d7f1783a..b316d727bd 100644 --- a/engines/kyra/gui.cpp +++ b/engines/kyra/gui.cpp @@ -335,6 +335,54 @@ int GUI::getNextSavegameSlot() {  	return 0;  } +void GUI::checkTextfieldInput() { +	Common::Event event; + +	uint32 now = _vm->_system->getMillis(); + +	bool running = true; +	int keys = 0; +	while (_vm->_eventMan->pollEvent(event) && running) { +		switch (event.type) { +		case Common::EVENT_KEYDOWN: +			if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL) +				_vm->quitGame(); +			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(); +			_lastScreenUpdate = now; +			} break; + +		default: +			break; +		} +	} + +	if (now - _lastScreenUpdate > 50) { +		_vm->_system->updateScreen(); +		_lastScreenUpdate = now; +	} + +	processButtonList(_menuButtonList, keys | 0x8000, 0); +	_vm->_system->delayMillis(3); +} +  #pragma mark -  MainMenu::MainMenu(KyraEngine_v1 *vm) : _vm(vm), _screen(0) { diff --git a/engines/kyra/gui.h b/engines/kyra/gui.h index 7db8f52f16..8115d91e7a 100644 --- a/engines/kyra/gui.h +++ b/engines/kyra/gui.h @@ -194,6 +194,10 @@ protected:  	Common::Array<int> _saveSlots;  	void updateSaveList();  	int getNextSavegameSlot(); + +	uint32 _lastScreenUpdate; +	Common::KeyState _keyPressed; +	void checkTextfieldInput();  };  class Movie; diff --git a/engines/kyra/gui_lok.cpp b/engines/kyra/gui_lok.cpp index a778f98ed6..5ba805044f 100644 --- a/engines/kyra/gui_lok.cpp +++ b/engines/kyra/gui_lok.cpp @@ -191,6 +191,7 @@ int KyraEngine_LoK::buttonAmuletCallback(Button *caller) {  GUI_LoK::GUI_LoK(KyraEngine_LoK *vm, Screen_LoK *screen) : GUI(vm), _vm(vm), _screen(screen) {  	_lastScreenUpdate = 0;  	_menu = 0; +	_pressFlag = false;  	initStaticResource();  	_scrollUpFunctor = BUTTON_FUNCTOR(GUI_LoK, this, &GUI_LoK::scrollUp);  	_scrollDownFunctor = BUTTON_FUNCTOR(GUI_LoK, this, &GUI_LoK::scrollDown); @@ -213,6 +214,12 @@ void GUI_LoK::createScreenThumbnail(Graphics::Surface &dst) {  }  int GUI_LoK::processButtonList(Button *list, uint16 inputFlag, int8 mouseWheel) { +	if ((inputFlag & 0xFF) == 199) +		_pressFlag = true; +	else if ((inputFlag & 0xFF) == 200) +		_pressFlag = false; + +	int returnValue = 0;  	while (list) {  		if (list->flags & 8) {  			list = list->nextButton; @@ -220,51 +227,47 @@ int GUI_LoK::processButtonList(Button *list, uint16 inputFlag, int8 mouseWheel)  		}  		if (mouseWheel && list->mouseWheel == mouseWheel && list->buttonCallback) { -			if ((*list->buttonCallback.get())(list)) { +			if ((*list->buttonCallback.get())(list))  				break; -			}  		}  		int x = list->x;  		int y = list->y;  		assert(_screen->getScreenDim(list->dimTableIndex) != 0); -		if (x < 0) { + +		if (x < 0)  			x += _screen->getScreenDim(list->dimTableIndex)->w << 3; -		}  		x += _screen->getScreenDim(list->dimTableIndex)->sx << 3; -		if (y < 0) { +		if (y < 0)  			y += _screen->getScreenDim(list->dimTableIndex)->h; -		}  		y += _screen->getScreenDim(list->dimTableIndex)->sy; -		Common::Point mouse = _vm->getMousePos(); -		if (mouse.x >= x && mouse.y >= y && x + list->width >= mouse.x && y + list->height >= mouse.y) { +		if (_vm->_mouseX >= x && _vm->_mouseY >= y && x + list->width >= _vm->_mouseX && y + list->height >= _vm->_mouseY) {  			int processMouseClick = 0;  			if (list->flags & 0x400) { -				if (_vm->_mousePressFlag) { +				if ((inputFlag & 0xFF) == 199 || _pressFlag) {  					if (!(list->flags2 & 1)) {  						list->flags2 |= 1;  						list->flags2 |= 4;  						processButton(list);  						_screen->updateScreen(); +						inputFlag = 0;  					} -				} else { +				} else if ((inputFlag & 0xFF) == 200) {  					if (list->flags2 & 1) {  						list->flags2 &= 0xFFFE;  						processButton(list);  						processMouseClick = 1; +						inputFlag = 0;  					}  				} -			} else if (_vm->_mousePressFlag) { -				processMouseClick = 1;  			}  			if (processMouseClick) {  				if (list->buttonCallback) { -					if ((*list->buttonCallback.get())(list)) { +					if ((*list->buttonCallback.get())(list))  						break; -					}  				}  			}  		} else { @@ -272,18 +275,21 @@ int GUI_LoK::processButtonList(Button *list, uint16 inputFlag, int8 mouseWheel)  				list->flags2 &= 0xFFFE;  				processButton(list);  			} +			  			if (list->flags2 & 4) {  				list->flags2 &= 0xFFFB;  				processButton(list);  				_screen->updateScreen();  			} -			list = list->nextButton; -			continue;  		}  		list = list->nextButton;  	} -	return 0; + +	if (!returnValue) +		returnValue = inputFlag & 0xFF; + +	return returnValue;  }  void GUI_LoK::processButton(Button *button) { @@ -460,7 +466,6 @@ int GUI_LoK::buttonMenuCallback(Button *caller) {  	_menuRestoreScreen = true;  	_keyPressed.reset(); -	_vm->_mousePressFlag = false;  	_toplevelMenu = 0;  	if (_vm->_menuDirectlyToLoad) { @@ -474,9 +479,7 @@ int GUI_LoK::buttonMenuCallback(Button *caller) {  	}  	while (_displayMenu && !_vm->shouldQuit()) { -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[_toplevelMenu], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, 0); +		processHighlights(_menu[_toplevelMenu], _vm->_mouseX, _vm->_mouseY);  		getInput();  	} @@ -495,32 +498,8 @@ void GUI_LoK::getInput() {  	Common::Event event;  	uint32 now = _vm->_system->getMillis(); -	_mouseWheel = 0; -	while (_vm->_eventMan->pollEvent(event)) { -		switch (event.type) { -		case Common::EVENT_LBUTTONDOWN: -			_vm->_mousePressFlag = true; -			break; -		case Common::EVENT_LBUTTONUP: -			_vm->_mousePressFlag = false; -			break; -		case Common::EVENT_MOUSEMOVE: -			_vm->_system->updateScreen(); -			_lastScreenUpdate = now; -			break; -		case Common::EVENT_WHEELUP: -			_mouseWheel = -1; -			break; -		case Common::EVENT_WHEELDOWN: -			_mouseWheel = 1; -			break; -		case Common::EVENT_KEYDOWN: -			_keyPressed = event.kbd; -			break; -		default: -			break; -		} -	} +	_vm->checkInput(_menuButtonList); +	_vm->removeInputTop();  	if (now - _lastScreenUpdate > 50) {  		_vm->_system->updateScreen(); @@ -594,10 +573,8 @@ int GUI_LoK::saveGameMenu(Button *button) {  	_cancelSubMenu = false;  	while (_displaySubMenu && !_vm->shouldQuit()) { +		processHighlights(_menu[2], _vm->_mouseX, _vm->_mouseY);  		getInput(); -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[2], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, _mouseWheel);  	}  	_screen->loadPageFromDisk("SEENPAGE.TMP", 0); @@ -643,10 +620,8 @@ int GUI_LoK::loadGameMenu(Button *button) {  	_vm->_gameToLoad = -1;  	while (_displaySubMenu && !_vm->shouldQuit()) { +		processHighlights(_menu[2], _vm->_mouseX, _vm->_mouseY);  		getInput(); -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[2], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, _mouseWheel);  	}  	_screen->loadPageFromDisk("SEENPAGE.TMP", 0); @@ -731,11 +706,9 @@ int GUI_LoK::saveGame(Button *button) {  	redrawTextfield();  	while (_displaySubMenu && !_vm->shouldQuit()) { -		getInput(); +		checkTextfieldInput();  		updateSavegameString(); -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[3], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, 0); +		processHighlights(_menu[3], _vm->_mouseX, _vm->_mouseY);  	}  	if (_cancelSubMenu) { @@ -811,10 +784,8 @@ bool GUI_LoK::quitConfirm(const char *str) {  	_cancelSubMenu = true;  	while (_displaySubMenu && !_vm->shouldQuit()) { +		processHighlights(_menu[1], _vm->_mouseX, _vm->_mouseY);  		getInput(); -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[1], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, 0);  	}  	_screen->loadPageFromDisk("SEENPAGE.TMP", 0); @@ -877,10 +848,8 @@ int GUI_LoK::gameControlsMenu(Button *button) {  	_cancelSubMenu = false;  	while (_displaySubMenu && !_vm->shouldQuit()) { +		processHighlights(_menu[5], _vm->_mouseX, _vm->_mouseY);  		getInput(); -		Common::Point mouse = _vm->getMousePos(); -		processHighlights(_menu[5], mouse.x, mouse.y); -		processButtonList(_menuButtonList, 0, 0);  	}  	_screen->loadPageFromDisk("SEENPAGE.TMP", 0); diff --git a/engines/kyra/gui_lok.h b/engines/kyra/gui_lok.h index 0ce718d7a7..9eb433bf44 100644 --- a/engines/kyra/gui_lok.h +++ b/engines/kyra/gui_lok.h @@ -117,6 +117,8 @@ private:  	Menu *_menu; +	bool _pressFlag; +  	void setGUILabels();  	void setupSavegames(Menu &menu, int num); @@ -159,15 +161,11 @@ private:  	KyraEngine_LoK *_vm;  	Screen_LoK *_screen; -	uint32 _lastScreenUpdate; -  	bool _menuRestoreScreen;  	uint8 _toplevelMenu;  	int _savegameOffset;  	char _savegameName[35];  	const char *_specialSavegameString; -	Common::KeyState _keyPressed; -	int8 _mouseWheel;  	Button::Callback _scrollUpFunctor;  	Button::Callback _scrollDownFunctor; diff --git a/engines/kyra/gui_v2.cpp b/engines/kyra/gui_v2.cpp index 4859b813e7..500d816cb9 100644 --- a/engines/kyra/gui_v2.cpp +++ b/engines/kyra/gui_v2.cpp @@ -36,6 +36,7 @@ GUI_v2::GUI_v2(KyraEngine_v2 *vm) : GUI(vm), _vm(vm), _screen(vm->screen_v2()) {  	_backUpButtonList = _unknownButtonList = 0;  	_buttonListChanged = false;  	_lastScreenUpdate = 0; +	_flagsModifier = 0;  	_currentMenu = 0;  	_isDeathMenu = false; @@ -142,8 +143,6 @@ void GUI_v2::processButton(Button *button) {  }  int GUI_v2::processButtonList(Button *buttonList, uint16 inputFlag, int8 mouseWheel) { -	static uint16 flagsModifier = 0; -  	if (!buttonList)  		return inputFlag & 0x7FFF; @@ -179,10 +178,10 @@ int GUI_v2::processButtonList(Button *buttonList, uint16 inputFlag, int8 mouseWh  		flags |= temp; -		flagsModifier &= ~((temp & 0x4400) >> 1); -		flagsModifier |= (temp & 0x1100) * 2; -		flags |= flagsModifier; -		flags |= (flagsModifier << 2) ^ 0x8800; +		_flagsModifier &= ~((temp & 0x4400) >> 1); +		_flagsModifier |= (temp & 0x1100) * 2; +		flags |= _flagsModifier; +		flags |= (_flagsModifier << 2) ^ 0x8800;  	}  	buttonList = _backUpButtonList; @@ -750,8 +749,8 @@ const char *GUI_v2::nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8  	_keyPressed.reset();  	_cancelNameInput = _finishNameInput = false;  	while (running && !_vm->shouldQuit()) { -		processHighlights(_savenameMenu, _vm->_mouseX, _vm->_mouseY);  		checkTextfieldInput(); +		processHighlights(_savenameMenu, _vm->_mouseX, _vm->_mouseY);  		if (_keyPressed.keycode == Common::KEYCODE_RETURN || _keyPressed.keycode == Common::KEYCODE_KP_ENTER || _finishNameInput) {  			if (checkSavegameDescription(buffer, curPos)) {  				buffer[curPos] = 0; @@ -823,54 +822,6 @@ int GUI_v2::getCharWidth(uint8 c) {  	return width;  } -void GUI_v2::checkTextfieldInput() { -	Common::Event event; - -	uint32 now = _vm->_system->getMillis(); - -	bool running = true; -	int keys = 0; -	while (_vm->_eventMan->pollEvent(event) && running) { -		switch (event.type) { -		case Common::EVENT_KEYDOWN: -			if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL) -				_vm->quitGame(); -			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(); -			_lastScreenUpdate = now; -			} break; - -		default: -			break; -		} -	} - -	if (now - _lastScreenUpdate > 50) { -		_vm->_system->updateScreen(); -		_lastScreenUpdate = now; -	} - -	processButtonList(_menuButtonList, keys | 0x8000, 0); -	_vm->_system->delayMillis(3); -} -  void GUI_v2::drawTextfieldBlock(int x, int y, uint8 c) {  	_screen->fillRect(x+1, y+1, x+7, y+8, c);  } diff --git a/engines/kyra/gui_v2.h b/engines/kyra/gui_v2.h index 88861ff905..a8e14d8831 100644 --- a/engines/kyra/gui_v2.h +++ b/engines/kyra/gui_v2.h @@ -121,6 +121,7 @@ protected:  	bool _buttonListChanged;  	Button *_backUpButtonList;  	Button *_unknownButtonList; +	uint16 _flagsModifier;  protected:  	virtual void setupPalette() {} @@ -212,8 +213,6 @@ protected:  	// savename menu  	bool _finishNameInput, _cancelNameInput; -	Common::KeyState _keyPressed; -	uint32 _lastScreenUpdate;  	const char *nameInputProcess(char *buffer, int x, int y, uint8 c1, uint8 c2, uint8 c3, int bufferSize);  	int finishSavename(Button *caller); @@ -221,7 +220,6 @@ protected:  	bool checkSavegameDescription(const char *buffer, int size);  	int getCharWidth(uint8 c); -	void checkTextfieldInput();  	void drawTextfieldBlock(int x, int y, uint8 c);  	// choice menu diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h index 8db7a28387..a3f78b8465 100644 --- a/engines/kyra/kyra_hof.h +++ b/engines/kyra/kyra_hof.h @@ -200,7 +200,7 @@ public:  	Screen *screen() { return _screen; }  	Screen_v2 *screen_v2() const { return _screen; } -	GUI_v2 *gui_v2() const { return _gui; } +	GUI *gui() const { return _gui; }  	virtual TextDisplayer *text() { return _text; }  	int language() const { return _lang; }  protected: diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp index e7e0ff25e0..5829aeb10a 100644 --- a/engines/kyra/kyra_lok.cpp +++ b/engines/kyra/kyra_lok.cpp @@ -48,7 +48,6 @@ namespace Kyra {  KyraEngine_LoK::KyraEngine_LoK(OSystem *system, const GameFlags &flags)  	: KyraEngine_v1(system, flags) { -	_skipFlag = false;  	_seq_Forest = _seq_KallakWriting = _seq_KyrandiaLogo = _seq_KallakMalcolm =  	_seq_MalcolmTree = _seq_WestwoodLogo = _seq_Demo1 = _seq_Demo2 = _seq_Demo3 = @@ -220,8 +219,6 @@ Common::Error KyraEngine_LoK::init() {  	memset(_flagsTable, 0, sizeof(_flagsTable)); -	_abortWalkFlag = false; -	_abortWalkFlag2 = false;  	_talkingCharNum = -1;  	_charSayUnk3 = -1;  	memset(_currSentenceColor, 0, 3); @@ -247,12 +244,9 @@ Common::Error KyraEngine_LoK::init() {  	assert(_movFacingTable);  	_movFacingTable[0] = 8; -	_skipFlag = false; -  	_marbleVaseItem = -1;  	memset(_foyerItemTable, -1, sizeof(_foyerItemTable));  	_itemInHand = -1; -	_handleInput = false;  	_currentRoom = 0xFFFF;  	_scenePhasingFlag = 0; @@ -279,8 +273,6 @@ Common::Error KyraEngine_LoK::init() {  	_kyragemFadingState.gOffset = 0x13;  	_kyragemFadingState.bOffset = 0x13; -	_mousePressFlag = false; -  	_menuDirectlyToLoad = false;  	_lastMusicCommand = 0; @@ -297,18 +289,23 @@ Common::Error KyraEngine_LoK::go() {  	_abortIntroFlag = false;  	if (_flags.isDemo) { +		_seqPlayerFlag = true;  		seq_demo(); +		_seqPlayerFlag = false;  	} else {  		setGameFlag(0xF3);  		setGameFlag(0xFD);  		if (_gameToLoad == -1) {  			setGameFlag(0xEF); +			_seqPlayerFlag = true;  			seq_intro();  			if (shouldQuit())  				return Common::kNoError;  			if (_skipIntroFlag && _abortIntroFlag)  				resetGameFlag(0xEF); +			_seqPlayerFlag = false;  		} +		_eventList.clear();  		startup();  		resetGameFlag(0xEF);  		mainLoop(); @@ -403,9 +400,10 @@ void KyraEngine_LoK::startup() {  void KyraEngine_LoK::mainLoop() {  	debugC(9, kDebugLevelMain, "KyraEngine_LoK::mainLoop()"); +	_eventList.clear(); +  	while (!shouldQuit()) {  		int32 frameTime = (int32)_system->getMillis(); -		_skipFlag = false;  		checkAutosave(); @@ -434,18 +432,24 @@ void KyraEngine_LoK::mainLoop() {  			_brandonStatusBit0x20Flag = 0;  		} +		// FIXME: Why is this here?  		_screen->showMouse(); -		_gui->processButtonList(_buttonList, 0, 0); +		int inputFlag = checkInput(_buttonList, true); +		removeInputTop(); +  		updateMousePointer();  		_timer->update(); +		_sound->process();  		updateTextFade(); -		_handleInput = true; -		delay((frameTime + _gameSpeed) - _system->getMillis(), true, true); -		_handleInput = false; +		if (inputFlag == 198 || inputFlag == 199) +			processInput(_mouseX, _mouseY); -		_sound->process(); +		if (skipFlag()) +			resetSkipFlag(); + +		delay((frameTime + _gameSpeed) - _system->getMillis(), true, true);  	}  } @@ -464,69 +468,9 @@ void KyraEngine_LoK::delay(uint32 amount, bool update, bool isMainLoop) {  	uint32 start = _system->getMillis();  	do { -		if (isMainLoop) -			_isSaveAllowed = true; - -		while (_eventMan->pollEvent(event)) { -			_isSaveAllowed = false; - -			switch (event.type) { -			case Common::EVENT_KEYDOWN: -				if (event.kbd.keycode >= '1' && event.kbd.keycode <= '9' && -						(event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && isMainLoop) { -					int saveLoadSlot = 9 - (event.kbd.keycode - '0') + 990; - -					if (event.kbd.flags == Common::KBD_CTRL) -						loadGameStateCheck(saveLoadSlot); -					else { -						char savegameName[14]; -						sprintf(savegameName, "Quicksave %d", event.kbd.keycode - '0'); -						saveGameState(saveLoadSlot, savegameName, 0); -					} -				} else if (event.kbd.flags == Common::KBD_CTRL) { -					if (event.kbd.keycode == 'd') -						_debugger->attach(); -					else if (event.kbd.keycode == 'q') -						quitGame(); -				} else if (event.kbd.keycode == '.') { -					_skipFlag = true; +				/*} else if (event.kbd.keycode == '.') {  				} else if (event.kbd.keycode == Common::KEYCODE_RETURN || event.kbd.keycode == Common::KEYCODE_SPACE || event.kbd.keycode == Common::KEYCODE_ESCAPE) { -					_abortIntroFlag = true; -					_skipFlag = true; -				} - -				break; -			case Common::EVENT_MOUSEMOVE: -				_animator->_updateScreen = true; -				break; -			case Common::EVENT_LBUTTONDOWN: -				_mousePressFlag = true; -				break; -			case Common::EVENT_LBUTTONUP: -				_mousePressFlag = false; - -				if (_abortWalkFlag2) -					_abortWalkFlag = true; - -				if (_handleInput) { -					_handleInput = false; -					processInput(); -					_handleInput = true; -				} else -					_skipFlag = true; - -				break; -			default: -				break; -			} - -			if (isMainLoop) -				_isSaveAllowed = true; -		} - -		if (_debugger->isAttached()) -			_debugger->onFrame(); - +					_abortIntroFlag = true;*/  		if (update) {  			_sprites->updateSceneAnims();  			_animator->updateAllObjectShapes(); @@ -534,44 +478,33 @@ void KyraEngine_LoK::delay(uint32 amount, bool update, bool isMainLoop) {  			updateMousePointer();  		} +		updateInput(); +  		if (_currentCharacter && _currentCharacter->sceneId == 210 && update)  			updateKyragemFading(); -		if (_skipFlag && !_abortIntroFlag && !queryGameFlag(0xFE)) -			_skipFlag = false; - -		if (amount > 0 && !_skipFlag && !shouldQuit()) +		if (amount > 0 && !skipFlag() && !shouldQuit())  			_system->delayMillis(10); -		if (_skipFlag) -			_sound->voiceStop(); -	} while (!_skipFlag && _system->getMillis() < start + amount && !shouldQuit()); -} - -void KyraEngine_LoK::waitForEvent() { -	bool finished = false; -	Common::Event event; - -	while (!finished && !shouldQuit()) { -		while (_eventMan->pollEvent(event)) { -			switch (event.type) { -			case Common::EVENT_KEYDOWN: -				finished = true; -				break; -			case Common::EVENT_LBUTTONDOWN: -				finished = true; -				_skipFlag = true; -				break; -			default: -				break; +		// FIXME: Major hackery to allow skipping the intro +		if (_seqPlayerFlag) { +			for (Common::List<Event>::iterator i = _eventList.begin(); i != _eventList.end(); ++i) { +				if (i->causedSkip) { +					if (i->event.type == Common::EVENT_KEYDOWN && i->event.kbd.keycode == Common::KEYCODE_ESCAPE) +						_abortIntroFlag = true; +					else +						i->causedSkip = false; +				}  			}  		} -		if (_debugger->isAttached()) -			_debugger->onFrame(); +		if (skipFlag()) +			_sound->voiceStop(); +	} while (!skipFlag() && _system->getMillis() < start + amount && !shouldQuit()); +} -		_system->delayMillis(10); -	} +bool KyraEngine_LoK::skipFlag() const { +	return KyraEngine_v1::skipFlag() || shouldQuit();  }  void KyraEngine_LoK::delayWithTicks(int ticks) { @@ -586,7 +519,7 @@ void KyraEngine_LoK::delayWithTicks(int ticks) {  			seq_playEnd();  		} -		if (_skipFlag) +		if (skipFlag())  			break;  		if (nextTime - _system->getMillis() >= 10) @@ -676,13 +609,8 @@ void KyraEngine_LoK::resetBrandonPoisonFlags() {  #pragma mark - Input  #pragma mark - -void KyraEngine_LoK::processInput() { -	Common::Point mouse = getMousePos(); -	int xpos = mouse.x; -	int ypos = mouse.y; - +void KyraEngine_LoK::processInput(int xpos, int ypos) {  	debugC(9, kDebugLevelMain, "KyraEngine_LoK::processInput(%d, %d)", xpos, ypos); -	_abortWalkFlag2 = false;  	if (processInputHelper(xpos, ypos))  		return; @@ -698,20 +626,18 @@ void KyraEngine_LoK::processInput() {  	// XXX _deathHandler specific  	if (ypos <= 158) {  		uint16 exit = 0xFFFF; -		if (xpos < 12) { + +		if (xpos < 12)  			exit = _walkBlockWest; -		} else if (xpos >= 308) { +		else if (xpos >= 308)  			exit = _walkBlockEast; -		} else if (ypos >= 136) { +		else if (ypos >= 136)  			exit = _walkBlockSouth; -		} else if (ypos < 12) { +		else if (ypos < 12)  			exit = _walkBlockNorth; -		}  		if (exit != 0xFFFF) { -			_abortWalkFlag2 = true;  			handleSceneChange(xpos, ypos, 1, 1); -			_abortWalkFlag2 = false;  			return;  		} else {  			int script = checkForNPCScriptRun(xpos, ypos); @@ -722,19 +648,14 @@ void KyraEngine_LoK::processInput() {  			if (_itemInHand != -1) {  				if (ypos < 155) {  					if (hasClickedOnExit(xpos, ypos)) { -						_abortWalkFlag2 = true;  						handleSceneChange(xpos, ypos, 1, 1); -						_abortWalkFlag2 = false;  						return;  					}  					dropItem(0, _itemInHand, xpos, ypos, 1);  				}  			} else { -				if (ypos <= 155) { -					_abortWalkFlag2 = true; +				if (ypos <= 155)  					handleSceneChange(xpos, ypos, 1, 1); -					_abortWalkFlag2 = false; -				}  			}  		}  	} diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index d294e29fad..ebe110981e 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -119,6 +119,7 @@ public:  	Screen *screen() { return _screen; }  	Animator_LoK *animator() { return _animator; } +	GUI *gui() const { return _gui; }  	virtual Movie *createWSAMovie();  	uint8 **shapes() { return _shapes; } @@ -198,7 +199,8 @@ public:  	void delayUntil(uint32 timestamp, bool updateGameTimers = false, bool update = false, bool isMainLoop = false);  	void delay(uint32 millis, bool update = false, bool isMainLoop = false);  	void delayWithTicks(int ticks); -	void waitForEvent(); + +	bool skipFlag() const;  	// TODO  	void registerDefaultSettings(); @@ -218,17 +220,13 @@ protected:  	Common::Error loadGameState(int slot);  protected:  	// input -	void processInput(); +	void processInput(int xpos, int ypos);  	int processInputHelper(int xpos, int ypos);  	int clickEventHandler(int xpos, int ypos);  	void clickEventHandler2();  	void updateMousePointer(bool forceUpdate = false);  	bool hasClickedOnExit(int xpos, int ypos); -	bool _skipFlag; -	bool skipFlag() const { return _skipFlag; } -	void resetSkipFlag(bool removeEvent = true) { _skipFlag = false; } -  	// scene  	// -> init  	void loadSceneMsc(); @@ -389,16 +387,14 @@ protected:  	int buttonInventoryCallback(Button *caller);  	int buttonAmuletCallback(Button *caller); +	bool _seqPlayerFlag;  	bool _skipIntroFlag;  	bool _abortIntroFlag; +  	bool _menuDirectlyToLoad; -	bool _abortWalkFlag; -	bool _abortWalkFlag2; -	bool _mousePressFlag;  	uint8 *_itemBkgBackUp[2];  	uint8 *_shapes[373];  	int8 _itemInHand; -	bool _handleInput;  	bool _changedScene;  	int _unkScreenVar1, _unkScreenVar2, _unkScreenVar3;  	int _beadStateVar; diff --git a/engines/kyra/kyra_mr.h b/engines/kyra/kyra_mr.h index 73886b9d11..a0e0af93b0 100644 --- a/engines/kyra/kyra_mr.h +++ b/engines/kyra/kyra_mr.h @@ -57,7 +57,7 @@ public:  	Screen *screen() { return _screen; }  	Screen_v2 *screen_v2() const { return _screen; } -	GUI_v2 *gui_v2() const { return _gui; } +	GUI *gui() const { return _gui; }  	SoundDigital *soundDigital() { return _soundDigital; }  	int language() const { return _lang; }  	bool heliumMode() const { return _configHelium; } diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 0e981a50d0..b2682fb385 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -222,6 +222,148 @@ void KyraEngine_v1::setMousePos(int x, int y) {  	_system->warpMouse(x, y);  } +int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop) { +	debugC(9, kDebugLevelMain, "KyraEngine_v1::checkInput(%p, %d)", (const void*)buttonList, mainLoop); +	if (mainLoop) +		_isSaveAllowed = true; + +	updateInput(); + +	_isSaveAllowed = false; + +	int keys = 0; +	int8 mouseWheel = 0; + +	while (_eventList.size()) { +		Common::Event event = *_eventList.begin(); +		bool breakLoop = false; + +		switch (event.type) { +		case Common::EVENT_KEYDOWN: +			if (event.kbd.keycode >= '1' && event.kbd.keycode <= '9' && +					(event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && mainLoop) { +				int saveLoadSlot = 9 - (event.kbd.keycode - '0') + 990; + +				if (event.kbd.flags == Common::KBD_CTRL) { +					loadGameStateCheck(saveLoadSlot); +					_eventList.clear(); +					breakLoop = true; +				} else { +					char savegameName[14]; +					sprintf(savegameName, "Quicksave %d", event.kbd.keycode - '0'); +					saveGameState(saveLoadSlot, savegameName, 0); +				} +			} else if (event.kbd.flags == Common::KBD_CTRL) { +				if (event.kbd.keycode == 'd') +					_debugger->attach(); +				else if (event.kbd.keycode == 'q') +					quitGame(); +			} +			break; + +		case Common::EVENT_MOUSEMOVE: { +			Common::Point pos = getMousePos(); +			_mouseX = pos.x; +			_mouseY = pos.y; +			} break; + +		case Common::EVENT_LBUTTONDOWN: +		case Common::EVENT_LBUTTONUP: { +			Common::Point pos = getMousePos(); +			_mouseX = pos.x; +			_mouseY = pos.y; +			keys = (event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800)); +			breakLoop = true; +			} break; + +		case Common::EVENT_WHEELUP: +			mouseWheel = -1; +			break; + +		case Common::EVENT_WHEELDOWN: +			mouseWheel = 1; +			break; + +		default: +			break; +		} + +		if (_debugger->isAttached()) +			_debugger->onFrame(); + +		if (breakLoop) +			break; + +		_eventList.erase(_eventList.begin()); +	} + +	GUI *guiInstance = gui(); +	if (guiInstance) +		return guiInstance->processButtonList(buttonList, keys | 0x8000, mouseWheel); +	else +		return keys; +} + +void KyraEngine_v1::updateInput() { +	Common::Event event; + +	while (_eventMan->pollEvent(event)) { +		switch (event.type) { +		case Common::EVENT_KEYDOWN: +			if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE) +				_eventList.push_back(Event(event, true)); +			else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL) +				quitGame(); +			else +				_eventList.push_back(event); +			break; + +		case Common::EVENT_LBUTTONDOWN: +			_eventList.push_back(Event(event, true)); +			break; + +		case Common::EVENT_MOUSEMOVE: +			screen()->updateScreen(); +			// fall through + +		case Common::EVENT_LBUTTONUP: +		case Common::EVENT_WHEELUP: +		case Common::EVENT_WHEELDOWN: +			_eventList.push_back(event); +			break; + +		default: +			break; +		} +	} +} + +void KyraEngine_v1::removeInputTop() { +	if (!_eventList.empty()) +		_eventList.erase(_eventList.begin()); +} + +bool KyraEngine_v1::skipFlag() const { +	for (Common::List<Event>::const_iterator i = _eventList.begin(); i != _eventList.end(); ++i) { +		if (i->causedSkip) +			return true; +	} +	return false; +} + +void KyraEngine_v1::resetSkipFlag(bool removeEvent) { +	for (Common::List<Event>::iterator i = _eventList.begin(); i != _eventList.end(); ++i) { +		if (i->causedSkip) { +			if (removeEvent) +				_eventList.erase(i); +			else +				i->causedSkip = false; +			return; +		} +	} +} + +  int KyraEngine_v1::setGameFlag(int flag) {  	_flagsTable[flag >> 3] |= (1 << (flag & 7));  	return 1; diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index e1dde72b8d..13b6397e44 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -105,6 +105,9 @@ class TextDisplayer;  class StaticResource;  class TimerManager;  class Debugger; +class GUI; + +struct Button;  class KyraEngine_v1 : public Engine {  friend class Debugger; @@ -115,7 +118,6 @@ public:  	KyraEngine_v1(OSystem *system, const GameFlags &flags);  	virtual ~KyraEngine_v1(); -  	uint8 game() const { return _flags.gameID; }  	const GameFlags &gameFlags() const { return _flags; } @@ -123,6 +125,7 @@ public:  	Resource *resource() { return _res; }  	virtual Screen *screen() = 0;  	virtual TextDisplayer *text() { return _text; } +	virtual GUI *gui() const { return 0; }  	Sound *sound() { return _sound; }  	StaticResource *staticres() { return _staticres; }  	TimerManager *timer() { return _timer; } @@ -185,6 +188,25 @@ protected:  	EMCInterpreter *_emc;  	Debugger *_debugger; +	// input +	void updateInput(); +	int checkInput(Button *buttonList, bool mainLoop = false); +	void removeInputTop(); + +	int _mouseX, _mouseY; + +	struct Event { +		Common::Event event; +		bool causedSkip; + +		Event() : event(), causedSkip(false) {} +		Event(Common::Event e) : event(e), causedSkip(false) {} +		Event(Common::Event e, bool skip) : event(e), causedSkip(skip) {} + +		operator Common::Event() const { return event; } +	}; +	Common::List<Event> _eventList; +  	// config specific  	virtual void registerDefaultSettings();  	virtual void readSettings(); @@ -197,8 +219,8 @@ protected:  	uint8 _configVoice;  	// game speed -	virtual bool skipFlag() const = 0; -	virtual void resetSkipFlag(bool removeEvent = true) = 0; +	virtual bool skipFlag() const; +	virtual void resetSkipFlag(bool removeEvent = true);  	uint16 _tickLength;  	uint16 _gameSpeed; diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index 3099652af3..158206f73f 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -162,141 +162,6 @@ void KyraEngine_v2::delay(uint32 amount, bool updateGame, bool isMainLoop) {  	} while (!skipFlag() && _system->getMillis() < start + amount && !shouldQuit());  } -int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) { -	debugC(9, kDebugLevelMain, "KyraEngine_v2::checkInput(%p, %d)", (const void*)buttonList, mainLoop); -	if (mainLoop) -		_isSaveAllowed = true; - -	updateInput(); - -	_isSaveAllowed = false; - -	int keys = 0; -	int8 mouseWheel = 0; - -	while (_eventList.size()) { -		Common::Event event = *_eventList.begin(); -		bool breakLoop = false; - -		switch (event.type) { -		case Common::EVENT_KEYDOWN: -			if (event.kbd.keycode >= '1' && event.kbd.keycode <= '9' && -					(event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && mainLoop) { -				int saveLoadSlot = 9 - (event.kbd.keycode - '0') + 990; - -				if (event.kbd.flags == Common::KBD_CTRL) { -					loadGameStateCheck(saveLoadSlot); -					_eventList.clear(); -					breakLoop = true; -				} else { -					char savegameName[14]; -					sprintf(savegameName, "Quicksave %d", event.kbd.keycode - '0'); -					saveGameState(saveLoadSlot, savegameName, 0); -				} -			} else if (event.kbd.flags == Common::KBD_CTRL) { -				if (event.kbd.keycode == 'd') -					_debugger->attach(); -			} -			break; - -		case Common::EVENT_MOUSEMOVE: { -			Common::Point pos = getMousePos(); -			_mouseX = pos.x; -			_mouseY = pos.y; -			} break; - -		case Common::EVENT_LBUTTONDOWN: -		case Common::EVENT_LBUTTONUP: { -			Common::Point pos = getMousePos(); -			_mouseX = pos.x; -			_mouseY = pos.y; -			keys = (event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800)); -			breakLoop = true; -			} break; - -		case Common::EVENT_WHEELUP: -			mouseWheel = -1; -			break; - -		case Common::EVENT_WHEELDOWN: -			mouseWheel = 1; -			break; - -		default: -			break; -		} - -		if (_debugger->isAttached()) -			_debugger->onFrame(); - -		if (breakLoop) -			break; - -		_eventList.erase(_eventList.begin()); -	} - -	return gui_v2()->processButtonList(buttonList, keys | 0x8000, mouseWheel); -} - -void KyraEngine_v2::updateInput() { -	Common::Event event; - -	while (_eventMan->pollEvent(event)) { -		switch (event.type) { -		case Common::EVENT_KEYDOWN: -			if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE) -				_eventList.push_back(Event(event, true)); -			else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL) -				quitGame(); -			else -				_eventList.push_back(event); -			break; - -		case Common::EVENT_LBUTTONDOWN: -			_eventList.push_back(Event(event, true)); -			break; - -		case Common::EVENT_MOUSEMOVE: -			screen_v2()->updateScreen(); -			// fall through - -		case Common::EVENT_LBUTTONUP: -		case Common::EVENT_WHEELUP: -		case Common::EVENT_WHEELDOWN: -			_eventList.push_back(event); -			break; - -		default: -			break; -		} -	} -} - -void KyraEngine_v2::removeInputTop() { -	if (!_eventList.empty()) -		_eventList.erase(_eventList.begin()); -} - -bool KyraEngine_v2::skipFlag() const { -	for (Common::List<Event>::const_iterator i = _eventList.begin(); i != _eventList.end(); ++i) { -		if (i->causedSkip) -			return true; -	} -	return false; -} - -void KyraEngine_v2::resetSkipFlag(bool removeEvent) { -	for (Common::List<Event>::iterator i = _eventList.begin(); i != _eventList.end(); ++i) { -		if (i->causedSkip) { -			if (removeEvent) -				_eventList.erase(i); -			else -				i->causedSkip = false; -			return; -		} -	} -} -  bool KyraEngine_v2::checkSpecialSceneExit(int num, int x, int y) {  	if (_specialExitTable[0+num] > x || _specialExitTable[5+num] > y ||  		_specialExitTable[10+num] < x || _specialExitTable[15+num] < y) diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index e606bdfc15..2d261d8c7b 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -78,7 +78,6 @@ public:  	virtual void pauseEngineIntern(bool pause);  	virtual Screen_v2 *screen_v2() const = 0; -	virtual GUI *gui_v2() const = 0;  	void delay(uint32 time, bool update = false, bool isMainLoop = false); @@ -103,27 +102,6 @@ protected:  	// Input  	virtual int inputSceneChange(int x, int y, int unk1, int unk2) = 0; -	void updateInput(); -	int checkInput(Button *buttonList, bool mainLoop = false); -	void removeInputTop(); - -	int _mouseX, _mouseY; - -	struct Event { -		Common::Event event; -		bool causedSkip; - -		Event() : event(), causedSkip(false) {} -		Event(Common::Event e) : event(e), causedSkip(false) {} -		Event(Common::Event e, bool skip) : event(e), causedSkip(skip) {} - -		operator Common::Event() const { return event; } -	}; -	Common::List<Event> _eventList; - -	virtual bool skipFlag() const; -	virtual void resetSkipFlag(bool removeEvent = true); -  	// Animator  	struct AnimObj {  		uint16 index; diff --git a/engines/kyra/saveload_lok.cpp b/engines/kyra/saveload_lok.cpp index 8cad0eeb75..c437960907 100644 --- a/engines/kyra/saveload_lok.cpp +++ b/engines/kyra/saveload_lok.cpp @@ -202,9 +202,6 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) {  	_screen->_disableScreen = false;  	_screen->updateScreen(); -	_abortWalkFlag = true; -	_abortWalkFlag2 = false; -	_mousePressFlag = false;  	setMousePos(brandonX, brandonY);  	if (in->err() || in->eos()) { diff --git a/engines/kyra/scene_lok.cpp b/engines/kyra/scene_lok.cpp index b3b830faed..8d6309855f 100644 --- a/engines/kyra/scene_lok.cpp +++ b/engines/kyra/scene_lok.cpp @@ -44,9 +44,6 @@ void KyraEngine_LoK::enterNewScene(int sceneId, int facing, int unk1, int unk2,  	debugC(9, kDebugLevelMain, "KyraEngine_LoK::enterNewScene(%d, %d, %d, %d, %d)", sceneId, facing, unk1, unk2, brandonAlive);  	int unkVar1 = 1;  	_screen->hideMouse(); -	_handleInput = false; -	_abortWalkFlag = false; -	_abortWalkFlag2 = false;  	// TODO: Check how the original handled sfx still playing  	_sound->stopAllSoundEffects(); @@ -923,18 +920,8 @@ int KyraEngine_LoK::processSceneChange(int *table, int unk1, int frameReset) {  	bool running = true;  	int returnValue = 0;  	uint32 nextFrame = 0; -	_abortWalkFlag = false; -	_mousePressFlag = false;  	while (running) { -		if (_abortWalkFlag) { -			*table = 8; -			_currentCharacter->currentAnimFrame = 7; -			_animator->animRefreshNPC(0); -			_animator->updateAllObjectShapes(); -			processInput(); -			return 0; -		}  		bool forceContinue = false;  		switch (*table) {  		case 0: case 1: case 2: @@ -955,13 +942,12 @@ int KyraEngine_LoK::processSceneChange(int *table, int unk1, int frameReset) {  		}  		returnValue = changeScene(_currentCharacter->facing); -		if (returnValue) { +		if (returnValue)  			running = false; -			_abortWalkFlag = false; -		}  		if (unk1) { -			if (_mousePressFlag) { +			if (skipFlag()) { +				resetSkipFlag(false);  				running = false;  				_sceneChangeState = 1;  			} diff --git a/engines/kyra/script_lok.cpp b/engines/kyra/script_lok.cpp index b0fc4b860c..afdb4d2dab 100644 --- a/engines/kyra/script_lok.cpp +++ b/engines/kyra/script_lok.cpp @@ -44,7 +44,7 @@ int KyraEngine_LoK::o1_magicInMouseItem(EMCState *script) {  }  int KyraEngine_LoK::o1_characterSays(EMCState *script) { -	_skipFlag = false; +	resetSkipFlag();  	if (_flags.isTalkie) {  		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_characterSays(%p) (%d, '%s', %d, %d)", (const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3));  		characterSays(stackPos(0), stackPosString(1), stackPos(2), stackPos(3)); @@ -330,11 +330,11 @@ int KyraEngine_LoK::o1_delaySecs(EMCState *script) {  		}  	} else {  		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_delaySecs(%p) (%d)", (const void *)script, stackPos(0)); -		if (stackPos(0) >= 0 && !_skipFlag) +		if (stackPos(0) >= 0 && !skipFlag())  			delay(stackPos(0)*1000, true);  	} -	_skipFlag = false; +	resetSkipFlag();  	return 0;  } @@ -470,7 +470,7 @@ int KyraEngine_LoK::o1_displayWSAFrame(EMCState *script) {  	while (_system->getMillis() < continueTime) {  		_sprites->updateSceneAnims();  		_animator->updateAllObjectShapes(); -		if (_skipFlag) +		if (skipFlag())  			break;  		if (continueTime - _system->getMillis() >= 10) @@ -607,12 +607,12 @@ int KyraEngine_LoK::o1_customPrintTalkString(EMCState *script) {  			snd_playVoiceFile(stackPos(0));  		} -		_skipFlag = false; +		resetSkipFlag();  		if (textEnabled())  			_text->printTalkTextMessage(stackPosString(1), stackPos(2), stackPos(3), stackPos(4) & 0xFF, 0, 2);  	} else {  		debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_customPrintTalkString(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF); -		_skipFlag = false; +		resetSkipFlag();  		_text->printTalkTextMessage(stackPosString(0), stackPos(1), stackPos(2), stackPos(3) & 0xFF, 0, 2);  	}  	_screen->updateScreen(); @@ -699,7 +699,7 @@ int KyraEngine_LoK::o1_displayWSAFrameOnHidPage(EMCState *script) {  	while (_system->getMillis() < continueTime) {  		_sprites->updateSceneAnims();  		_animator->updateAllObjectShapes(); -		if (_skipFlag) +		if (skipFlag())  			break;  		if (continueTime - _system->getMillis() >= 10) @@ -787,7 +787,7 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {  				while (_system->getMillis() < continueTime) {  					_sprites->updateSceneAnims();  					_animator->updateAllObjectShapes(); -					if (_skipFlag) +					if (skipFlag())  						break;  					if (continueTime - _system->getMillis() >= 10) @@ -805,7 +805,7 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {  				while (_system->getMillis() < continueTime) {  					_sprites->updateSceneAnims();  					_animator->updateAllObjectShapes(); -					if (_skipFlag) +					if (skipFlag())  						break;  					if (continueTime - _system->getMillis() >= 10) @@ -815,7 +815,7 @@ int KyraEngine_LoK::o1_displayWSASequentialFrames(EMCState *script) {  			}  		} -		if (_skipFlag) +		if (skipFlag())  			break;  		else  			++curTime; @@ -927,7 +927,17 @@ int KyraEngine_LoK::o1_placeCharacterInOtherScene(EMCState *script) {  int KyraEngine_LoK::o1_getKey(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_getKey(%p) ()", (const void *)script); -	waitForEvent(); + +	// TODO: Check this implementation + +	while (true) { +		delay(10); + +		if (skipFlag()) +			break; +	} + +	resetSkipFlag();  	return 0;  } @@ -1338,26 +1348,25 @@ int KyraEngine_LoK::o1_setCharacterCurrentFrame(EMCState *script) {  int KyraEngine_LoK::o1_waitForConfirmationMouseClick(EMCState *script) {  	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_LoK::o1_waitForConfirmationMouseClick(%p) ()", (const void *)script); -	// if (mouseEnabled) { -	while (!_mousePressFlag) { -		updateMousePointer(); -		_sprites->updateSceneAnims(); -		_animator->updateAllObjectShapes(); -		delay(10); -	} -	while (_mousePressFlag) { +	while (true) {  		updateMousePointer();  		_sprites->updateSceneAnims();  		_animator->updateAllObjectShapes(); + +		updateInput(); +		 +		int input = checkInput(_buttonList, false) & 0xFF; +		removeInputTop(); +		if (input == 200) +			break; +  		delay(10);  	} -	// } -	_gui->processButtonList(_buttonList, 0, 0); -	_skipFlag = false; -	Common::Point mouse = getMousePos(); -	script->regs[1] = mouse.x; -	script->regs[2] = mouse.y; + +	script->regs[1] = _mouseX; +	script->regs[2] = _mouseY; +  	return 0;  } diff --git a/engines/kyra/sequences_lok.cpp b/engines/kyra/sequences_lok.cpp index c9c1a05842..e072b84876 100644 --- a/engines/kyra/sequences_lok.cpp +++ b/engines/kyra/sequences_lok.cpp @@ -107,8 +107,9 @@ void KyraEngine_LoK::seq_intro() {  	if ((in = _saveFileMan->openForLoading(getSavegameFilename(0)))) {  		delete in;  		_skipIntroFlag = true; -	} else +	} else {  		_skipIntroFlag = false; +	}  	_seq->setCopyViewOffs(true);  	_screen->setFont(Screen::FID_8_FNT); @@ -163,7 +164,7 @@ void KyraEngine_LoK::seq_introLogos() {  	_screen->updateScreen();  	_screen->fadeFromBlack(); -	if (_seq->playSequence(_seq_WestwoodLogo, _skipFlag) || shouldQuit()) { +	if (_seq->playSequence(_seq_WestwoodLogo, skipFlag()) || shouldQuit()) {  		_screen->fadeToBlack();  		_screen->clearPage(0);  		return; @@ -175,7 +176,7 @@ void KyraEngine_LoK::seq_introLogos() {  		_screen->setScreenPalette(_screen->_currentPalette);  	} -	if ((_seq->playSequence(_seq_KyrandiaLogo, _skipFlag) && !seq_skipSequence()) || shouldQuit()) { +	if ((_seq->playSequence(_seq_KyrandiaLogo, skipFlag()) && !seq_skipSequence()) || shouldQuit()) {  		_screen->fadeToBlack();  		_screen->clearPage(0);  		return; @@ -274,7 +275,7 @@ void KyraEngine_LoK::seq_introStory() {  	}  	_screen->updateScreen(); -	//debugC(0, kDebugLevelMain, "skipFlag %i, %i", _skipFlag, _tickLength); +	//debugC(0, kDebugLevelMain, "skipFlag %i, %i", skipFlag(), _tickLength);  	delay(360 * _tickLength);  } diff --git a/engines/kyra/sound_lok.cpp b/engines/kyra/sound_lok.cpp index b43d72ebce..415181b985 100644 --- a/engines/kyra/sound_lok.cpp +++ b/engines/kyra/sound_lok.cpp @@ -82,7 +82,7 @@ void KyraEngine_LoK::snd_playVoiceFile(int id) {  void KyraEngine_LoK::snd_voiceWaitForFinish(bool ingame) {  	debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_LoK::snd_voiceWaitForFinish(%d)", ingame); -	while (_sound->voiceIsPlaying() && !_skipFlag) { +	while (_sound->voiceIsPlaying() && !skipFlag()) {  		if (ingame)  			delay(10, true);  		else diff --git a/engines/kyra/text_lok.cpp b/engines/kyra/text_lok.cpp index 150ec59a23..8c0980005b 100644 --- a/engines/kyra/text_lok.cpp +++ b/engines/kyra/text_lok.cpp @@ -114,22 +114,11 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const  		uint32 nextTime = loopStart + _tickLength;  		while (_system->getMillis() < nextTime) { -			while (_eventMan->pollEvent(event)) { -				switch (event.type) { -				case Common::EVENT_KEYDOWN: -					if (event.kbd.keycode == '.') -						_skipFlag = true; -					break; -				case Common::EVENT_RTL: -				case Common::EVENT_QUIT: -					runLoop = false; -					break; -				case Common::EVENT_LBUTTONDOWN: -					runLoop = false; -					break; -				default: -					break; -				} +			updateInput(); + +			if (skipFlag()) { +				runLoop = false; +				break;  			}  			if (nextTime - _system->getMillis() >= 10) { @@ -137,13 +126,12 @@ void KyraEngine_LoK::waitForChatToFinish(int vocFile, int16 chatDuration, const  				_system->updateScreen();  			}  		} - -		if (_skipFlag) -			runLoop = false;  	} -	if (_skipFlag) +	if (skipFlag()) { +		resetSkipFlag();  		snd_stopVoice(); +	}  	_timer->enable(14);  	_timer->enable(15); | 
