[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.114,1.115 actor.h,1.61,1.62 events.cpp,1.48,1.49 game.cpp,1.59,1.60 input.cpp,1.37,1.38 interface.cpp,1.74,1.75 interface.h,1.40,1.41 render.cpp,1.53,1.54 saga.cpp,1.103,1.104 saga.h,1.84,1.85 script.cpp,1.63,1.64 script.h,1.75,1.76 sfuncs.cpp,1.101,1.102 sthread.cpp,1.78,1.79

Andrew Kurushin h00ligan at users.sourceforge.net
Mon Apr 18 13:04:11 CEST 2005


Update of /cvsroot/scummvm/scummvm/saga
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20932

Modified Files:
	actor.cpp actor.h events.cpp game.cpp input.cpp interface.cpp 
	interface.h render.cpp saga.cpp saga.h script.cpp script.h 
	sfuncs.cpp sthread.cpp 
Log Message:
converse support improved (still has some bugs)
fixed: now protagonist can't be target object
fixed: statusbar color
added: *mouseButtonPressed in SagaEngine


Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.114
retrieving revision 1.115
diff -u -d -r1.114 -r1.115
--- actor.cpp	18 Apr 2005 10:26:42 -0000	1.114
+++ actor.cpp	18 Apr 2005 20:03:08 -0000	1.115
@@ -260,8 +260,6 @@
 			obj->location.y = ITE_ObjectTable[i].y;
 			obj->location.z = ITE_ObjectTable[i].z;
 			obj->disabled = false;
-
-			obj->spritelistRn = 0;
 		}
 	
 	} else {
@@ -857,8 +855,8 @@
 					
 				while ((delta.u() == 0) && (delta.v() == 0)) {
 
-					if ((actor == _protagonist) && (_vm->_interface->_playfieldClicked)) {
-						_vm->_isoMap->screenPointToTileCoords(_vm->getMousePos(), pickLocation);
+					if ((actor == _protagonist) && (_vm->mouseButtonPressed())) {
+						_vm->_isoMap->screenPointToTileCoords(_vm->mousePos(), pickLocation);
 
 						if (!actorWalkTo(_protagonist->id, pickLocation)) {
 							break;
@@ -1170,7 +1168,7 @@
 
 }
 
-uint16 Actor::hitTest(const Point &testPoint) {
+uint16 Actor::hitTest(const Point &testPoint, bool skipProtagonist) {
 	CommonObjectOrderList::iterator drawOrderIterator;
 	CommonObjectDataPointer drawObject;
 	int frameNumber;
@@ -1178,6 +1176,9 @@
 	createDrawOrderList();
 	for (drawOrderIterator = _drawOrderList.begin(); drawOrderIterator != _drawOrderList.end(); ++drawOrderIterator) {
 		drawObject = drawOrderIterator.operator*();
+		if (skipProtagonist && (drawObject == _protagonist)) {
+			continue;
+		}
 		if (!getSpriteParams(drawObject, frameNumber, spriteList)) {
 			continue;
 		}

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- actor.h	18 Apr 2005 10:26:43 -0000	1.61
+++ actor.h	18 Apr 2005 20:03:09 -0000	1.62
@@ -194,6 +194,8 @@
 	int sceneNumber;			// scene
 	int scriptEntrypointNumber;	// script entrypoint number
 
+	int32 spriteListResourceId;	// sprite list resource id
+
 	Location location;			// logical coordinates
 	Point screenPosition;		// screen coordinates
 	int screenDepth;			//
@@ -205,6 +207,7 @@
 		screenDepth = screenScale = 0;
 		flags = 0;
 		frameNumber = 0;
+		spriteListResourceId = 0;
 	}
 
 };
@@ -216,7 +219,6 @@
 class ObjectData: public CommonObjectData {	
 public:
 	uint16 interactBits;
-	int32 spritelistRn;
 };
 
 class ActorData: public CommonObjectData {
@@ -238,7 +240,6 @@
 	uint8 cycleFlags;
 
 	SpriteList spriteList;		// sprite list data
-	int spriteListResourceId;	// sprite list resource id
 
 	ActorFrameSequence *frames;	// Actor's frames
 	int framesCount;			// Actor's frames count
@@ -354,7 +355,7 @@
 
 	void drawPathTest();
 
-	uint16 hitTest(const Point &testPoint);
+	uint16 hitTest(const Point &testPoint, bool skipProtagonist);
 	void takeExit(uint16 actorId, const HitZone *hitZone);
 	bool actorEndWalk(uint16 actorId, bool recurse);
 	bool actorWalkTo(uint16 actorId, const Location &toLocation);		

Index: events.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/events.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- events.cpp	18 Mar 2005 17:11:34 -0000	1.48
+++ events.cpp	18 Apr 2005 20:03:10 -0000	1.49
@@ -378,11 +378,11 @@
 			break;
 		case EVENT_SET_STATUS:
 			_vm->_interface->setStatusText((const char*)event->data);
-			_vm->_interface->drawStatusBar(_vm->_gfx->getBackBuffer());
+			_vm->_interface->drawStatusBar();
 			break;
 		case EVENT_CLEAR_STATUS:
 			_vm->_interface->setStatusText("");
-			_vm->_interface->drawStatusBar(_vm->_gfx->getBackBuffer());
+			_vm->_interface->drawStatusBar();
 			break;
 		case EVENT_RESTORE_MODE:
 			_vm->_interface->restoreMode();

Index: game.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/game.cpp,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- game.cpp	18 Mar 2005 17:11:34 -0000	1.59
+++ game.cpp	18 Apr 2005 20:03:10 -0000	1.60
@@ -50,8 +50,17 @@
 	{kPanelButtonVerb, 110, 15, 56, 10, kVerbClose, 'c', 8, 9},
 	{kPanelButtonVerb, 110, 26, 56, 10, kVerbUse, 'u', 10, 11},
 	{kPanelButtonVerb, 110, 37, 56, 10, kVerbGive, 'g', 12, 13},
-	{kPanelButtonArrow, 306, 6, 8, 5, 0, 'U', 0, 0},
-	{kPanelButtonArrow, 306, 41, 8, 5, 1, 'D', 0, 0}
+	{kPanelButtonArrow, 306, 6, 8, 5, 0, 'u', 0, 0},
+	{kPanelButtonArrow, 306, 41, 8, 5, 1, 'd', 0, 0}
+};
+
+static PanelButton ITE_ConversePanelButtons[] = {
+	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 0, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 0, '1', 0, 0},
+	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 1, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 1, '2', 0, 0},
+	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 2, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 2, '3', 0, 0},
+	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 3, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 3, '4', 0, 0},
+	{kPanelButtonArrow, 257, 6, 9, 6, 0, 'u',  0, 4, 2, 0},
+	{kPanelButtonArrow, 257, 41, 9, 6, 1, 'd', 1, 5, 3, 0}, 
 };
 
 static GameDisplayInfo ITE_DisplayInfo = {
@@ -80,7 +89,9 @@
 	1, 0,			// inventory icon x, y offset
 	3, 1,			// inventory x, y icon spacing
 	ARRAYSIZE(ITE_MainPanelButtons),
-	ITE_MainPanelButtons
+	ITE_MainPanelButtons,
+	ARRAYSIZE(ITE_ConversePanelButtons),
+	ITE_ConversePanelButtons
 };
 
 static GameResourceDescription ITE_Resources = {
@@ -196,6 +207,10 @@
 	{kPanelButtonVerb, 0, 0, 0, 0, kVerbWalkTo, ' ', 0, 0}, //TODO
 };
 
+static PanelButton IHNM_ConversePanelButtons[] = {
+	{kPanelButtonConverseText, 0, 0, 0, 0, 0, '1', 0, 0}, //TODO
+};
+
 static GameDisplayInfo IHNM_DisplayInfo = {
 	640, 480,
 	
@@ -222,7 +237,9 @@
 	0, 0,
 	0, 0,
 	ARRAYSIZE(IHNM_MainPanelButtons),
-	IHNM_MainPanelButtons
+	IHNM_MainPanelButtons,
+	ARRAYSIZE(IHNM_ConversePanelButtons),
+	IHNM_ConversePanelButtons
 };
 
 static GameResourceDescription IHNM_Resources = {

Index: input.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/input.cpp,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- input.cpp	26 Feb 2005 11:44:30 -0000	1.37
+++ input.cpp	18 Apr 2005 20:03:10 -0000	1.38
@@ -38,7 +38,7 @@
 int SagaEngine::processInput() {
 	OSystem::Event event;
 
-	Point imousePt;
+//	Point imousePt;
 
 	while (g_system->pollEvent(event)) {
 		switch (event.type) {
@@ -101,17 +101,24 @@
 				break;
 			}
 			break;
+		case OSystem::EVENT_LBUTTONUP:
+			_leftMouseButtonPressed = false;
+			break;
+		case OSystem::EVENT_RBUTTONUP:
+			_rightMouseButtonPressed = false;
+			break;
 		case OSystem::EVENT_LBUTTONDOWN:
+			_leftMouseButtonPressed = true;
+			_mousePos = event.mouse;
+			_interface->update(_mousePos, UPDATE_LEFTBUTTONCLICK);
+			break;
 		case OSystem::EVENT_RBUTTONDOWN:
-			_mousePos.x = event.mouse.x;
-			_mousePos.y = event.mouse.y;
-			imousePt = _mousePos;
-			_interface->update(imousePt, (event.type == OSystem::EVENT_LBUTTONDOWN) ? UPDATE_LEFTBUTTONCLICK : UPDATE_RIGHTBUTTONCLICK);
+			_rightMouseButtonPressed = true;
+			_mousePos = event.mouse;
+			_interface->update(_mousePos, UPDATE_RIGHTBUTTONCLICK);
 			break;
 		case OSystem::EVENT_MOUSEMOVE:
-			_mousePos.x = event.mouse.x;
-			_mousePos.y = event.mouse.y;
-			imousePt = _mousePos;
+			_mousePos = event.mouse;
 			break;
 		case OSystem::EVENT_QUIT:
 			_system->quit();
@@ -124,9 +131,6 @@
 	return SUCCESS;
 }
 
-Point SagaEngine::getMousePos() {
-	return _mousePos;
-}
 
 } // End of namespace Saga
 

Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -d -r1.74 -r1.75
--- interface.cpp	18 Apr 2005 10:26:43 -0000	1.74
+++ interface.cpp	18 Apr 2005 20:03:10 -0000	1.75
@@ -67,7 +67,6 @@
 		return;
 	}
 	
-	_playfieldClicked = false;
 
 	// Load interface module resource file context
 	_interfaceContext = _vm->getFileContext(GAME_RESOURCEFILE, 0);
@@ -97,6 +96,9 @@
 	
 	RSC_FreeResource(resource);
 
+	_conversePanel.buttons = _vm->getDisplayInfo().conversePanelButtons;
+	_conversePanel.buttonsCount = _vm->getDisplayInfo().conversePanelButtonsCount;
+
 	result = RSC_LoadResource(_interfaceContext, _vm->getResourceDescription()->conversePanelResourceId, &resource, &resourceLength);
 	if ((result != SUCCESS) || (resourceLength == 0)) {
 		error("Interface::Interface unable to load conversePanel resource");
@@ -219,6 +221,7 @@
 	} else {
 		if (_panelMode == kPanelConverse) {
 			_conversePanel.currentButton = NULL;
+			converseDisplayText();
 		}
 	}
 
@@ -277,13 +280,13 @@
 	return false;
 }
 
-int Interface::setStatusText(const char *new_txt) {
-	assert(new_txt != NULL);
-
-	strncpy(_statusText, new_txt, STATUS_TEXT_LEN);
-	_statusOnceColor = -1;
+void Interface::setStatusText(const char *text, int statusColor) {
+	assert(text != NULL);
+	assert(strlen(text) < STATUS_TEXT_LEN);
 
-	return SUCCESS;
+	strncpy(_statusText, text, STATUS_TEXT_LEN);
+	_statusOnceColor = statusColor;
+	drawStatusBar();	
 }
 
 int Interface::loadScenePortraits(int resourceId) {
@@ -310,7 +313,6 @@
 	SURFACE *backBuffer;
 	int i;
 
-	Point base;
 	Point leftPortraitPoint;
 	Point rightPortraitPoint;	
 	Point origin;
@@ -321,11 +323,9 @@
 		return SUCCESS;
 
 
-	drawStatusBar(backBuffer);
+	drawStatusBar();
 
 	if (_panelMode == kPanelMain) {
-		base.x = _mainPanel.x;
-		base.y = _mainPanel.y;
 
 		origin.x = 0;
 		origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
@@ -338,28 +338,29 @@
 			}
 		}
 	} else {
-		base.x = _conversePanel.x;
-		base.y = _conversePanel.y;
+		if (_panelMode == kPanelConverse) {	
 
-		origin.x = 0;
-		origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
+			origin.x = 0;
+			origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
 
-		bufToSurface(backBuffer, _conversePanel.image, _conversePanel.imageWidth,
-						_conversePanel.imageHeight, NULL, &origin);
-		converseDisplayText(0);
+			bufToSurface(backBuffer, _conversePanel.image, _conversePanel.imageWidth,
+				_conversePanel.imageHeight, NULL, &origin);
+
+			converseDisplayTextLines(backBuffer);
+		}
 	}
 
 	if (_panelMode == kPanelMain || _panelMode == kPanelConverse ||
 		_lockedMode == kPanelMain || _lockedMode == kPanelConverse) {
-			leftPortraitPoint.x = base.x + _vm->getDisplayInfo().leftPortraitXOffset;
-			leftPortraitPoint.y = base.y + _vm->getDisplayInfo().leftPortraitYOffset;
+			leftPortraitPoint.x = _mainPanel.x + _vm->getDisplayInfo().leftPortraitXOffset;
+			leftPortraitPoint.y = _mainPanel.y + _vm->getDisplayInfo().leftPortraitYOffset;
 			_vm->_sprite->draw(backBuffer, _defPortraits, _leftPortrait, leftPortraitPoint, 256);
 		}
 		
 
 	if (!_inMainMode && _vm->getDisplayInfo().rightPortraitXOffset >= 0) {
-		rightPortraitPoint.x = base.x + _vm->getDisplayInfo().rightPortraitXOffset;
-		rightPortraitPoint.y = base.y + _vm->getDisplayInfo().rightPortraitYOffset;
+		rightPortraitPoint.x = _mainPanel.x + _vm->getDisplayInfo().rightPortraitXOffset;
+		rightPortraitPoint.y = _mainPanel.y + _vm->getDisplayInfo().rightPortraitYOffset;
 
 		_vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
 	}
@@ -371,15 +372,10 @@
 }
 
 int Interface::update(const Point& mousePoint, int updateFlag) {
-	SURFACE *backBuffer;
 	
 	if (_vm->_scene->isInDemo() || _panelMode == kPanelFade)
 		return SUCCESS;
 
-	
-	backBuffer = _vm->_gfx->getBackBuffer();
-
-
 	if (_panelMode == kPanelMain) {
 		if (updateFlag & UPDATE_MOUSEMOVE) {
 	
@@ -389,39 +385,51 @@
 				if (_lastMousePoint.y < _vm->getSceneHeight()) {
 					_vm->_script->setNonPlayfieldVerb();
 				}
-				handleCommandUpdate(backBuffer, mousePoint);
+				handleCommandUpdate(mousePoint);
 			}
 
 		} else {
 
 			if (updateFlag & UPDATE_MOUSECLICK) {
 				if (mousePoint.y < _vm->getSceneHeight()) {
-					_playfieldClicked = true;
 					_vm->_script->playfieldClick(mousePoint, (updateFlag & UPDATE_LEFTBUTTONCLICK) != 0);										
-					_playfieldClicked = false;
 				} else {
-					handleCommandClick(backBuffer, mousePoint);
+					handleCommandClick(mousePoint);
 				}
 			}
 		}
 	}
 
-	drawStatusBar(backBuffer);
+	if (_panelMode == kPanelConverse) {
+		if (updateFlag & UPDATE_MOUSEMOVE) {
+
+			handleConverseUpdate(mousePoint);
+
+		} else {
+			if (updateFlag & UPDATE_MOUSECLICK) {
+				handleConverseClick(mousePoint);
+			}
+		}
+	}
+
 	_lastMousePoint = mousePoint;
 	return SUCCESS;
 }
 
-int Interface::drawStatusBar(SURFACE *ds) {
+void Interface::drawStatusBar() {
+	SURFACE *backBuffer;
 	Rect rect;
 
 	int string_w;
 	int color;
 
+	backBuffer = _vm->_gfx->getBackBuffer();
+
 	// Disable this for IHNM for now, since that game uses the full screen
 	// in some cases.
 
 	if (_vm->getGameType() == GType_IHNM) {
-		return SUCCESS;
+		return;
 	}
 
 
@@ -431,7 +439,7 @@
 	rect.right = _vm->getDisplayWidth();
 	rect.bottom = _vm->getDisplayInfo().statusY + _vm->getDisplayInfo().statusHeight;
 
-	drawRect(ds, &rect, _vm->getDisplayInfo().statusBGColor);
+	drawRect(backBuffer, &rect, _vm->getDisplayInfo().statusBGColor);
 
 	string_w = _vm->_font->getStringWidth(SMALL_FONT_ID, _statusText, 0, 0);
 
@@ -440,13 +448,12 @@
 	else
 		color = _statusOnceColor;
 
-	_vm->_font->draw(SMALL_FONT_ID, ds, _statusText, 0, (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2),
+	_vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2),
 			_vm->getDisplayInfo().statusY + _vm->getDisplayInfo().statusTextY, color, 0, 0);
 
-	return SUCCESS;
 }
 
-void Interface::handleCommandClick(SURFACE *ds, const Point& mousePoint) {
+void Interface::handleCommandClick(const Point& mousePoint) {
 
 	PanelButton *panelButton;
 
@@ -457,7 +464,7 @@
 	}
 }
 
-void Interface::handleCommandUpdate(SURFACE *ds, const Point& mousePoint) {
+void Interface::handleCommandUpdate(const Point& mousePoint) {
 	PanelButton *panelButton;
 
 	panelButton = verbHitTest(mousePoint);
@@ -489,10 +496,7 @@
 	for (i = 0; i < kVerbTypesMax; i++) {
 		panelButton = _verbTypeToPanelButton[i];
 		if (panelButton != NULL) {
-			rect.left = _mainPanel.x + panelButton->xOffset;
-			rect.right = rect.left + panelButton->width;
-			rect.top = _mainPanel.y + panelButton->yOffset;
-			rect.bottom = rect.top + panelButton->height;
+			_mainPanel.calcPanelButtonRect(panelButton, rect);
 			if (rect.contains(mousePoint))
 				return panelButton;
 		}
@@ -554,7 +558,7 @@
 		drawPoint.y = y + row * height;
 
 		_vm->_sprite->draw(back_buf, _vm->_sprite->_mainSprites,
-			_vm->_actor->getObj(_vm->_actor->objIndexToId(_inventory[i]))->spritelistRn,
+			_vm->_actor->getObj(_vm->_actor->objIndexToId(_inventory[i]))->spriteListResourceId,
 			drawPoint, 256);
 
 		if (++col >= _vm->getDisplayInfo().inventoryColumns) {
@@ -642,6 +646,26 @@
 	drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
 }
 
+void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) {
+	Point point;
+	int spriteNumber;
+
+	if (panel->currentButton == panelButton) {
+		if (panelButton->flag != 0) {
+			spriteNumber = panelButton->downSpriteNumber;
+		} else {
+			spriteNumber = panelButton->overSpriteNumber;
+		}
+	} else {
+		spriteNumber = panelButton->upSpriteNumber;
+	}
+		
+	point.x = panel->x + panelButton->xOffset;
+	point.y = panel->y + panelButton->yOffset;
+
+	_vm->_sprite->draw(ds, _vm->_sprite->_mainSprites, spriteNumber, point, 256);
+}
+
 void Interface::drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor) {
 	const char *text;
 	int textWidth;
@@ -674,9 +698,10 @@
 
 void Interface::converseClear(void) {
 	for (int i = 0; i < CONVERSE_MAX_TEXTS; i++) {
-		if (_converseText[i].text)
+		if (_converseText[i].text != NULL) {
 			free(_converseText[i].text);
-		_converseText[i].text = NULL;
+			_converseText[i].text = NULL;
+		}
 		_converseText[i].stringNum = -1;
 		_converseText[i].replyId = 0;
 		_converseText[i].replyFlags = 0;
@@ -688,41 +713,39 @@
 	_converseStartPos = 0;
 	_converseEndPos = 0;
 	_conversePos = -1;
-
-	for (int i = 0; i < CONVERSE_TEXT_LINES; i++) {
-		_converseLastColors[0][i] = 0;
-		_converseLastColors[1][i] = 0;
-	}
 }
 
 bool Interface::converseAddText(const char *text, int replyId, byte replyFlags, int replyBit) {
 	int count = 0;         // count how many pieces of text per string
-	char temp[128];
+	int i;
+	int len;
+	byte c;
 
-	assert(strlen(text) < 128);
+	assert(strlen(text) < CONVERSE_MAX_WORK_STRING);
 
-	strncpy(temp, text, 128);
+	strncpy(_converseWorkString, text, CONVERSE_MAX_WORK_STRING);
 
 	while (1) {
-		int i;
-		int len = strlen(temp);
+		len = strlen(_converseWorkString);
 
 		for (i = len; i >= 0; i--) {
-			byte c = temp[i];
+			c = _converseWorkString[i];
 
 			if ((c == ' ' || c == '\0')
-				&& _vm->_font->getStringWidth(SMALL_FONT_ID, temp, i, 0) 
+				&& _vm->_font->getStringWidth(SMALL_FONT_ID, _converseWorkString, i, 0) 
 					<= CONVERSE_MAX_TEXT_WIDTH)
 				break;
 		}
-		if (i < 0) 
+		if (i < 0) {
 			return true;
+		}
 
-		if (_converseTextCount == CONVERSE_MAX_TEXTS)
+		if (_converseTextCount == CONVERSE_MAX_TEXTS) {
 			return true;
+		}
 
 		_converseText[_converseTextCount].text = (char *)malloc(i + 1);
-		strncpy(_converseText[_converseTextCount].text, temp, i);
+		strncpy(_converseText[_converseTextCount].text, _converseWorkString, i);
 
 		_converseText[_converseTextCount].text[i] = 0;
 		_converseText[_converseTextCount].textNum = count;
@@ -737,7 +760,7 @@
 		if (len == i) 
 			break;
 
-		strncpy(temp, &temp[i + 1], len - i);
+		strncpy(_converseWorkString, &_converseWorkString[i + 1], len - i);
 	}
 
 	_converseStrCount++;
@@ -745,15 +768,10 @@
 	return false;
 }
 
-void Interface::converseDisplayText(int pos) {
-	int end;
-
-	if (pos >= _converseTextCount)
-		pos = _converseTextCount - 1;
-	if (pos < 0)
-		pos = 0;
+void Interface::converseDisplayText() {
+	int end;	
 
-	_converseStartPos = pos;
+	_converseStartPos = 0;
 
 	end = _converseTextCount - CONVERSE_TEXT_LINES;
 
@@ -761,93 +779,86 @@
 		end = 0;
 
 	_converseEndPos = end;
-
-	converseDisplayTextLine(kITEColorBrightWhite, false, true);
+	draw();
 }
 
 
-void Interface::converseSetTextLines(int row, int textcolor, bool btnDown) {
-	_conversePos = row + _converseStartPos;
-	if (_conversePos >= _converseTextCount)
-		_conversePos = -1;
-
-	converseDisplayTextLine(textcolor, btnDown, false);
+void Interface::converseSetTextLines(int row) {
+	int pos = row + _converseStartPos;
+	if (pos >= _converseTextCount)
+		pos = -1;
+	if (pos != _conversePos) {
+		_conversePos = pos;
+		draw();
+	}
 }
 
-void Interface::converseDisplayTextLine(int textcolor, bool btnDown, bool rebuild) {
-	int x = 52; // FIXME: remove hardcoded value
-	int y = 6; // FIXME: remove hardcoded value
-	int pos = _converseStartPos;
-	byte textcolors[2][CONVERSE_TEXT_LINES];
-	SURFACE *ds;
+void Interface::converseDisplayTextLines(SURFACE *ds) {
+	int relPos;
+	byte foregnd;
+	byte backgnd;
+	byte bulletForegnd;
+	byte bulletBackgnd;
+	const char *str;
+	char bullet[2] = {
+		(char)0xb7, 0 
+	};
+	Point point;
+	Rect rect(8, CONVERSE_TEXT_LINES * CONVERSE_TEXT_HEIGHT);
+	
+	assert(_conversePanel.buttonsCount >= 6);
 
-	ds = _vm->_gfx->getBackBuffer(); // FIXME: probably best to move this out
+	bulletForegnd = kITEColorGreen;
+	bulletBackgnd = kITEColorBlack;
+	
+	rect.moveTo(_conversePanel.x + _conversePanel.buttons[0].xOffset, 
+		_conversePanel.y + _conversePanel.buttons[0].yOffset);
 
+	drawRect(ds, &rect, kITEColorDarkGrey); //fill bullet place
+	
 	for (int i = 0; i < CONVERSE_TEXT_LINES; i++) {
-		int relpos = pos + i;
+		relPos = _converseStartPos + i;
 
-		if (_conversePos >= 0
-			&& _converseText[_conversePos].stringNum
-						== _converseText[relpos].stringNum) {
-			textcolors[0][i] = textcolor;
-			textcolors[1][i] = (!btnDown) ? kITEColorDarkGrey : kITEColorGrey;
-		} else {
-			textcolors[0][i] = kITEColorBlue;
-			textcolors[1][i] = kITEColorDarkGrey;
+		if (_converseTextCount <= relPos) {
+			break;
 		}
-	}
-		// if no colors have changed, exit
-	if (!rebuild && memcmp(textcolors, _converseLastColors, sizeof(textcolors)) == 0)
-		return;
 
-	memcpy(_converseLastColors, textcolors, sizeof(textcolors));
-
-	Rect rect(8, CONVERSE_TEXT_LINES * CONVERSE_TEXT_HEIGHT);
-	int scrx = _conversePanel.x + x;
-
-	rect.moveTo(_conversePanel.x + x, _conversePanel.y + y);
-
-	drawRect(ds, &rect, kITEColorDarkGrey);
-
-	rect.top = rect.left = 0;
-	rect.right = CONVERSE_MAX_TEXT_WIDTH;
-	rect.bottom = CONVERSE_TEXT_HEIGHT;
-
-	for (int i = 0; i < CONVERSE_TEXT_LINES; i++) {
-		byte foregnd = textcolors[0][i];
-		byte backgnd = textcolors[1][i];
-		int relpos = pos + i;
-
-		rect.moveTo(_conversePanel.x + x + 7 + 1, 
-					_conversePanel.y + y + i * CONVERSE_TEXT_HEIGHT);
+		if (_conversePos >= 0 && _converseText[_conversePos].stringNum == _converseText[relPos].stringNum) {
+			foregnd = kITEColorBrightWhite;
+			backgnd = (!_vm->leftMouseButtonPressed()) ? kITEColorDarkGrey : kITEColorGrey;
+		} else {
+			foregnd = kITEColorBlue;
+			backgnd = kITEColorDarkGrey;
+		}
 
+		_conversePanel.calcPanelButtonRect(&_conversePanel.buttons[i], rect);
+		rect.left += 8;
 		drawRect(ds, &rect, backgnd);
 
-		if (_converseTextCount > i) {
-			const char *str = _converseText[relpos].text;
-			char bullet[] = { (char)0xb7, 0 };
-			int scry = i * CONVERSE_TEXT_HEIGHT + _conversePanel.y + y;
-			byte tcolor, bcolor;
+		str = _converseText[relPos].text;
 
-			if (_converseText[relpos].textNum == 0) { // first entry
-				tcolor = kITEColorGreen;
-				bcolor = kITEColorBlack;
-				_vm->_font->draw(SMALL_FONT_ID, ds, bullet, strlen(bullet),
-								 scrx + 2, scry, tcolor, bcolor, FONT_SHADOW | FONT_DONTMAP);
-			}
-			_vm->_font->draw(SMALL_FONT_ID, ds, str, strlen(str),
-							 scrx + 9, scry, foregnd, kITEColorBlack, FONT_SHADOW);
+		if (_converseText[relPos].textNum == 0) { // first entry
+			_vm->_font->draw(SMALL_FONT_ID, ds, bullet, 1,
+				rect.left - 6, rect.top, bulletForegnd, bulletBackgnd, FONT_SHADOW | FONT_DONTMAP);
 		}
+		_vm->_font->draw(SMALL_FONT_ID, ds, str, strlen(str),
+			rect.left + 1, rect.top, foregnd, kITEColorBlack, FONT_SHADOW);
 	}
 
-	// FIXME: TODO: arrows
+	if (_converseStartPos != 0) {
+		drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[4]);
+	}
+
+	if (_converseStartPos != _converseEndPos) {
+		drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[5]);
+	}
 }
 
 void Interface::converseChangePos(int chg) {
 	if ((chg < 0 && _converseStartPos + chg >= 0) ||
 		(chg > 0 && _converseStartPos  < _converseEndPos)) {
 		_converseStartPos += chg;
-		converseDisplayTextLine(kITEColorBlue, false, true);
+		draw();
 	}
 }
 
@@ -858,8 +869,7 @@
 	if (selection >= _converseTextCount)
 		return;
 
-	// FIXME: wait until Andrew defines proper color
-	converseSetTextLines(selection, kITEColorBrightWhite, false);
+	converseSetTextLines(selection);
 
 	ct = &_converseText[_conversePos];
 
@@ -870,5 +880,79 @@
 	_conversePos = -1;
 }
 
+PanelButton *Interface::converseHitTest(const Point& mousePoint) {
+	PanelButton *panelButton;
+	Rect rect;
+	int i;
+	for (i = 0; i < _conversePanel.buttonsCount; i++) {
+		panelButton = &_conversePanel.buttons[i];
+		if (panelButton != NULL) {
+			_conversePanel.calcPanelButtonRect(panelButton, rect);
+			if (rect.contains(mousePoint)) {
+				return panelButton;
+			}
+		}
+	}
+
+	return NULL;
+}
+
+void Interface::handleConverseUpdate(const Point& mousePoint) {
+	Rect rect;
+	bool changed;
+
+	PanelButton *last = _conversePanel.currentButton;
+	
+	if (!_vm->mouseButtonPressed()) {			// remove pressed flag
+		_conversePanel.buttons[4].flag = 0;
+		_conversePanel.buttons[5].flag = 0;
+	}
+
+	_conversePanel.currentButton = converseHitTest(mousePoint);
+	changed = last != _conversePanel.currentButton;
+	
+
+	if (_conversePanel.currentButton == NULL) {
+		_conversePos = -1;
+		if (changed) {
+			draw();
+		}
+		return;
+	}
+
+	if (_conversePanel.currentButton->type == kPanelButtonConverseText) {
+		converseSetTextLines(_conversePanel.currentButton->id);
+	}
+	
+	if (_conversePanel.currentButton->type == kPanelButtonArrow) {
+		if (_conversePanel.currentButton->flag == 1) {
+			//TODO: insert timeout catchup
+			converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+		}
+		draw();
+	}	
+}
+
+
+void Interface::handleConverseClick(const Point& mousePoint) {
+	Rect rect;
+
+	_conversePanel.currentButton = converseHitTest(mousePoint);
+
+	if (_conversePanel.currentButton == NULL) {
+		return;
+	}
+
+	if (_conversePanel.currentButton->type == kPanelButtonConverseText) {
+		converseSetPos(_conversePanel.currentButton->keyChar);
+	}
+
+	if (_conversePanel.currentButton->type == kPanelButtonArrow) {
+		_conversePanel.currentButton->flag = 1;
+		converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+	}	
+
+}
+
 
 } // End of namespace Saga

Index: interface.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- interface.h	26 Feb 2005 17:37:16 -0000	1.40
+++ interface.h	18 Apr 2005 20:03:12 -0000	1.41
@@ -49,6 +49,7 @@
 #define CONVERSE_MAX_TEXT_WIDTH (256 - 60)
 #define CONVERSE_TEXT_HEIGHT	10
 #define CONVERSE_TEXT_LINES     4
+#define CONVERSE_MAX_WORK_STRING      128
 
 enum PanelModes {
 	kPanelNull,
@@ -78,6 +79,13 @@
 	int buttonsCount;
 	PanelButton *buttons;
 	SpriteList sprites;
+	
+	void calcPanelButtonRect(const PanelButton* panelButton, Rect &rect) {
+		rect.left = x + panelButton->xOffset;
+		rect.right = rect.left + panelButton->width;
+		rect.top = y + panelButton->yOffset;
+		rect.bottom = rect.top + panelButton->height;
+	}
 };
 
 
@@ -106,7 +114,6 @@
 
 class Interface {
 public:
-	bool _playfieldClicked;
 
 	Interface(SagaEngine *vm);
 	~Interface(void);
@@ -119,14 +126,13 @@
 	void rememberMode();
 	void restoreMode();
 	bool isInMainMode() { return _inMainMode; }
-	int setStatusText(const char *new_txt);
-	void setStatusOnceColor(int color) { _statusOnceColor = color; }
+	void setStatusText(const char *text, int statusColor = -1);
 	int loadScenePortraits(int resourceId);
 	int setLeftPortrait(int portrait);
 	int setRightPortrait(int portrait);
 	int draw();
 	int update(const Point& mousePoint, int updateFlag);
-	int drawStatusBar(SURFACE *ds);
+	void drawStatusBar();
 	void drawVerb(int verb, int state);
 
 	bool processKeyCode(int keyCode);
@@ -138,25 +144,29 @@
 private:
 	int inventoryTest(const Point& imousePt, int *ibutton);
 	PanelButton *verbHitTest(const Point& mousePoint);
-	void handleCommandUpdate(SURFACE *ds, const Point& mousePoint);
-	void handleCommandClick(SURFACE *ds, const Point& mousePoint);
+	void handleCommandUpdate(const Point& mousePoint);
+	void handleCommandClick(const Point& mousePoint);
+	PanelButton *converseHitTest(const Point& mousePoint);
+	void handleConverseUpdate(const Point& mousePoint);
+	void handleConverseClick(const Point& mousePoint);
 	
 	void lockMode() { _lockedMode = _panelMode; }
 	void unlockMode() { _panelMode = _lockedMode; }
 
 	void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor);
+	void drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton);
 
 public:
 	void converseInit(void);
 	void converseClear(void);
 	bool converseAddText(const char *text, int replyId, byte replyFlags, int replyBit);
-	void converseDisplayText(int pos);
-	void converseSetTextLines(int row, int textcolor, bool btnDown);
+	void converseDisplayText();
+	void converseSetTextLines(int row);
 	void converseChangePos(int chg);
 	void converseSetPos(int key);
 
 private:
-	void converseDisplayTextLine(int textcolor, bool btnUp, bool rebuild);
+	void converseDisplayTextLines(SURFACE *ds);
 	PanelButton *getPanelButtonByVerbType(int verb) {
 		if ((verb < 0) || (verb >= kVerbTypesMax)) {
 			error("Interface::getPanelButtonByVerbType wrong verb");
@@ -190,14 +200,13 @@
 	int _inventorySize;
 	byte _inventoryCount;
 
+	char _converseWorkString[CONVERSE_MAX_WORK_STRING];
 	Converse _converseText[CONVERSE_MAX_TEXTS];
 	int _converseTextCount;
 	int _converseStrCount;
 	int _converseStartPos;
 	int _converseEndPos;
 	int _conversePos;
-
-	byte _converseLastColors[2][CONVERSE_TEXT_LINES];
 };
 
 } // End of namespace Saga

Index: render.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/render.cpp,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- render.cpp	3 Apr 2005 15:32:03 -0000	1.53
+++ render.cpp	18 Apr 2005 20:03:12 -0000	1.54
@@ -112,7 +112,7 @@
 	backbuf_surface = _backbuf_surface;
 
 	// Get mouse coordinates
-	mouse_pt = _vm->getMousePos();
+	mouse_pt = _vm->mousePos();
 
 	_vm->_scene->getBGInfo(&bg_info);
 	bg_pt.x = 0;

Index: saga.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.cpp,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -d -r1.103 -r1.104
--- saga.cpp	3 Apr 2005 15:32:03 -0000	1.103
+++ saga.cpp	18 Apr 2005 20:03:12 -0000	1.104
@@ -116,6 +116,8 @@
 SagaEngine::SagaEngine(GameDetector *detector, OSystem *syst)
 	: Engine(syst) {
 
+	_leftMouseButtonPressed = _rightMouseButtonPressed = false;
+
 	_console = NULL;
 	_gameFileContexts = NULL;
 	_quit = false;

Index: saga.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.h,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- saga.h	6 Apr 2005 12:19:07 -0000	1.84
+++ saga.h	18 Apr 2005 20:03:12 -0000	1.85
@@ -139,7 +139,8 @@
 
 enum PanelButtonType {
 	kPanelButtonVerb = 0,
-	kPanelButtonArrow = 1
+	kPanelButtonArrow = 1,
+	kPanelButtonConverseText = 2
 };
 
 enum TextStringIds {
@@ -311,6 +312,8 @@
 	int keyChar;
 	int upSpriteNumber;
 	int downSpriteNumber;
+	int overSpriteNumber;
+	int flag;
 };
 
 struct GameDisplayInfo {
@@ -348,6 +351,8 @@
 	int inventoryYSpacing;
 	int mainPanelButtonsCount;
 	PanelButton *mainPanelButtons;
+	int conversePanelButtonsCount;
+	PanelButton *conversePanelButtons;
 };
 
 
@@ -475,10 +480,26 @@
 			double percent);
 
 	int processInput(void);
-	Point getMousePos();
+	const Point &mousePos() const {
+		return _mousePos;
+	}
+
+	const bool leftMouseButtonPressed() const {
+		return _leftMouseButtonPressed;
+	}
+
+	const bool rightMouseButtonPressed() const {
+		return _rightMouseButtonPressed;
+	}
+
+	const bool mouseButtonPressed() const {
+		return _leftMouseButtonPressed || _rightMouseButtonPressed;
+	}
 
  private:
 	Point _mousePos;
+	bool _leftMouseButtonPressed;
+	bool _rightMouseButtonPressed;
 
 	bool _quit;
 	RSCFILE_CONTEXT **_gameFileContexts;

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.cpp,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -d -r1.63 -r1.64
--- script.cpp	3 Apr 2005 15:32:03 -0000	1.63
+++ script.cpp	18 Apr 2005 20:03:13 -0000	1.64
@@ -350,7 +350,7 @@
 }
 
 // verb
-void Script::showVerb(int statuscolor) {
+void Script::showVerb(int statusColor) {
 	const char *verbName;
 	const char *object1Name;
 	const char *object2Name;
@@ -365,7 +365,7 @@
 	verbName = _mainStrings.getString(_leftButtonVerb - 1);
 
 	if (objectTypeId(_currentObject[0]) == kGameObjectNone) {
-		_vm->_interface->setStatusText(verbName);
+		_vm->_interface->setStatusText(verbName, statusColor);
 		return;
 	}
 
@@ -373,7 +373,7 @@
 
 	if (!_secondObjectNeeded) {
 		snprintf(statusString, STATUS_TEXT_LEN, "%s %s", verbName, object1Name);
-		_vm->_interface->setStatusText(statusString);
+		_vm->_interface->setStatusText(statusString, statusColor);
 		return;
 	}
 
@@ -386,18 +386,16 @@
 
 	if (_leftButtonVerb == kVerbGive) {
 		snprintf(statusString, STATUS_TEXT_LEN, "Give %s to %s", object1Name, object2Name);
-		_vm->_interface->setStatusText(statusString);
+		_vm->_interface->setStatusText(statusString, statusColor);
 	} else {
 		if (_leftButtonVerb == kVerbUse) {
 			snprintf(statusString, STATUS_TEXT_LEN, "Use %s with %s", object1Name, object2Name);
-			_vm->_interface->setStatusText(statusString);
+			_vm->_interface->setStatusText(statusString, statusColor);
 		} else {
 			snprintf(statusString, STATUS_TEXT_LEN, "%s %s", verbName, object1Name);
-			_vm->_interface->setStatusText(statusString);
+			_vm->_interface->setStatusText(statusString, statusColor);
 		}
 	}
-	if (statuscolor != -1)
-		_vm->_interface->setStatusOnceColor(statuscolor);
 }
 
 void Script::setVerb(int verb) {
@@ -518,11 +516,9 @@
 }
 
 void Script::setPointerVerb() {
-	Point mousePoint;
-	mousePoint = _vm->getMousePos();
 	if (_vm->_interface->isActive()) {
 		_pointerObject = ID_PROTAG;
-		whichObject(mousePoint);
+		whichObject(_vm->mousePos());
 	}
 }
 
@@ -689,7 +685,7 @@
 
 	if (_vm->_actor->_protagonist->currentAction == kActionWalkDir) {
 	} else {
-		newObjectId = _vm->_actor->hitTest(mousePoint);
+		newObjectId = _vm->_actor->hitTest(mousePoint, true);
 
 		if (newObjectId != ID_NOTHING) {
 			if (objectTypeId(newObjectId) == kGameObjectObject) {

Index: script.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.h,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -d -r1.75 -r1.76
--- script.h	17 Apr 2005 11:53:25 -0000	1.75
+++ script.h	18 Apr 2005 20:03:13 -0000	1.76
@@ -354,7 +354,7 @@
 	bool isVoiceLUTPresent() const { return _voiceLUTPresent; }
 
 	void doVerb();
-	void showVerb(int statuscolor = -1);
+	void showVerb(int statusColor = -1);
 	void setVerb(int verb);
 	int getCurrentVerb() const { return _currentVerb; }
 	void setPointerVerb();

Index: sfuncs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sfuncs.cpp,v
retrieving revision 1.101
retrieving revision 1.102
diff -u -d -r1.101 -r1.102
--- sfuncs.cpp	18 Apr 2005 10:26:43 -0000	1.101
+++ sfuncs.cpp	18 Apr 2005 20:03:13 -0000	1.102
@@ -374,7 +374,8 @@
 	if (_vm->_interface->isInMainMode())
 		_vm->_interface->setMode(kPanelConverse);
 	else
-		_vm->_interface->converseDisplayText(0);
+		_vm->_interface->converseDisplayText();
+		
 	_vm->_interface->setMode(kPanelNull);
 }
 
@@ -748,7 +749,7 @@
 	}
 
 	obj->sceneNumber = _vm->_scene->currentSceneNumber();
-	obj->spritelistRn = 9 + sprite_param;
+	obj->spriteListResourceId = 9 + sprite_param;
 	obj->location.x = x_param;
 	obj->location.y = y_param;
 }

Index: sthread.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sthread.cpp,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- sthread.cpp	11 Apr 2005 15:34:13 -0000	1.78
+++ sthread.cpp	18 Apr 2005 20:03:14 -0000	1.79
@@ -654,6 +654,7 @@
 				_vm->_interface->activate();
 				_vm->_interface->setMode(kPanelConverse);
 				thread->wait(kWaitTypeDialogEnd);
+				return false;
 			}
 			break;
 		CASEOP(opReply) {





More information about the Scummvm-git-logs mailing list