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

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sun Mar 9 12:28:51 CET 2008


Revision: 31084
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31084&view=rev
Author:   lordhoto
Date:     2008-03-09 04:28:51 -0700 (Sun, 09 Mar 2008)

Log Message:
-----------
Implemented spellbook in HoF.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui_v2.cpp
    scummvm/trunk/engines/kyra/kyra_v2.cpp
    scummvm/trunk/engines/kyra/kyra_v2.h
    scummvm/trunk/engines/kyra/screen.cpp
    scummvm/trunk/engines/kyra/screen.h
    scummvm/trunk/engines/kyra/staticres.cpp
    scummvm/trunk/engines/kyra/text_v2.cpp

Modified: scummvm/trunk/engines/kyra/gui_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui_v2.cpp	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/gui_v2.cpp	2008-03-09 11:28:51 UTC (rev 31084)
@@ -376,8 +376,10 @@
 		// but did some other magic, which looks like it depends on how the handle
 		// key input... so we just enable 0x1000 and 0x4000 here to allow
 		// all GUI buttons to work (for now at least...)
-		if (inFlags == 199 || inFlags == 198)
+		if (inFlags == 199 || inFlags == 198) {
 			temp = 0x1000 | 0x4000;
+			removeInputTop();
+		}
 
 		//if (inputFlag & 0x800)
 		//	temp <<= 2;
@@ -572,7 +574,7 @@
 }
 
 int KyraEngine_v2::buttonInventory(Button *button) {
-	if (!_screen->isMouseShown())
+	if (!_screen->isMouseVisible())
 		return 0;
 
 	int inventorySlot = button->index - 6;
@@ -749,5 +751,235 @@
 	movie.close();
 }
 
+int KyraEngine_v2::bookButton(Button *button) {
+	if (!queryGameFlag(1)) {
+		objectChat(getTableString(0xEB, _cCodeBuffer, 1), 0, 0x83, 0xEB); 
+		return 0;
+	}
+
+	if (!_screen->isMouseVisible())
+		return 0;
+
+	if (queryGameFlag(0xE5)) {
+		snd_playSoundEffect(0x0D);
+		return 0;
+	}
+
+	if (_itemInHand == 72) {
+		if (!queryGameFlag(0xE2)) {
+			_bookMaxPage += 2;
+			removeHandItem();
+			snd_playSoundEffect(0x6C);
+			setGameFlag(0xE2);
+		}
+
+		if (!queryGameFlag(0x18A) && queryGameFlag(0x170)) {
+			_bookMaxPage += 2;
+			removeHandItem();
+			snd_playSoundEffect(0x6C);
+			setGameFlag(0x18A);
+		}
+
+		return 0;
+	}
+
+	if (_handItemSet != -1) {
+		snd_playSoundEffect(0x0D);
+		return 0;
+	}
+
+	_screen->hideMouse();
+	showMessage(0, 0xCF);
+	displayInvWsaLastFrame();
+	_bookNewPage = _bookCurPage;
+
+	if (_screenBuffer) {
+		_screen->hideMouse();
+		memcpy(_screenBuffer, _screen->getCPagePtr(0), 64000);
+		_screen->showMouse();
+	}
+
+	memcpy(_screen->getPalette(2), _screen->getPalette(0), 768);
+	_screen->fadeToBlack(7, &_updateFunctor);
+	_res->loadFileToBuf("_BOOK.COL", _screen->getPalette(0), 768);
+	loadBookBkgd();
+	showBookPage();
+	_screen->copyRegion(0, 0, 0, 0, 0x140, 0xC8, 2, 0);
+	_screen->updateScreen();
+
+	int oldItemInHand = _itemInHand;
+	removeHandItem();
+	_screen->fadePalette(_screen->getPalette(0), 7);
+	_screen->showMouse();
+
+	bookLoop();
+
+	_screen->fadeToBlack(7);
+	_screen->hideMouse();
+	setHandItem(oldItemInHand);
+	updateMouse();
+	restorePage3();
+
+	if (_screenBuffer) {
+		_screen->hideMouse();
+		_screen->copyBlockToPage(0, 0, 0, 320, 200, _screenBuffer);
+		_screen->showMouse();
+	}
+
+	setHandItem(_itemInHand);
+	memcpy(_screen->getPalette(0), _screen->getPalette(2), 768);
+	_screen->fadePalette(_screen->getPalette(0), 7, &_updateFunctor);
+	_screen->showMouse();
+
+	if (!queryGameFlag(4) && !queryGameFlag(0xB8)) {
+		objectChat(getTableString(0xEC, _cCodeBuffer, 1), 0, 0x83, 0xEC);
+		objectChat(getTableString(0xED, _cCodeBuffer, 1), 0, 0x83, 0xED);
+		objectChat(getTableString(0xEE, _cCodeBuffer, 1), 0, 0x83, 0xEE);
+		objectChat(getTableString(0xEF, _cCodeBuffer, 1), 0, 0x83, 0xEF);
+		setGameFlag(4);
+	}
+
+	return 0;
+}
+
+void KyraEngine_v2::loadBookBkgd() {
+	char filename[16];
+	strcpy(filename, (_bookBkgd == 0) ? "_XBOOKD.CPS" : "_XBOOKC.CPS");
+	_bookBkgd ^= 1;
+
+	if (!_bookCurPage)
+		strcpy(filename, "_XBOOKB.CPS");
+	if (_bookCurPage == _bookMaxPage)
+		strcpy(filename, "_XBOOKA.CPS");
+
+	switch (_lang) {
+	case 0:
+		filename[1] = 'E';
+		break;
+
+	case 1:
+		filename[1] = 'F';
+		break;
+
+	case 2:
+		filename[2] = 'G';
+		break;
+
+	default:
+		warning("loadBookBkgd unsupported language");
+		filename[1] = 'E';
+		break;
+	}
+
+	_screen->loadBitmap(filename, 3, 3, 0);
+}
+
+void KyraEngine_v2::showBookPage() {
+	char filename[16];
+
+	sprintf(filename, "PAGE%.01X.", _bookCurPage);
+	strcat(filename, _languageExtension[_lang]);
+	uint8 *leftPage = _res->fileData(filename, 0);
+	int leftPageY = _bookPageYOffset[_bookCurPage];
+
+	sprintf(filename, "PAGE%.01X.", _bookCurPage+1);
+	strcat(filename, _languageExtension[_lang]);
+	uint8 *rightPage = (_bookCurPage != _bookMaxPage) ? _res->fileData(filename, 0) : 0;
+	int rightPageY = _bookPageYOffset[_bookCurPage+1];
+
+	_screen->hideMouse();
+	if (leftPage) {
+		bookDecodeText(leftPage);
+		bookPrintText(2, leftPage, 20, leftPageY+20, 0x31);
+		delete [] leftPage;
+	}
+
+	if (rightPage) {
+		bookDecodeText(rightPage);
+		bookPrintText(2, rightPage, 176, rightPageY+20, 0x31);
+		delete [] rightPage;
+	}
+	_screen->showMouse();
+}
+
+void KyraEngine_v2::bookLoop() {
+	static Button bookButtons[] = {
+		{ 0, 0x25, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x82, 0xBE, 0x0A, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookPrevPage },
+		{ 0, 0x26, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0xB1, 0xBE, 0x0A, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookNextPage },
+		{ 0, 0x27, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x8F, 0xBE, 0x21, 0x0A, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookClose },
+		{ 0, 0x28, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x08, 0x08, 0x90, 0xB4, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookPrevPage },
+		{ 0, 0x28, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0xAA, 0x08, 0x8E, 0xB4, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookNextPage }
+	};
+
+	Button *buttonList = 0;
+	
+	for (uint i = 0; i < ARRAYSIZE(bookButtons); ++i)
+		buttonList = addButtonToList(buttonList, &bookButtons[i]);
+
+	showBookPage();
+	_bookShown = true;
+	while (_bookShown && !_quitFlag) {
+		checkInput(buttonList);
+		removeInputTop();
+
+		if (_bookCurPage != _bookNewPage) {
+			_bookCurPage = _bookNewPage;
+			loadBookBkgd();
+			showBookPage();
+			snd_playSoundEffect(0x64);
+			_screen->hideMouse();
+			_screen->copyRegion(0, 0, 0, 0, 0x140, 0xC8, 2, 0);
+			_screen->updateScreen();
+			_screen->showMouse();
+		}
+	}
+}
+
+void KyraEngine_v2::bookDecodeText(uint8 *text) {
+	uint8 *dst = text, *op = text;
+	while (*op != 0x1A) {
+		while (*op != 0x1A && *op != 0x0D)
+			*dst++ = *op++;
+		
+		if (*op == 0x1A)
+			break;
+
+		op += 2;
+		*dst++ = 0x0D;
+	}
+	*dst = 0;
+}
+
+void KyraEngine_v2::bookPrintText(int dstPage, const uint8 *text, int x, int y, uint8 color) {
+	int curPageBackUp = _screen->_curPage;
+	_screen->_curPage = dstPage;
+
+	_screen->setTextColor(_bookTextColorMap, 0, 3);
+	Screen::FontId oldFont = _screen->setFont(Screen::FID_BOOKFONT_FNT);
+	_screen->_charWidth = -2;
+
+	_screen->hideMouse();
+	_screen->printText((const char*)text, x, y, color, 0);
+	_screen->showMouse();
+
+	_screen->_charWidth = 0;
+	_screen->setFont(oldFont);
+	_screen->_curPage = curPageBackUp;
+}
+
+int KyraEngine_v2::bookPrevPage(Button *button) {
+	_bookNewPage = MAX<int>(_bookCurPage-2, 0);
+	return 0;
+}
+
+int KyraEngine_v2::bookNextPage(Button *button) {
+	_bookNewPage = MIN<int>(_bookCurPage+2, _bookMaxPage);
+	return 0;
+}
+
+int KyraEngine_v2::bookClose(Button *button) {
+	_bookShown = false;
+	return 0;
+}
+
 } // end of namespace Kyra
-

Modified: scummvm/trunk/engines/kyra/kyra_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v2.cpp	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/kyra_v2.cpp	2008-03-09 11:28:51 UTC (rev 31084)
@@ -124,6 +124,11 @@
 	_npcTalkChpIndex = _npcTalkDlgIndex = -1;
 	_mainCharacter.dlgIndex = 0;
 	setNewDlgIndex(-1);
+
+	_bookMaxPage = 6;
+	_bookCurPage = 0;
+	_bookNewPage = 0;
+	_bookBkgd = 0;
 }
 
 KyraEngine_v2::~KyraEngine_v2() {

Modified: scummvm/trunk/engines/kyra/kyra_v2.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v2.h	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/kyra_v2.h	2008-03-09 11:28:51 UTC (rev 31084)
@@ -614,7 +614,29 @@
 
 	int scrollInventory(Button *button);
 	int buttonInventory(Button *button);
+	int bookButton(Button *button);
 
+	// -> book
+	static const int _bookPageYOffset[];
+	static const byte _bookTextColorMap[];
+
+	int _bookMaxPage;
+	int _bookNewPage;
+	int _bookCurPage;
+	int _bookBkgd;
+	bool _bookShown;
+
+	void loadBookBkgd();
+	void showBookPage();
+	void bookLoop();
+
+	void bookDecodeText(uint8 *text);
+	void bookPrintText(int dstPage, const uint8 *text, int x, int y, uint8 color);
+
+	int bookPrevPage(Button *button);
+	int bookNextPage(Button *button);
+	int bookClose(Button *button);
+
 	// localization
 	void loadCCodeBuffer(const char *file);
 	void loadOptionsBuffer(const char *file);

Modified: scummvm/trunk/engines/kyra/screen.cpp
===================================================================
--- scummvm/trunk/engines/kyra/screen.cpp	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/screen.cpp	2008-03-09 11:28:51 UTC (rev 31084)
@@ -2300,10 +2300,6 @@
 		_mouseLockCount--;
 }
 
-bool Screen::isMouseShown() const {
-	return (_mouseLockCount == 0);
-}
-
 void Screen::setShapePages(int page1, int page2) {
 	debugC(9, kDebugLevelScreen, "Screen::setShapePages(%d, %d)", page1, page2);
 	_shapePages[0] = _pagePtrs[page1];

Modified: scummvm/trunk/engines/kyra/screen.h
===================================================================
--- scummvm/trunk/engines/kyra/screen.h	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/screen.h	2008-03-09 11:28:51 UTC (rev 31084)
@@ -182,7 +182,6 @@
 	void hideMouse();
 	void showMouse();
 	void setMouseCursor(int x, int y, byte *shape);
-	bool isMouseShown() const;
 
 	// rect handling
 	virtual int getRectSize(int w, int h);

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2008-03-09 11:28:51 UTC (rev 31084)
@@ -1451,7 +1451,7 @@
 		{ 0, 0x1, 0x4F, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x00A, 0x95, 0x39, 0x1D, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, /*&KyraEngine_v2::sub_C9A1*/0 },
 		{ 0, 0x2, 0x00, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x104, 0x90, 0x3C, 0x2C, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, /*&KyraEngine_v2::sub_27037*/0 },
 		{ 0, 0x5, 0x00, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x0FA, 0x90, 0x0A, 0x2C, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, /*&KyraEngine_v2::sub_27032*/0 },
-		{ 0, 0x3, 0x00, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x0CE, 0x90, 0x2C, 0x2C, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, /*&KyraEngine_v2::gui_showBook*/0 },
+		{ 0, 0x3, 0x00, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x0CE, 0x90, 0x2C, 0x2C, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::bookButton },
 		{ 0, 0x4, 0x00, 0, 1, 1, 1, 0x4487, 0, 0, 0, 0, 0x0B6, 0x9D, 0x18, 0x1E, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::scrollInventory },
 		{ 0, 0x6, 0x00, 0, 0, 0, 0, 0x1100, 0, 0, 0, 0, 0x04D, 0x92, 0x13, 0x15, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::buttonInventory },
 		{ 0, 0x7, 0x00, 0, 0, 0, 0, 0x1100, 0, 0, 0, 0, 0x061, 0x92, 0x13, 0x15, 0xC7, 0xCF, 0xC7, 0xCF, 0xC7, 0xCF, 0, &KyraEngine_v2::buttonInventory },
@@ -1524,6 +1524,16 @@
 	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
 };
 
+const int KyraEngine_v3::_bookPageYOffset[] = {
+	0, 0, 2, 2,
+	0, 0, 2, 2,
+	0, 0, 2, 2
+};
+
+const byte KyraEngine_v3::_bookTextColorMap[] = {
+	0x00, 0xC7, 0xCF, 0x00
+};
+
 // kyra 3 static res
 
 const char *KyraEngine_v3::_soundList[] = {

Modified: scummvm/trunk/engines/kyra/text_v2.cpp
===================================================================
--- scummvm/trunk/engines/kyra/text_v2.cpp	2008-03-09 11:13:20 UTC (rev 31083)
+++ scummvm/trunk/engines/kyra/text_v2.cpp	2008-03-09 11:28:51 UTC (rev 31084)
@@ -296,6 +296,7 @@
 
 	bool running = true;
 	const uint32 endTime = _chatEndTime;
+	_skipFlag = false;
 
 	while (running && !_quitFlag) {
 		if (!_scriptInterpreter->validScript(&_chatScriptState))


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list