[Scummvm-cvs-logs] CVS: scummvm/sword1 menu.cpp,1.7,1.8 menu.h,1.4,1.5 screen.cpp,1.18,1.19 screen.h,1.7,1.8

Torbj?rn Andersson eriktorbjorn at users.sourceforge.net
Sun Dec 21 09:56:03 CET 2003


Update of /cvsroot/scummvm/scummvm/sword1
In directory sc8-pr-cvs1:/tmp/cvs-serv12945

Modified Files:
	menu.cpp menu.h screen.cpp screen.h 
Log Message:
Highlight the correct (I hope!) menu icon during conversation, and do the
cheesy menu fade-in/fade-out.


Index: menu.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/menu.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- menu.cpp	21 Dec 2003 16:50:02 -0000	1.7
+++ menu.cpp	21 Dec 2003 17:55:40 -0000	1.8
@@ -29,6 +29,35 @@
 #include "screen.h"
 #include "logic.h"
 
+enum {
+	MENU_CLOSED,
+	MENU_CLOSING,
+	MENU_OPENING,
+	MENU_OPEN
+};
+
+const byte SwordMenu::_fadeEffectTop[64] = {
+	1, 7, 5, 3, 2, 4, 6, 0,
+	3, 1, 7, 5, 4, 6, 0, 2,
+	5, 3, 1, 7, 6, 0, 2, 4,
+	7, 5, 3, 1, 0, 2, 4, 6,
+	7, 5, 3, 1, 0, 2, 4, 6,
+	5, 3, 1, 7, 6, 0, 2, 4,
+	3, 1, 7, 5, 4, 6, 0, 2,
+	1, 7, 5, 3, 2, 4, 6, 0
+};
+
+const byte SwordMenu::_fadeEffectBottom[64] = {
+	7, 6, 5, 4, 3, 2, 1, 0,
+	0, 7, 6, 5, 4, 3, 2, 1,
+	1, 0, 7, 6, 5, 4, 3, 2,
+	2, 1, 0, 7, 6, 5, 4, 3,
+	3, 2, 1, 0, 7, 6, 5, 4,
+	4, 3, 2, 1, 0, 7, 6, 5,
+	5, 4, 3, 2, 1, 0, 7, 6,
+	6, 5, 4, 3, 2, 1, 0, 7 
+};
+
 SwordMenuIcon::SwordMenuIcon(uint8 menuType, uint8 menuPos, uint32 resId, uint32 frame, SwordScreen *screen) {
 	_menuType = menuType;
 	_menuPos = menuPos;
@@ -51,17 +80,19 @@
 	_selected = pSel;
 }
 
-void SwordMenuIcon::draw(void) {
+void SwordMenuIcon::draw(const byte *fadeMask, int8 fadeStatus) {
 	uint16 x = _menuPos * 40;
 	uint16 y = (_menuType == MENU_TOP)?(0):(440);
-	_screen->showFrame(x, y, _resId, _frame + (_selected ? 1 : 0));
+	_screen->showFrame(x, y, _resId, _frame + (_selected ? 1 : 0), fadeMask, fadeStatus);
 }
 
 SwordMenu::SwordMenu(SwordScreen *pScreen, SwordMouse *pMouse) {
 	_screen = pScreen;
 	_mouse = pMouse;
-	_subjectBarShown = false;
-	_objectBarShown = false;
+	_subjectBarStatus = MENU_CLOSED;
+	_objectBarStatus = MENU_CLOSED;
+	_fadeSubject = 0;
+	_fadeObject = 0;
 	for (uint8 cnt = 0; cnt < TOTAL_subjects; cnt++)
 		_subjects[cnt] = NULL;
 	for (uint8 cnt = 0; cnt < TOTAL_pockets; cnt++)
@@ -70,6 +101,7 @@
 }
 
 uint8 SwordMenu::checkMenuClick(uint8 menuType) {
+	bool refreshMenus = false;
 	uint16 mouseEvent = _mouse->testEvent();
 	if (!mouseEvent)
 		return 0;
@@ -80,13 +112,13 @@
 			if (_subjects[cnt]->wasClicked(x, y))
 				if (mouseEvent & BS1L_BUTTON_DOWN) {
 					SwordLogic::_scriptVars[OBJECT_HELD] = _subjectBar[cnt];
-					buildSubjects();
+					refreshMenus = true;
 				} else if (mouseEvent & BS1L_BUTTON_UP) {
 					if (SwordLogic::_scriptVars[OBJECT_HELD] == _subjectBar[cnt])
 						return cnt + 1;
 					else {
 						SwordLogic::_scriptVars[OBJECT_HELD] = 0;
-						buildSubjects();
+						refreshMenus = true;
 					}
 				}
 	} else {
@@ -102,22 +134,42 @@
 						}
 					} else
 						SwordLogic::_scriptVars[OBJECT_HELD] = _menuList[cnt];
-					buildMenu();
+					refreshMenus = true;
 				} else if (mouseEvent & BS1L_BUTTON_UP) {
 					if (SwordLogic::_scriptVars[OBJECT_HELD] == _menuList[cnt]) {
 						return cnt + 1;
 					} else {
 						SwordLogic::_scriptVars[OBJECT_HELD] = 0;
-						buildMenu();
+						refreshMenus = true;
 					}
 				}
 		}
 	}
+	if (refreshMenus) {
+		if (_objectBarStatus == MENU_OPEN) {
+			buildMenu();
+			for (uint8 cnt = 0; cnt < 16; cnt++) {
+				if (_objects[cnt])
+					_objects[cnt]->draw();
+				else
+					_screen->showFrame(cnt * 40, 0, 0xffffffff, 0);
+			}
+		}
+
+		if (_subjectBarStatus == MENU_OPEN) {
+			buildSubjects();
+			for (uint8 cnt = 0; cnt < 16; cnt++) {
+				if (_subjects[cnt])
+					_subjects[cnt]->draw();
+				else
+					_screen->showFrame(cnt * 40, 440, 0xffffffff, 0);
+			}
+		}
+	}
 	return 0;
 }
 
 void SwordMenu::buildSubjects(void) {
-	_screen->clearMenu(MENU_BOT);
 	for (uint8 cnt = 0; cnt < 16; cnt++)
 		if (_subjects[cnt]) {
 			delete _subjects[cnt];
@@ -127,17 +179,76 @@
 		uint32 res = _subjectList[(_subjectBar[cnt] & 65535) - BASE_SUBJECT].subjectRes;
 		uint32 frame = _subjectList[(_subjectBar[cnt] & 65535) - BASE_SUBJECT].frameNo;
 		_subjects[cnt] = new SwordMenuIcon(MENU_BOT, cnt, res, frame, _screen);
-		_subjects[cnt]->setSelect(SwordLogic::_scriptVars[OBJECT_HELD] == _subjectBar[cnt]);
-		_subjects[cnt]->draw();
+		if (SwordLogic::_scriptVars[OBJECT_HELD])
+			_subjects[cnt]->setSelect(_subjectBar[cnt] == SwordLogic::_scriptVars[OBJECT_HELD]);
+		else
+			_subjects[cnt]->setSelect(true);
 	}
 }
 
 void SwordMenu::refresh(uint8 menuType) {
-	//warning("stub: SwordMenu::refresh())");
+	uint i;
+
+	if (menuType == MENU_TOP) {
+		if (_objectBarStatus == MENU_OPENING || _objectBarStatus == MENU_CLOSING) {
+			for (i = 0; i < 16; i++) {
+				if (_objects[i])
+					_objects[i]->draw(_fadeEffectTop, _fadeObject);
+				else
+					_screen->showFrame(i * 40, 0, 0xffffffff, 0, _fadeEffectTop, _fadeObject);
+			}
+		}
+		if (_objectBarStatus == MENU_OPENING) {
+			if (_fadeObject < 8)
+				_fadeObject++;
+			else
+				_objectBarStatus = MENU_OPEN;
+		} else if (_objectBarStatus == MENU_CLOSING) {
+			if (_fadeObject > 0)
+				_fadeObject--;
+			else {
+				for (i = 0; i < _inMenu; i++) {
+					delete _objects[i];
+					_objects[i] = NULL;
+				}
+				_objectBarStatus = MENU_CLOSED;
+			}
+		}
+	} else {
+		if (_subjectBarStatus == MENU_OPENING || _subjectBarStatus == MENU_CLOSING) {
+			for (i = 0; i < 16; i++) {
+				if (_subjects[i])
+					_subjects[i]->draw(_fadeEffectBottom, _fadeSubject);
+				else
+					_screen->showFrame(i * 40, 440, 0xffffffff, 0, _fadeEffectBottom, _fadeSubject);
+			}
+		}
+		if (_subjectBarStatus == MENU_OPENING) {
+			if (_fadeSubject < 8)
+				_fadeSubject++;
+			else
+				_subjectBarStatus = MENU_OPEN;
+		} else if (_subjectBarStatus == MENU_CLOSING) {
+			if (_fadeSubject > 0)
+				_fadeSubject--;
+			else {
+				for (i = 0; i < SwordLogic::_scriptVars[IN_SUBJECT]; i++) {
+					delete _subjects[i];
+					_subjects[i] = NULL;
+				}
+				_subjectBarStatus = MENU_CLOSED;
+			}
+		}
+	}
 }
 
 void SwordMenu::buildMenu(void) {
 	uint32 *pockets = SwordLogic::_scriptVars + POCKET_1;
+	for (uint8 cnt = 0; cnt < _inMenu; cnt++)
+		if (_objects[cnt]) {
+			delete _objects[cnt];
+			_objects[cnt] = NULL;
+		}
 	_inMenu = 0;
 	for (uint32 pocketNo = 0; pocketNo < TOTAL_pockets; pocketNo++)
 		if (pockets[pocketNo]) {
@@ -149,7 +260,7 @@
 		uint32 objHeld = SwordLogic::_scriptVars[OBJECT_HELD];
 
 		// check highlighting
-		if (SwordLogic::_scriptVars[MENU_LOOKING] || _subjectBarShown) { // either we're in the chooser or we're doing a 'LOOK AT'
+		if (SwordLogic::_scriptVars[MENU_LOOKING] || _subjectBarStatus == MENU_OPEN) { // either we're in the chooser or we're doing a 'LOOK AT'
 			if ((!objHeld) || (objHeld == _menuList[menuSlot]))
 				_objects[menuSlot]->setSelect(true);
 		} else if (SwordLogic::_scriptVars[SECOND_ITEM]) { // clicked luggage onto 2nd icon - we need to colour-highlight the 2 relevant icons & grey out the rest
@@ -164,8 +275,14 @@
 
 void SwordMenu::showMenu(uint8 menuType) {
 	if (menuType == MENU_TOP) {
-		for (uint8 cnt = 0; cnt < _inMenu; cnt++)
-			_objects[cnt]->draw();
+		if (_objectBarStatus == MENU_OPEN) {
+			for (uint8 cnt = 0; cnt < _inMenu; cnt++)
+				_objects[cnt]->draw();
+		} else if (_objectBarStatus == MENU_CLOSED) {
+			_objectBarStatus = MENU_OPENING;
+			_fadeObject = 0;
+		} else if (_objectBarStatus == MENU_CLOSING)
+			_objectBarStatus = MENU_OPENING;
 	}
 }
 
@@ -174,23 +291,12 @@
 	SwordLogic::_scriptVars[SECOND_ITEM]  = 0; // second icon no longer selected (after using one on another)
 	SwordLogic::_scriptVars[MENU_LOOKING] = 0; // no longer 'looking at' an icon
 	buildMenu();
-	if (_inMenu > 0) {	// if there's something in the object menu
-		_objectBarShown = true;
-		showMenu(MENU_TOP);
-	} else {
-		_objectBarShown = false;
-		_inMenu = 0;
-	}
+	showMenu(MENU_TOP);
 }
 
 void SwordMenu::fnEndMenu(void) {
-	if (_objectBarShown) {
-		for (uint32 cnt = 0; cnt < _inMenu; cnt++)
-			delete _objects[cnt];
-		_screen->clearMenu(MENU_TOP);
-		_screen->clearMenu(MENU_BOT);
-		_objectBarShown = false;
-	}
+	if (_objectBarStatus != MENU_CLOSED)
+		_objectBarStatus = MENU_CLOSING;
 }
 
 void SwordMenu::fnChooser(BsObject *compact) {
@@ -198,30 +304,24 @@
 	buildSubjects();
 	compact->o_logic = LOGIC_choose;
 	_mouse->controlPanel(true); // so the mouse cursor will be shown.
-	_subjectBarShown = true;
+	_subjectBarStatus = MENU_OPENING;
 }
 
 void SwordMenu::fnEndChooser(void) {
 	SwordLogic::_scriptVars[OBJECT_HELD] = 0;
-	_screen->clearMenu(MENU_BOT);
-	_screen->clearMenu(MENU_TOP);
-	for (uint8 cnt = 0; cnt < 16; cnt++)
-		if (_subjects[cnt]) {
-			delete _subjects[cnt];
-			_subjects[cnt] = NULL;
-		}
+	_subjectBarStatus = MENU_CLOSING;
+	_objectBarStatus = MENU_CLOSING;
 	_mouse->controlPanel(false);
-	_subjectBarShown = false;
 }
 
 void SwordMenu::checkTopMenu(void) {
-	if (_objectBarShown)
+	if (_objectBarStatus == MENU_OPEN)
 		checkMenuClick(MENU_TOP);
 }
 
 int SwordMenu::logicChooser(BsObject *compact) {
 	uint8 objSelected = 0;
-	if (_objectBarShown)
+	if (_objectBarStatus == MENU_OPEN)
 		objSelected = checkMenuClick(MENU_TOP);
 	if (!objSelected)
 		objSelected = checkMenuClick(MENU_BOT);

Index: menu.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/menu.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- menu.h	21 Dec 2003 16:50:02 -0000	1.4
+++ menu.h	21 Dec 2003 17:55:40 -0000	1.5
@@ -50,7 +50,7 @@
 	SwordMenuIcon(uint8 menuType, uint8 menuPos, uint32 resId, uint32 frame, SwordScreen *screen);
 	bool wasClicked(uint16 mouseX, uint16 mouseY);
 	void setSelect(bool pSel);
-	void draw(void);
+	void draw(const byte *fadeMask = NULL, int8 fadeStatus = 0);
 
 private:
 	uint8 _menuType, _menuPos;
@@ -78,8 +78,10 @@
 	void buildSubjects(void);
 	void buildMenu(void);
 	void showMenu(uint8 menuType);
-	bool _subjectBarShown; // originally "subject_status"
-	bool _objectBarShown; // originally "menu_status"
+	byte _subjectBarStatus;
+	byte _objectBarStatus;
+	int8 _fadeSubject;
+	int8 _fadeObject;
 	uint8 checkMenuClick(uint8 menuType);
 	//- lower menu, speech subjects:
 	SwordMenuIcon *_subjects[16];
@@ -92,6 +94,9 @@
 	SwordScreen *_screen;
 	SwordMouse *_mouse;
 	static const Subject _subjectList[TOTAL_subjects];
+
+	static const byte _fadeEffectTop[64];
+	static const byte _fadeEffectBottom[64];
 };
 
 #endif //BSMENU_H

Index: screen.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/screen.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- screen.cpp	21 Dec 2003 17:45:15 -0000	1.18
+++ screen.cpp	21 Dec 2003 17:55:40 -0000	1.19
@@ -723,11 +723,35 @@
 
 // ------------------- SwordMenu screen interface ---------------------------
 
-void SwordScreen::showFrame(uint16 x, uint16 y, uint32 resId, uint32 frameNo) {
-	FrameHeader *frameHead = _resMan->fetchFrame(_resMan->openFetchRes(resId), frameNo);
-	uint8 *frameData = ((uint8*)frameHead) + sizeof(FrameHeader);
-	_system->copy_rect(frameData, FROM_LE_16(frameHead->width), x, y, FROM_LE_16(frameHead->width), FROM_LE_16(frameHead->height));
-	_resMan->resClose(resId);
+void SwordScreen::showFrame(uint16 x, uint16 y, uint32 resId, uint32 frameNo, const byte *fadeMask, int8 fadeStatus) {
+	uint8 frame[40 * 40];
+	int i, j;
+
+	memset(frame, 199, sizeof(frame));	// Dark gray background
+
+	if (resId != 0xffffffff) {
+		FrameHeader *frameHead = _resMan->fetchFrame(_resMan->openFetchRes(resId), frameNo);
+		uint8 *frameData = ((uint8*)frameHead) + sizeof(FrameHeader);
+
+		for (i = 0; i < FROM_LE_16(frameHead->height); i++) {
+			for (j = 0; j < FROM_LE_16(frameHead->height); j++) {
+				frame[(i + 4) * 40 + j + 2] = frameData[i * FROM_LE_16(frameHead->width) + j];
+			}
+		}
+
+		_resMan->resClose(resId);
+	}
+
+	if (fadeMask) {
+		for (i = 0; i < 40; i++) {
+			for (j = 0; j < 40; j++) {
+				if (fadeMask[((i % 8) * 8) + (j % 8)] >= fadeStatus)
+					frame[i * 40 + j] = 0;
+			}
+		}
+	}
+
+	_system->copy_rect(frame, 40, x, y, 40, 40);
 }
 
 void SwordScreen::clearMenu(uint8 menuType) {

Index: screen.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sword1/screen.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- screen.h	21 Dec 2003 17:34:44 -0000	1.7
+++ screen.h	21 Dec 2003 17:55:40 -0000	1.8
@@ -83,7 +83,7 @@
 	bool stillFading(void);
 
 	void updateScreen(void);
-	void showFrame(uint16 x, uint16 y, uint32 resId, uint32 frameNo);
+	void showFrame(uint16 x, uint16 y, uint32 resId, uint32 frameNo, const byte *fadeMask = NULL, int8 fadeStatus = 0);
 	void clearMenu(uint8 menuType);
 
 	void fnSetParallax(uint32 screen, uint32 resId);





More information about the Scummvm-git-logs mailing list