[Scummvm-cvs-logs] CVS: scummvm/saga actor.cpp,1.118,1.119 actor.h,1.64,1.65 game.cpp,1.61,1.62 interface.cpp,1.80,1.81 interface.h,1.43,1.44 itedata.h,1.2,1.3 saga.cpp,1.104,1.105 saga.h,1.86,1.87 script.cpp,1.64,1.65 sfuncs.cpp,1.103,1.104 sprite.cpp,1.46,1.47 sprite.h,1.17,1.18

Andrew Kurushin h00ligan at users.sourceforge.net
Fri Apr 22 07:12:09 CEST 2005


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

Modified Files:
	actor.cpp actor.h game.cpp interface.cpp interface.h itedata.h 
	saga.cpp saga.h script.cpp sfuncs.cpp sprite.cpp sprite.h 
Log Message:
implemented inventory
todo: timeout catchup & capital 'U' & 'D' handling

Index: actor.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.cpp,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -d -r1.118 -r1.119
--- actor.cpp	21 Apr 2005 01:30:06 -0000	1.118
+++ actor.cpp	22 Apr 2005 14:10:57 -0000	1.119
@@ -252,7 +252,7 @@
 			debug(9, "init obj id=%d index=%d", obj->id, obj->index);
 			obj->nameIndex = ITE_ObjectTable[i].nameIndex;
 			obj->scriptEntrypointNumber = ITE_ObjectTable[i].scriptEntrypointNumber;
-			obj->frameNumber = ITE_ObjectTable[i].frameNumber;
+			obj->spriteListResourceId = ITE_ObjectTable[i].spriteListResourceId;
 			obj->sceneNumber = ITE_ObjectTable[i].sceneIndex;
 			obj->interactBits = ITE_ObjectTable[i].interactBits;
 			obj->flags = 0;
@@ -550,7 +550,7 @@
 }
 
 void Actor::setProtagState(int state) {
-	debug(0, "STUB: setProtagState(%d)", state);
+	debug(0, "STUB: setProtagState(%d)", state); //TODO: do it
 	_protagState = state;
 }
 

Index: actor.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/actor.h,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- actor.h	21 Apr 2005 01:30:07 -0000	1.64
+++ actor.h	22 Apr 2005 14:10:59 -0000	1.65
@@ -314,6 +314,8 @@
 
 
 class Actor {
+	friend class IsoMap;
+	friend class SagaEngine;
 public:
 	ActorData *_centerActor;
 	ActorData *_protagonist;
@@ -430,8 +432,6 @@
 	CommonObjectOrderList _drawOrderList;
 	
 protected:
-	friend class IsoMap;
-	friend class SagaEngine;
 	int _actorsCount;
 	ActorData **_actors;
 

Index: game.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/game.cpp,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- game.cpp	19 Apr 2005 07:44:00 -0000	1.61
+++ game.cpp	22 Apr 2005 14:11:00 -0000	1.62
@@ -42,25 +42,35 @@
 
 // ITE section
 static PanelButton ITE_MainPanelButtons[] = {
-	{kPanelButtonVerb, 52, 4, 57, 10, kVerbWalkTo, 'w', 0, 1, 0, 0},
-	{kPanelButtonVerb, 52, 15, 57, 10, kVerbLookAt, 'l', 2, 3, 0, 0},
-	{kPanelButtonVerb, 52, 26, 57, 10, kVerbPickUp, 'p', 4, 5, 0, 0}, 
-	{kPanelButtonVerb, 52, 37, 57, 10, kVerbTalkTo, 't', 0, 1, 0, 0},
-	{kPanelButtonVerb, 110, 4, 56, 10, kVerbOpen, 'o', 6, 7, 0, 0},
-	{kPanelButtonVerb, 110, 15, 56, 10, kVerbClose, 'c', 8, 9, 0, 0},
-	{kPanelButtonVerb, 110, 26, 56, 10, kVerbUse, 'u', 10, 11, 0, 0},
-	{kPanelButtonVerb, 110, 37, 56, 10, kVerbGive, 'g', 12, 13, 0, 0},
-	{kPanelButtonArrow, 306, 6, 8, 5, 0, 'u', 0, 0, 0, 0},
-	{kPanelButtonArrow, 306, 41, 8, 5, 1, 'd', 0, 0, 0, 0}
+	{kPanelButtonVerb,		52,4,	57,10,	kVerbWalkTo,'w',0,	0,1,0},
+	{kPanelButtonVerb,		52,15,	57,10,	kVerbLookAt,'l',0,	2,3,0},
+	{kPanelButtonVerb,		52,26,	57,10,	kVerbPickUp,'p',0,	4,5,0}, 
+	{kPanelButtonVerb,		52,37,	57,10,	kVerbTalkTo,'t',0,	0,1,0},
+	{kPanelButtonVerb,		110,4,	56,10,	kVerbOpen,'o',0,	6,7,0},
+	{kPanelButtonVerb,		110,15,	56,10,	kVerbClose,'c',0,	8,9,0},
+	{kPanelButtonVerb,		110,26,	56,10,	kVerbUse,'u',0,		10,11,0},
+	{kPanelButtonVerb,		110,37,	56,10,	kVerbGive,'g',0,	12,13,0},
+	{kPanelButtonArrow,		306,6,	8,5,	-1,'U',0,			0,4,2},
+	{kPanelButtonArrow,		306,41,	8,5,	1,'D',0,			1,5,3},
+	
+	{kPanelButtonInventory,	181 + 32*0,6,	27,18,	0,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*1,6,	27,18,	1,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*2,6,	27,18,	2,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*3,6,	27,18,	3,'-',0,	0,0,0},
+
+	{kPanelButtonInventory,	181 + 32*0,27,	27,18,	4,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*1,27,	27,18,	5,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*2,27,	27,18,	6,'-',0,	0,0,0},
+	{kPanelButtonInventory,	181 + 32*3,27,	27,18,	7,'-',0,	0,0,0}
 };
 
 static PanelButton ITE_ConversePanelButtons[] = {
-	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 0, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 0, '1', 0, 0, 0, 0},
-	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 1, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 1, '2', 0, 0, 0, 0},
-	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 2, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 2, '3', 0, 0, 0, 0},
-	{kPanelButtonConverseText, 52, 6 + CONVERSE_TEXT_HEIGHT * 3, CONVERSE_MAX_TEXT_WIDTH, CONVERSE_TEXT_HEIGHT, 3, '4', 0, 0, 0, 0},
-	{kPanelButtonArrow, 257, 6, 9, 6, 0, 'u',  0, 4, 2, 0},
-	{kPanelButtonArrow, 257, 41, 9, 6, 1, 'd', 1, 5, 3, 0}, 
+	{kPanelButtonConverseText,	52,6 + CONVERSE_TEXT_HEIGHT * 0, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT,	0,'1',0,	0,0,0},
+	{kPanelButtonConverseText,	52,6 + CONVERSE_TEXT_HEIGHT * 1, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT,	1,'2',0,	0,0,0},
+	{kPanelButtonConverseText,	52,6 + CONVERSE_TEXT_HEIGHT * 2, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT,	2,'3',0,	0,0,0},
+	{kPanelButtonConverseText,	52,6 + CONVERSE_TEXT_HEIGHT * 3, CONVERSE_MAX_TEXT_WIDTH,CONVERSE_TEXT_HEIGHT,	3,'4',0,	0,0,0},
+	{kPanelButtonArrow,			257,6,	9,6,	-1,'u',0,	0,4,2},
+	{kPanelButtonArrow,			257,41,	9,6,	1,'d',0,	1,5,3}, 
 };
 
 static GameDisplayInfo ITE_DisplayInfo = {
@@ -68,8 +78,9 @@
 	
 	35,				// scene path y offset
 	137,			// scene height
-
-	137,			// status y
+	
+	0,				// status x offset
+	137,			// status y offset
 	320,			// status width
 	12,				// status height
 	2,				// status text y offset
@@ -83,13 +94,16 @@
 	5, 4,			// left portrait x, y offset
 	274, 4,			// right portrait x, y offset
 
-	181, 155,		// inventory x, y
-	2, 4,			// inventory rows, columns 
-	29, 20,			// inventory icon width, height
-	1, 0,			// inventory icon x, y offset
-	3, 1,			// inventory x, y icon spacing
+	8, 9,			// inventory Up & Down button indexies
+	2, 4,			// inventory rows, columns
+
+	0, 149,			// main panel offsets
 	ARRAYSIZE(ITE_MainPanelButtons),
 	ITE_MainPanelButtons,
+
+	4, 5,			// converse Up & Down button indexies
+
+	0, 149,			// converse panel offsets
 	ARRAYSIZE(ITE_ConversePanelButtons),
 	ITE_ConversePanelButtons
 };
@@ -204,40 +218,44 @@
 // IHNM section
 
 static PanelButton IHNM_MainPanelButtons[] = {
-	{kPanelButtonVerb, 0, 0, 0, 0, kVerbWalkTo, ' ', 0, 0, 0, 0}, //TODO
+	{kPanelButtonVerb, 0,0, 0,0, kVerbWalkTo,' ',0, 0,0,0}, //TODO
 };
 
 static PanelButton IHNM_ConversePanelButtons[] = {
-	{kPanelButtonConverseText, 0, 0, 0, 0, 0, '1', 0, 0, 0, 0}, //TODO
+	{kPanelButtonConverseText, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO
 };
 
-static GameDisplayInfo IHNM_DisplayInfo = {
-	640, 480,
+static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all
+	640, 480,	// logical width&height
 	
-	0, //TODO: correct pathStartY
-	304, //TODO: correct sceneHeight
+	0,			// scene path y offset
+	304,		// scene height
 
-	304,
-	640,
-	24,
-	8,
-	186,
-	11,
+	0,			// status x offset
+	304,		// status y offset
+	640,		// status width
+	24,			// status height
+	8,			// status text y offset
+	186,		// status text color
+	11,			// status BG color
 
-	147,
-	15,
-	96,
+	147,		// verb text color
+	15,			// verb text shadow color
+	96,			// verb text active color
 
-	5, 4,
-	-1, -1,
+	5, 4,		// left portrait x, y offset
+	-1, -1,		// right portrait x, y offset
 
-	0, 0, //TODO: fill it all
-	0, 0,
-	0, 0,
-	0, 0,
-	0, 0,
+	-1, -1,		// inventory Up & Down button indexies
+	0, 0,		// inventory rows, columns
+
+	0, 149,		// main panel offsets
 	ARRAYSIZE(IHNM_MainPanelButtons),
 	IHNM_MainPanelButtons,
+
+	-1, -1,		// converse Up & Down button indexies
+
+	0, 0,		// converse panel offsets
 	ARRAYSIZE(IHNM_ConversePanelButtons),
 	IHNM_ConversePanelButtons
 };

Index: interface.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.cpp,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -d -r1.80 -r1.81
--- interface.cpp	22 Apr 2005 01:38:27 -0000	1.80
+++ interface.cpp	22 Apr 2005 14:11:01 -0000	1.81
@@ -116,13 +116,18 @@
 	}
 
 
-	_mainPanel.x = 0;		//TODO: move constant to DisplayInfo
-	_mainPanel.y = 149;
+	_mainPanel.x = _vm->getDisplayInfo().mainPanelXOffset;
+	_mainPanel.y = _vm->getDisplayInfo().mainPanelYOffset;
 	_mainPanel.currentButton = NULL;
+	_inventoryUpButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryUpButtonIndex);
+	_inventoryDownButton = _mainPanel.getButton(_vm->getDisplayInfo().inventoryDownButtonIndex);
+	
 
-	_conversePanel.x = 0;	//TODO: move constant to DisplayInfo
-	_conversePanel.y = 149;
+	_conversePanel.x = _vm->getDisplayInfo().conversePanelXOffset;
+	_conversePanel.y = _vm->getDisplayInfo().conversePanelYOffset;
 	_conversePanel.currentButton = NULL;
+	_converseUpButton = _conversePanel.getButton(_vm->getDisplayInfo().converseUpButtonIndex);
+	_converseDownButton = _conversePanel.getButton(_vm->getDisplayInfo().converseDownButtonIndex);
 
 	_leftPortrait = 0;
 	_rightPortrait = 0;
@@ -135,6 +140,10 @@
 	_statusOnceColor = -1;
 
 	_inventoryCount = 0;
+	_inventoryPos = 0;
+	_inventoryStart = 0;
+	_inventoryEnd = 0;
+	_inventoryBox = 0;
 	_inventorySize = ITE_INVENTORY_SIZE;
 
 	_inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16));
@@ -233,6 +242,7 @@
 
 bool Interface::processKeyCode(int keyCode) {
 	int i;
+	PanelButton *panelButton;
 	switch (_panelMode) {
 	case kPanelNull:
 		if (keyCode == 27) {// Esc
@@ -245,12 +255,16 @@
 		}
 		break;
 	case kPanelMain:
-		for (i = 0; i < kVerbTypesMax; i++) {
-			if (_verbTypeToPanelButton[i] != NULL) {
-				if (_verbTypeToPanelButton[i]->keyChar == keyCode) {
-					_vm->_script->setVerb(_verbTypeToPanelButton[i]->id);
-					return true;
-				}
+		for (i = 0; i < _mainPanel.buttonsCount; i++) {
+			panelButton = &_mainPanel.buttons[i];
+			if (panelButton->keyChar == keyCode) {
+				if (panelButton->type == kPanelButtonVerb) {
+					_vm->_script->setVerb(panelButton->id);
+				}			
+				if (panelButton->type == kPanelButtonArrow) {
+					inventoryChangePos(panelButton->id);
+				}			
+				return true;
 			}
 		}
 		break;
@@ -310,6 +324,39 @@
 	return SUCCESS;
 }
 
+void Interface::drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton) {
+	PanelButton * rightButtonVerbPanelButton;
+	PanelButton * currentVerbPanelButton;
+	int textColor;
+	int spriteNumber;
+	Point point;
+
+	rightButtonVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getRightButtonVerb());
+	currentVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getCurrentVerb());
+
+	if (panelButton->state) {
+		textColor = _vm->getDisplayInfo().verbTextActiveColor;
+	} else {
+		if (panelButton == rightButtonVerbPanelButton) {
+			textColor = _vm->getDisplayInfo().verbTextActiveColor;
+		} else {
+			textColor = _vm->getDisplayInfo().verbTextColor;
+		}
+	}
+
+	if (panelButton == currentVerbPanelButton) {
+		spriteNumber = panelButton->downSpriteNumber;
+	} else {
+		spriteNumber = panelButton->upSpriteNumber;
+	}
+	point.x = _mainPanel.x + panelButton->xOffset;
+	point.y = _mainPanel.y + panelButton->yOffset;
+
+	_vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
+
+	drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
+}
+
 int Interface::draw() {
 	SURFACE *backBuffer;
 	int i;
@@ -332,10 +379,9 @@
 		origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight;
 
 		bufToSurface(backBuffer, _mainPanel.image, _mainPanel.imageWidth, _mainPanel.imageHeight, NULL, &origin);
-		//here we will draw verbs
 		for (i = 0; i < kVerbTypesMax; i++) {
 			if (_verbTypeToPanelButton[i] != NULL) {
-				drawPanelButtonText(backBuffer, &_mainPanel, _verbTypeToPanelButton[i], _vm->getDisplayInfo().verbTextColor, _vm->getDisplayInfo().verbTextShadowColor);
+				drawVerbPanel(backBuffer, _verbTypeToPanelButton[i]);
 			}
 		}
 	} else {
@@ -366,9 +412,7 @@
 		_vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);
 	}
 
-	if (_inMainMode) {
-		drawInventory();
-	}
+	drawInventory();
 	return SUCCESS;
 }
 
@@ -379,11 +423,14 @@
 
 	if (_panelMode == kPanelMain) {
 		if (updateFlag & UPDATE_MOUSEMOVE) {
-	
+			bool lastWasPlayfield = _lastMousePoint.y < _vm->getSceneHeight();
 			if (mousePoint.y < _vm->getSceneHeight()) {
+				if (!lastWasPlayfield) {
+					handleCommandUpdate(mousePoint);
+				}
 				_vm->_script->whichObject(mousePoint);
 			} else {
-				if (_lastMousePoint.y < _vm->getSceneHeight()) {
+				if (lastWasPlayfield) {
 					_vm->_script->setNonPlayfieldVerb();
 				}
 				handleCommandUpdate(mousePoint);
@@ -435,10 +482,10 @@
 
 
 	// Erase background of status bar
-	rect.left = 0;
-	rect.top = _vm->getDisplayInfo().statusY;
-	rect.right = _vm->getDisplayWidth();
-	rect.bottom = _vm->getDisplayInfo().statusY + _vm->getDisplayInfo().statusHeight;
+	rect.left = _vm->getDisplayInfo().statusXOffset;
+	rect.top = _vm->getDisplayInfo().statusYOffset;
+	rect.right = rect.left + _vm->getDisplayWidth();
+	rect.bottom = rect.top + _vm->getDisplayInfo().statusHeight;
 
 	drawRect(backBuffer, rect, _vm->getDisplayInfo().statusBGColor);
 
@@ -449,8 +496,8 @@
 	else
 		color = _statusOnceColor;
 
-	_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);
+	_vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, _vm->getDisplayInfo().statusXOffset + (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2),
+			_vm->getDisplayInfo().statusYOffset + _vm->getDisplayInfo().statusTextY, color, 0, 0);
 
 }
 
@@ -463,6 +510,25 @@
 		_vm->_script->setVerb(panelButton->id);
 		return;
 	}
+
+	panelButton = _mainPanel.hitTest(mousePoint, kPanelAllButtons);
+
+	if (panelButton != NULL) {
+		if (panelButton->type == kPanelButtonArrow) {
+			panelButton->state = 1;
+			converseChangePos(panelButton->id);
+		}
+
+		if (panelButton->type == kPanelButtonInventory) {
+			if (_vm->_script->_pointerObject != ID_NOTHING) {
+				_vm->_script->hitObject(_vm->leftMouseButtonPressed());
+			}
+			if (_vm->_script->_pendingVerb) {
+				_vm->_actor->_protagonist->currentAction = kActionWait;
+				_vm->_script->doVerb();
+			}
+		}		
+	}
 }
 
 void Interface::handleCommandUpdate(const Point& mousePoint) {
@@ -471,22 +537,47 @@
 	panelButton = verbHitTest(mousePoint);
 	if (_mainPanel.currentButton != panelButton) {
 		if (_mainPanel.currentButton) {
-			drawVerb(_mainPanel.currentButton->id, 0);
+			if (_mainPanel.currentButton->type == kPanelButtonVerb) {
+				setVerbState(_mainPanel.currentButton->id, 0);
+			}
 		}
 		if (panelButton) {
-			drawVerb(panelButton->id, 1);			
+			setVerbState(panelButton->id, 1);			
 		}
 	}
-	_mainPanel.currentButton = panelButton;
+	
 	if (panelButton) {
+		_mainPanel.currentButton = panelButton;
 		return;
 	}
-/*	hit_button = inventoryTest(imousePointer, &ibutton_num);
 
-	if (hit_button == SUCCESS) {
-		// Hovering over an inventory object
-		return SUCCESS;
-	}*/
+
+	if (!_vm->mouseButtonPressed()) {			// remove pressed flag
+		_inventoryUpButton->state = 0;
+		_inventoryDownButton->state = 0;
+	}
+
+	panelButton = _mainPanel.hitTest(mousePoint, kPanelAllButtons);
+	
+	if (panelButton != NULL) {
+		if (panelButton->type == kPanelButtonArrow) {
+			if (panelButton->state == 1) {
+				//TODO: insert timeout catchup
+				inventoryChangePos(panelButton->id);
+			}
+			draw();
+		}
+
+		if (panelButton->type == kPanelButtonInventory) {
+			_vm->_script->whichObject(mousePoint);
+		}		
+	}
+
+	bool changed = (panelButton != _mainPanel.currentButton);
+	_mainPanel.currentButton = panelButton;
+	if (changed) {
+		draw();
+	}		
 
 }
 
@@ -506,39 +597,81 @@
 	return NULL;
 }
 
+//inventory stuff
+void Interface::inventoryChangePos(int chg) {
+	if ((chg < 0 && _inventoryStart + chg >= 0) ||
+		(chg > 0 && _inventoryStart  < _inventoryEnd)) {
+			_inventoryStart += chg;
+			draw();
+		}
+}
+
+void Interface::inventorySetPos(int key) {
+	_inventoryBox = key - '1';
+	_inventoryPos = _inventoryStart + _inventoryBox;
+	if (_inventoryPos >= _inventoryCount)
+		_inventoryPos = -1;	
+}
+
+void Interface::updateInventory(int pos) {
+	BYTE cols = _vm->getDisplayInfo().inventoryColumns;
+	if (pos >= _inventoryCount) {
+		pos = _inventoryCount - 1;
+	}
+	if (pos < 0) {
+		pos = 0;
+	}
+	_inventoryStart = (pos - cols) / cols * cols;
+	if (_inventoryStart < 0) {
+		_inventoryStart = 0;
+	}
+	
+	_inventoryEnd = (_inventoryCount - 1  - cols) / cols * cols;
+	if (_inventoryEnd < 0) {
+		_inventoryEnd = 0;
+	}	
+}
+
 void Interface::addToInventory(int sprite, int pos) {
-	if (pos != -1) {
+	if (pos != -1) { 
 		_inventory[pos] = sprite;
-		_inventoryCount++;
+		_inventoryCount = MAX(_inventoryCount, pos + 1);
 		return;
 	}
 
-	if (_inventoryCount < _inventorySize) {
-		for (int i = _inventoryCount; i > 0; i--) {
-			_inventory[i] = _inventory[i - 1];
-		}
-
-		_inventory[0] = sprite;
-		_inventoryCount++;
-		draw();
+	if (_inventoryCount >= _inventorySize) {
+		return;
 	}
+		
+	for (int i = _inventoryCount; i > 0; i--) {
+		_inventory[i] = _inventory[i - 1];
+	}
+
+	_inventory[0] = sprite;
+	_inventoryCount++;
+
+	_inventoryPos = 0;
+	updateInventory(0);
+
+	draw();	
 }
 
 void Interface::removeFromInventory(int sprite) {
-	for (int i = 0; i < _inventoryCount; i++) {
-		if (_inventory[i] == sprite) {
-			int j;
+	int j = inventoryItemPosition(sprite);
+	if (j == -1) {
+		return;
+	}
 
-			for (j = i; i < _inventoryCount; j++) {
-				_inventory[j] = _inventory[j + 1];
-			}
+	int i;
 
-			_inventory[j] = 0;
-			_inventoryCount--;
-			draw();
-			return;
-		}
+	for (i = j; i < _inventoryCount; i++) {
+		_inventory[i] = _inventory[i + 1];
 	}
+
+	--_inventoryCount;
+	_inventory[_inventoryCount] = 0;
+	updateInventory(j);
+	draw();
 }
 
 void Interface::clearInventory() {
@@ -546,6 +679,7 @@
 		_inventory[i] = 0;
 
 	_inventoryCount = 0;
+	updateInventory(0);
 }
 
 int Interface::inventoryItemPosition(int sprite) {
@@ -559,113 +693,46 @@
 void Interface::drawInventory() {
 	if (_panelMode != kPanelMain)
 		return;
-	SURFACE *back_buf = _vm->_gfx->getBackBuffer();
-
-	// TODO: Inventory scrolling
-
-	int row = 0;
-	int col = 0;
-
-	int x = _vm->getDisplayInfo().inventoryX + _vm->getDisplayInfo().inventoryIconXOffset;
-	int y = _vm->getDisplayInfo().inventoryY + _vm->getDisplayInfo().inventoryIconYOffset;
-	int width = _vm->getDisplayInfo().inventoryIconWidth + _vm->getDisplayInfo().inventoryXSpacing;
-	int height = _vm->getDisplayInfo().inventoryIconHeight + _vm->getDisplayInfo().inventoryYSpacing;
-	Point drawPoint;
-
-	for (int i = 0; i < _inventoryCount; i++) {
-		if (!_vm->_actor->validObjId(_vm->_actor->objIndexToId(_inventory[i]))) {
-			continue;
-		}
-		drawPoint.x = x + col * width;
-		drawPoint.y = y + row * height;
-
-		_vm->_sprite->draw(back_buf, _vm->_sprite->_mainSprites,
-			_vm->_actor->getObj(_vm->_actor->objIndexToId(_inventory[i]))->spriteListResourceId,
-			drawPoint, 256);
-
-		if (++col >= _vm->getDisplayInfo().inventoryColumns) {
-			if (++row >= _vm->getDisplayInfo().inventoryRows) {
-				break;
-			}
-			col = 0;
-		}
+	SURFACE *backBuffer = _vm->_gfx->getBackBuffer();
+	int i;
+	Rect rect;
+	int ci;
+	ObjectData *obj;
+	Point point;
+	ci = _inventoryStart;
+	if (_inventoryStart != 0) {
+		drawPanelButtonArrow(backBuffer, &_mainPanel, _inventoryUpButton);		
+	}
+	if (_inventoryStart != _inventoryEnd) {
+		drawPanelButtonArrow(backBuffer, &_mainPanel, _inventoryDownButton);		
 	}
-}
-
-int Interface::inventoryTest(const Point& imousePt, int *ibutton) {
-	int row = 0;
-	int col = 0;
-
-	int xbase = _vm->getDisplayInfo().inventoryX;
-	int ybase = _vm->getDisplayInfo().inventoryY;
-	int width = _vm->getDisplayInfo().inventoryIconWidth + _vm->getDisplayInfo().inventoryXSpacing;
-	int height = _vm->getDisplayInfo().inventoryIconHeight + _vm->getDisplayInfo().inventoryYSpacing;
-
-	for (int i = 0; i < _inventoryCount; i++) {
-		int x = xbase + col * width;
-		int y = ybase + row * height;
 
-		if (imousePt.x >= x && imousePt.x < x + _vm->getDisplayInfo().inventoryIconWidth && imousePt.y >= y && imousePt.y < y + _vm->getDisplayInfo().inventoryIconHeight) {
-			*ibutton = i;
-			return SUCCESS;
+	for (i = 0; i < _mainPanel.buttonsCount; i++) {
+		if (ci >= _inventoryCount) {
+			break;
 		}
-
-		if (++col >= _vm->getDisplayInfo().inventoryColumns) {
-			if (++row >= _vm->getDisplayInfo().inventoryRows) {
-				break;
-			}
-			col = 0;
+		if (_mainPanel.buttons[i].type != kPanelButtonInventory) {
+			continue;
 		}
+		_mainPanel.calcPanelButtonRect(&_mainPanel.buttons[i], rect);
+		
+//4debug		drawRect(backBuffer, rect, kITEColorWhite); 
+		point.x = rect.left;
+		point.y = rect.top;
+		obj = _vm->_actor->getObj(_inventory[ci]);		
+		_vm->_sprite->draw(backBuffer, _vm->_sprite->_mainSprites, obj->spriteListResourceId, rect, 256);
+		
+		ci++;
 	}
-
-	return FAILURE;
 }
 
-
-void Interface::drawVerb(int verb, int state) {
-	SURFACE *backBuffer;
-	PanelButton * panelButton;
-	PanelButton * rightButtonVerbPanelButton;
-	PanelButton * currentVerbPanelButton;
-	int textColor;
-	int spriteNumber;
-	Point point;
-
-	backBuffer = _vm->_gfx->getBackBuffer();
-
-	panelButton = getPanelButtonByVerbType(verb);
-	rightButtonVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getRightButtonVerb());
-	currentVerbPanelButton = getPanelButtonByVerbType(_vm->_script->getCurrentVerb());
-
-	if (panelButton == NULL) {
-		warning("panelButton == NULL");
-		return;
-	}
+void Interface::setVerbState(int verb, int state) {
+	PanelButton * panelButton = getPanelButtonByVerbType(verb);
 	if (state == 2) {
 		state = (_mainPanel.currentButton == panelButton) ? 1 : 0;
-	}
-
-	if (state) {
-		textColor = _vm->getDisplayInfo().verbTextActiveColor;
-	} else {
-		if (panelButton == rightButtonVerbPanelButton) {
-			textColor = _vm->getDisplayInfo().verbTextActiveColor;
-		} else {
-			textColor = _vm->getDisplayInfo().verbTextColor;
-		}
-	}
-
-	if (panelButton == currentVerbPanelButton) {
-		spriteNumber = panelButton->downSpriteNumber;
-	} else {
-		spriteNumber = panelButton->upSpriteNumber;
-	}
-	point.x = _mainPanel.x + panelButton->xOffset;
-	point.y = _mainPanel.y + panelButton->yOffset;
-
-	_vm->_sprite->draw(backBuffer, _mainPanel.sprites, spriteNumber, point, 256);
-
-	drawPanelButtonText(backBuffer, &_mainPanel, panelButton, textColor, _vm->getDisplayInfo().verbTextShadowColor);
+	} 
+	panelButton->state = state;
+	draw();
 }
 
 void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) {
@@ -673,7 +740,7 @@
 	int spriteNumber;
 
 	if (panel->currentButton == panelButton) {
-		if (panelButton->flag != 0) {
+		if (panelButton->state != 0) {
 			spriteNumber = panelButton->downSpriteNumber;
 		} else {
 			spriteNumber = panelButton->overSpriteNumber;
@@ -867,11 +934,11 @@
 	}
 
 	if (_converseStartPos != 0) {
-		drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[4]);
+		drawPanelButtonArrow(ds, &_conversePanel, _converseUpButton);
 	}
 
 	if (_converseStartPos != _converseEndPos) {
-		drawPanelButtonArrow(ds, &_conversePanel, &_conversePanel.buttons[5]);
+		drawPanelButtonArrow(ds, &_conversePanel, _converseDownButton);
 	}
 }
 
@@ -901,22 +968,6 @@
 	_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) {
 	bool changed;
@@ -924,8 +975,8 @@
 	PanelButton *last = _conversePanel.currentButton;
 	
 	if (!_vm->mouseButtonPressed()) {			// remove pressed flag
-		_conversePanel.buttons[4].flag = 0;
-		_conversePanel.buttons[5].flag = 0;
+		_converseUpButton->state = 0;
+		_converseDownButton->state = 0;
 	}
 
 	_conversePanel.currentButton = converseHitTest(mousePoint);
@@ -945,9 +996,9 @@
 	}
 	
 	if (_conversePanel.currentButton->type == kPanelButtonArrow) {
-		if (_conversePanel.currentButton->flag == 1) {
+		if (_conversePanel.currentButton->state == 1) {
 			//TODO: insert timeout catchup
-			converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+			converseChangePos(_conversePanel.currentButton->id);
 		}
 		draw();
 	}	
@@ -966,8 +1017,8 @@
 	}
 
 	if (_conversePanel.currentButton->type == kPanelButtonArrow) {
-		_conversePanel.currentButton->flag = 1;
-		converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1);
+		_conversePanel.currentButton->state = 1;
+		converseChangePos(_conversePanel.currentButton->id);
 	}	
 
 }

Index: interface.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/interface.h,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- interface.h	21 Apr 2005 01:30:07 -0000	1.43
+++ interface.h	22 Apr 2005 14:11:02 -0000	1.44
@@ -80,12 +80,38 @@
 	PanelButton *buttons;
 	SpriteList sprites;
 	
+	PanelButton *getButton(int index) {
+		if ((index >= 0) && (index < buttonsCount)) {
+			return &buttons[index];
+		}
+		return NULL;
+	}
+
 	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;
 	}
+
+	PanelButton *hitTest(const Point& mousePoint, int buttonType) {
+		PanelButton *panelButton;
+		Rect rect;
+		int i;
+		for (i = 0; i < buttonsCount; i++) {
+			panelButton = &buttons[i];
+			if (panelButton != NULL) {
+				if ((panelButton->type & buttonType) > 0) {
+					calcPanelButtonRect(panelButton, rect);
+					if (rect.contains(mousePoint)) {
+						return panelButton;
+					}
+				}
+			}
+		}
+		return NULL;
+	}
+
 };
 
 
@@ -133,22 +159,36 @@
 	int draw();
 	int update(const Point& mousePoint, int updateFlag);
 	void drawStatusBar();
-	void drawVerb(int verb, int state);
+	void setVerbState(int verb, int state);
 
 	bool processKeyCode(int keyCode);
 	
+	void inventoryChangePos(int chg);
+	void inventorySetPos(int key);
 	void addToInventory(int sprite, int pos = -1);
 	void removeFromInventory(int sprite);
 	void clearInventory();
 	int inventoryItemPosition(int sprite);
 	void drawInventory();
+	void updateInventory(int pos);
+	int getInventoryContentByPanelButton(PanelButton * panelButton) {
+		int cell = _inventoryStart + panelButton->id;
+		if (cell >= _inventoryCount) {
+			return 0;
+		}
+		return _inventory[cell];
+	}
 	
+	PanelButton *inventoryHitTest(const Point& mousePoint) {
+		return _mainPanel.hitTest(mousePoint, kPanelButtonInventory);
+	}
 private:
-	int inventoryTest(const Point& imousePt, int *ibutton);
 	PanelButton *verbHitTest(const Point& mousePoint);
 	void handleCommandUpdate(const Point& mousePoint);
 	void handleCommandClick(const Point& mousePoint);
-	PanelButton *converseHitTest(const Point& mousePoint);
+	PanelButton *converseHitTest(const Point& mousePoint) {
+		return _conversePanel.hitTest(mousePoint, kPanelAllButtons);
+	}
 	void handleConverseUpdate(const Point& mousePoint);
 	void handleConverseClick(const Point& mousePoint);
 	
@@ -157,6 +197,7 @@
 
 	void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton, int textColor, int textShadowColor);
 	void drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton);
+	void drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton);
 
 public:
 	void converseInit(void);
@@ -181,7 +222,11 @@
 	bool _initialized;
 	RSCFILE_CONTEXT *_interfaceContext;
 	InterfacePanel _mainPanel;
+	PanelButton *_inventoryUpButton;
+	PanelButton *_inventoryDownButton;
 	InterfacePanel _conversePanel;
+	PanelButton *_converseUpButton;
+	PanelButton *_converseDownButton;
 	SpriteList _defPortraits;
 	SpriteList _scenePortraits;
 	PanelButton *_verbTypeToPanelButton[kVerbTypesMax];
@@ -200,7 +245,11 @@
 
 	uint16 *_inventory;
 	int _inventorySize;
-	byte _inventoryCount;
+	int _inventoryStart;
+	int _inventoryEnd;
+	int _inventoryPos;
+	int _inventoryBox;
+	int _inventoryCount;
 
 	char _converseWorkString[CONVERSE_MAX_WORK_STRING];
 	Converse _converseText[CONVERSE_MAX_TEXTS];
@@ -214,4 +263,3 @@
 } // End of namespace Saga
 
 #endif				/* INTERFACE_H__ */
-/* end "r_interface.h" */

Index: itedata.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/itedata.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- itedata.h	18 Mar 2005 17:11:36 -0000	1.2
+++ itedata.h	22 Apr 2005 14:11:02 -0000	1.3
@@ -71,7 +71,7 @@
 	int16 x;
 	int16 y;
 	int16 z;
-	int32 frameNumber;
+	int32 spriteListResourceId;
 	byte scriptEntrypointNumber;
 	uint16 interactBits;
 };

Index: saga.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.cpp,v
retrieving revision 1.104
retrieving revision 1.105
diff -u -d -r1.104 -r1.105
--- saga.cpp	18 Apr 2005 20:03:12 -0000	1.104
+++ saga.cpp	22 Apr 2005 14:11:02 -0000	1.105
@@ -392,7 +392,7 @@
 			error("SagaEngine::loadStrings wrong strings table");
 		}
 		stringsTable.strings[i] = (const char *)stringsTable.stringsPointer + offset;
-		//debug(9, "string[%i]=%s", i, stringsTable.strings[i]);
+		debug(9, "string[%i]=%s", i, stringsTable.strings[i]);
 		i++;
 	}
 	stringsTable.stringsCount = stringsCount;
@@ -405,7 +405,7 @@
 	switch (objectTypeId(objectId)) {
 	case kGameObjectObject:
 		obj = _actor->getObj(objectId);
-		_script->_mainStrings.getString(obj->nameIndex);
+		return _script->_mainStrings.getString(obj->nameIndex);
 		break;
 	case kGameObjectActor: 
 		actor = _actor->getActor(objectId);			

Index: saga.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/saga.h,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -d -r1.86 -r1.87
--- saga.h	21 Apr 2005 01:30:07 -0000	1.86
+++ saga.h	22 Apr 2005 14:11:02 -0000	1.87
@@ -138,9 +138,11 @@
 
 
 enum PanelButtonType {
-	kPanelButtonVerb = 0,
-	kPanelButtonArrow = 1,
-	kPanelButtonConverseText = 2
+	kPanelButtonVerb = 1,
+	kPanelButtonArrow = 2,
+	kPanelButtonConverseText = 4,
+	kPanelButtonInventory = 8,
+	kPanelAllButtons = 15
 };
 
 enum TextStringIds {
@@ -310,10 +312,10 @@
 	int height;
 	int id;
 	int keyChar;
+	int state;
 	int upSpriteNumber;
 	int downSpriteNumber;
 	int overSpriteNumber;
-	int flag;
 };
 
 struct GameDisplayInfo {
@@ -323,7 +325,8 @@
 	int pathStartY;
 	int sceneHeight;
 
-	int statusY;
+	int statusXOffset;
+	int statusYOffset;
 	int statusWidth;
 	int statusHeight;
 	int statusTextY;
@@ -339,18 +342,21 @@
 	int rightPortraitXOffset;
 	int rightPortraitYOffset;
 
-	int inventoryX;
-	int inventoryY;
+	int inventoryUpButtonIndex;
+	int inventoryDownButtonIndex;
 	int inventoryRows;
 	int inventoryColumns;
-	int inventoryIconWidth;
-	int inventoryIconHeight;
-	int inventoryIconXOffset;
-	int inventoryIconYOffset;
-	int inventoryXSpacing;
-	int inventoryYSpacing;
+
+	int mainPanelXOffset;
+	int mainPanelYOffset;
 	int mainPanelButtonsCount;
 	PanelButton *mainPanelButtons;
+
+	int converseUpButtonIndex;
+	int converseDownButtonIndex;
+
+	int conversePanelXOffset;
+	int conversePanelYOffset;
 	int conversePanelButtonsCount;
 	PanelButton *conversePanelButtons;
 };

Index: script.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/script.cpp,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- script.cpp	18 Apr 2005 20:03:13 -0000	1.64
+++ script.cpp	22 Apr 2005 14:11:02 -0000	1.65
@@ -417,10 +417,10 @@
 
 	if ((_currentVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
 			if (oldVerb > kVerbNone)
-				_vm->_interface->drawVerb(oldVerb, 2);
+				_vm->_interface->setVerbState(oldVerb, 2);
 
 			if (_currentVerb > kVerbNone)
-				_vm->_interface->drawVerb(_currentVerb, 2);
+				_vm->_interface->setVerbState(_currentVerb, 2);
 	}
 }
 
@@ -431,10 +431,10 @@
 
 	if ((_rightButtonVerb != oldVerb) && (_vm->_interface->getMode() == kPanelMain)){
 		if (oldVerb > kVerbNone)
-			_vm->_interface->drawVerb(oldVerb, 2);
+			_vm->_interface->setVerbState(oldVerb, 2);
 
 		if (_rightButtonVerb > kVerbNone)
-			_vm->_interface->drawVerb(_rightButtonVerb, 2);
+			_vm->_interface->setVerbState(_rightButtonVerb, 2);
 	}
 }
 
@@ -673,10 +673,12 @@
 	int newRightButtonVerb;
 	uint16 newObjectId;
 	ActorData *actor;
+	ObjectData *obj;
 	Point pickPoint;
 	Location pickLocation;
 	int hitZoneIndex;
 	const HitZone * hitZone;
+	PanelButton * panelButton;
 
 	objectId = ID_NOTHING;
 	objectFlags = 0;
@@ -685,81 +687,103 @@
 
 	if (_vm->_actor->_protagonist->currentAction == kActionWalkDir) {
 	} else {
-		newObjectId = _vm->_actor->hitTest(mousePoint, true);
+		if (_vm->getSceneHeight() >= mousePoint.y) {
+			newObjectId = _vm->_actor->hitTest(mousePoint, true);
 
-		if (newObjectId != ID_NOTHING) {
-			if (objectTypeId(newObjectId) == kGameObjectObject) {
-				objectId = newObjectId;
-				objectFlags = 0;
-				newRightButtonVerb = kVerbLookAt;
+			if (newObjectId != ID_NOTHING) {
+				if (objectTypeId(newObjectId) == kGameObjectObject) {
+					objectId = newObjectId;
+					objectFlags = 0;
+					newRightButtonVerb = kVerbLookAt;
 
-				if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) {
-					objectId = ID_NOTHING;
-					newObjectId = ID_NOTHING;
-				}
-			} else {
-				actor = _vm->_actor->getActor(newObjectId);
-				objectId = newObjectId;
-				objectFlags = kObjUseWith;
-				newRightButtonVerb = kVerbTalkTo;
-				
-				if ((_currentVerb == kVerbPickUp) ||
-					(_currentVerb == kVerbOpen) ||
-					(_currentVerb == kVerbClose) ||
-					((_currentVerb == kVerbGive) && !_firstObjectSet) ||
-					((_currentVerb == kVerbUse) && !(actor->flags & kFollower))) {
-					objectId = ID_NOTHING;
-					newObjectId = ID_NOTHING;
+					if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && _firstObjectSet)) {
+						objectId = ID_NOTHING;
+						newObjectId = ID_NOTHING;
+					}
+				} else {
+					actor = _vm->_actor->getActor(newObjectId);
+					objectId = newObjectId;
+					objectFlags = kObjUseWith;
+					newRightButtonVerb = kVerbTalkTo;
+
+					if ((_currentVerb == kVerbPickUp) ||
+						(_currentVerb == kVerbOpen) ||
+						(_currentVerb == kVerbClose) ||
+						((_currentVerb == kVerbGive) && !_firstObjectSet) ||
+						((_currentVerb == kVerbUse) && !(actor->flags & kFollower))) {
+							objectId = ID_NOTHING;
+							newObjectId = ID_NOTHING;
+						}
 				}
 			}
-		}
 
-		if (newObjectId == ID_NOTHING) {		
+			if (newObjectId == ID_NOTHING) {		
 
-			pickPoint = mousePoint;
+				pickPoint = mousePoint;
 
-			if (_vm->_scene->getFlags() & kSceneFlagISO) {
-				pickPoint.y -= _vm->_actor->_protagonist->location.z;
-				_vm->_isoMap->screenPointToTileCoords(pickPoint, pickLocation);
-				pickLocation.toScreenPointUV(pickPoint);
-			}
-			
-			hitZoneIndex = _vm->_scene->_objectMap->hitTest(pickPoint);
-		
-			if ((hitZoneIndex != -1)) {
-				hitZone = _vm->_scene->_objectMap->getHitZone(hitZoneIndex);
-				objectId = hitZone->getHitZoneId();
-				objectFlags = 0;
-				newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
+				if (_vm->_scene->getFlags() & kSceneFlagISO) {
+					pickPoint.y -= _vm->_actor->_protagonist->location.z;
+					_vm->_isoMap->screenPointToTileCoords(pickPoint, pickLocation);
+					pickLocation.toScreenPointUV(pickPoint);
+				}
 
-				if (newRightButtonVerb == kVerbWalkOnly) {
-					if (_firstObjectSet) {
-						objectId = ID_NOTHING;
-					} else {
-						newRightButtonVerb = _leftButtonVerb = kVerbWalkTo;
-					}
-				} else {
-					if (newRightButtonVerb == kVerbLookOnly) {
+				hitZoneIndex = _vm->_scene->_objectMap->hitTest(pickPoint);
+
+				if ((hitZoneIndex != -1)) {
+					hitZone = _vm->_scene->_objectMap->getHitZone(hitZoneIndex);
+					objectId = hitZone->getHitZoneId();
+					objectFlags = 0;
+					newRightButtonVerb = hitZone->getRightButtonVerb() & 0x7f;
+
+					if (newRightButtonVerb == kVerbWalkOnly) {
 						if (_firstObjectSet) {
 							objectId = ID_NOTHING;
 						} else {
-							newRightButtonVerb = _leftButtonVerb = kVerbLookAt;
+							newRightButtonVerb = _leftButtonVerb = kVerbWalkTo;
+						}
+					} else {
+						if (newRightButtonVerb == kVerbLookOnly) {
+							if (_firstObjectSet) {
+								objectId = ID_NOTHING;
+							} else {
+								newRightButtonVerb = _leftButtonVerb = kVerbLookAt;
+							}
 						}
 					}
-				}
 
-				if (newRightButtonVerb >= kVerbOptions) {
-					newRightButtonVerb = kVerbNone;
-				}
+					if (newRightButtonVerb >= kVerbOptions) {
+						newRightButtonVerb = kVerbNone;
+					}
 
-				if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
-					objectId = ID_NOTHING;
-					newObjectId = ID_NOTHING;
+					if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
+						objectId = ID_NOTHING;
+						newObjectId = ID_NOTHING;
+					}
+
+					if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) {
+						objectFlags = kObjUseWith;
+					}					
 				}
+			}
+		} else {
+			if ((_currentVerb == kVerbTalkTo) || ((_currentVerb == kVerbGive) && !_firstObjectSet)) {
+				// no way
+			} else {
+				panelButton = _vm->_interface->inventoryHitTest(mousePoint);
+				if (panelButton) {
+					objectId = _vm->_interface->getInventoryContentByPanelButton(panelButton);		
+					if (objectId != 0) {
+						obj = _vm->_actor->getObj(objectId);
+						newRightButtonVerb = kVerbLookAt;
+						if (obj->interactBits & kObjUseWith) {
+							objectFlags = kObjUseWith;
+						}
+					}
+				}
+			}
 
-				if ((_leftButtonVerb == kVerbUse) && (hitZone->getRightButtonVerb() & 0x80)) {
-					objectFlags = kObjUseWith;
-				}					
+			if ((_currentVerb == kVerbPickUp) || (_currentVerb == kVerbTalkTo) || (_currentVerb == kVerbWalkTo)) {
+				_leftButtonVerb = kVerbLookAt;
 			}
 		}
 	}

Index: sfuncs.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sfuncs.cpp,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -d -r1.103 -r1.104
--- sfuncs.cpp	21 Apr 2005 01:30:07 -0000	1.103
+++ sfuncs.cpp	22 Apr 2005 14:11:03 -0000	1.104
@@ -186,6 +186,7 @@
 	obj = _vm->_actor->getObj(objectId);
 	if (obj->sceneNumber != ITE_SCENE_INV) {
 		obj->sceneNumber = ITE_SCENE_INV;
+		//4debug for(int j=0;j<17;j++)
 		_vm->_interface->addToInventory(objectId);
 	}
 }

Index: sprite.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.cpp,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- sprite.cpp	18 Apr 2005 10:26:43 -0000	1.46
+++ sprite.cpp	22 Apr 2005 14:11:04 -0000	1.47
@@ -237,6 +237,33 @@
 	return SUCCESS;
 }
 
+int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale) {
+	const byte *spriteBuffer;
+	int width;
+	int height;
+	int xAlign, spw;
+	int yAlign, sph;
+	Point spritePointer;
+	Rect clip(_vm->getDisplayWidth(),_vm->getDisplayHeight());
+
+	assert(_initialized);
+
+	getScaledSpriteBuffer(spriteList, spriteNumber, scale, width, height, xAlign, yAlign, spriteBuffer);
+	spw = (screenRect.width() - width) / 2;
+	sph = (screenRect.height() - height) / 2;
+	if (spw < 0) {
+		spw = 0;
+	}
+	if (sph < 0) {
+		sph = 0;
+	}
+	spritePointer.x = screenRect.left + xAlign + spw;
+	spritePointer.y = screenRect.top + yAlign + sph;
+	drawClip(ds, clip, spritePointer, width, height, spriteBuffer);
+
+	return SUCCESS;
+}
+
 bool Sprite::hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint) {
 	const byte *spriteBuffer;
 	int i, j;

Index: sprite.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/saga/sprite.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- sprite.h	18 Apr 2005 10:26:43 -0000	1.17
+++ sprite.h	22 Apr 2005 14:11:04 -0000	1.18
@@ -71,6 +71,7 @@
 	~Sprite(void);
 	int loadList(int resourceId, SpriteList &spriteList); // load or append spriteList
 	int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Point &screenCoord, int scale);
+	int draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const Rect &screenRect, int scale);
 	int drawOccluded(SURFACE *ds, SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, int depth);
 	bool hitTest(SpriteList &spriteList, int spriteNumber, const Point &screenCoord, int scale, const Point &testPoint);
 	void getScaledSpriteBuffer(SpriteList &spriteList, int spriteNumber, int scale, int &width, int &height, int &xAlign, int &yAlign, const byte *&buffer);





More information about the Scummvm-git-logs mailing list