diff options
| -rw-r--r-- | saga/actor.cpp | 4 | ||||
| -rw-r--r-- | saga/actor.h | 4 | ||||
| -rw-r--r-- | saga/game.cpp | 116 | ||||
| -rw-r--r-- | saga/interface.cpp | 401 | ||||
| -rw-r--r-- | saga/interface.h | 58 | ||||
| -rw-r--r-- | saga/itedata.h | 2 | ||||
| -rw-r--r-- | saga/saga.cpp | 4 | ||||
| -rw-r--r-- | saga/saga.h | 32 | ||||
| -rw-r--r-- | saga/script.cpp | 150 | ||||
| -rw-r--r-- | saga/sfuncs.cpp | 1 | ||||
| -rw-r--r-- | saga/sprite.cpp | 27 | ||||
| -rw-r--r-- | saga/sprite.h | 1 | 
12 files changed, 488 insertions, 312 deletions
| diff --git a/saga/actor.cpp b/saga/actor.cpp index 77cb38fe59..cfcbab58c2 100644 --- a/saga/actor.cpp +++ b/saga/actor.cpp @@ -252,7 +252,7 @@ Actor::Actor(SagaEngine *vm) : _vm(vm) {  			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 @@ bool Actor::validFollowerLocation(const Location &location) {  }  void Actor::setProtagState(int state) { -	debug(0, "STUB: setProtagState(%d)", state); +	debug(0, "STUB: setProtagState(%d)", state); //TODO: do it  	_protagState = state;  } diff --git a/saga/actor.h b/saga/actor.h index c734f4c1ad..542687d4a5 100644 --- a/saga/actor.h +++ b/saga/actor.h @@ -314,6 +314,8 @@ struct SpeechData {  class Actor { +	friend class IsoMap; +	friend class SagaEngine;  public:  	ActorData *_centerActor;  	ActorData *_protagonist; @@ -430,8 +432,6 @@ private:  	CommonObjectOrderList _drawOrderList;  protected: -	friend class IsoMap; -	friend class SagaEngine;  	int _actorsCount;  	ActorData **_actors; diff --git a/saga/game.cpp b/saga/game.cpp index a28e9119b6..4d1672a532 100644 --- a/saga/game.cpp +++ b/saga/game.cpp @@ -42,25 +42,35 @@ static int detectGame(const FSList &fslist, bool mode = false);  // 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 @@ static GameDisplayInfo ITE_DisplayInfo = {  	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 @@ static GameDisplayInfo ITE_DisplayInfo = {  	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 @@ static GameSoundInfo ITECD_GameSound = {  // 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 - -	304, -	640, -	24, -	8, -	186, -	11, - -	147, -	15, -	96, - -	5, 4, -	-1, -1, - -	0, 0, //TODO: fill it all -	0, 0, -	0, 0, -	0, 0, -	0, 0, +	0,			// scene path y offset +	304,		// scene height + +	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,		// verb text color +	15,			// verb text shadow color +	96,			// verb text active color + +	5, 4,		// left portrait x, y offset +	-1, -1,		// right portrait x, y offset + +	-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  }; diff --git a/saga/interface.cpp b/saga/interface.cpp index 85eb0b1f16..7b28260adb 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -116,13 +116,18 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {  	} -	_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 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) {  	_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 @@ int Interface::setMode(int mode, bool force) {  bool Interface::processKeyCode(int keyCode) {  	int i; +	PanelButton *panelButton;  	switch (_panelMode) {  	case kPanelNull:  		if (keyCode == 27) {// Esc @@ -245,12 +255,16 @@ bool Interface::processKeyCode(int keyCode) {  		}  		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 @@ int Interface::setRightPortrait(int portrait) {  	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 @@ int Interface::draw() {  		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 @@ int Interface::draw() {  		_vm->_sprite->draw(backBuffer, _scenePortraits, _rightPortrait, rightPortraitPoint, 256);  	} -	if (_inMainMode) { -		drawInventory(); -	} +	drawInventory();  	return SUCCESS;  } @@ -379,11 +423,14 @@ int Interface::update(const Point& mousePoint, int updateFlag) {  	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 @@ void Interface::drawStatusBar() {  	// 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 @@ void Interface::drawStatusBar() {  	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 @@ void Interface::handleCommandClick(const Point& mousePoint) {  		_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 @@ void Interface::handleCommandUpdate(const Point& mousePoint) {  	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 @@ PanelButton *Interface::verbHitTest(const Point& mousePoint) {  	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 @@ void Interface::clearInventory() {  		_inventory[i] = 0;  	_inventoryCount = 0; +	updateInventory(0);  }  int Interface::inventoryItemPosition(int sprite) { @@ -559,113 +693,46 @@ int Interface::inventoryItemPosition(int sprite) {  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 @@ void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelBu  	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 @@ void Interface::converseDisplayTextLines(SURFACE *ds) {  	}  	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 @@ void Interface::converseSetPos(int key) {  	_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 @@ void Interface::handleConverseUpdate(const Point& mousePoint) {  	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 @@ void Interface::handleConverseUpdate(const Point& mousePoint) {  	}  	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 @@ void Interface::handleConverseClick(const Point& mousePoint) {  	}  	if (_conversePanel.currentButton->type == kPanelButtonArrow) { -		_conversePanel.currentButton->flag = 1; -		converseChangePos((_conversePanel.currentButton->id == 0) ? -1 : 1); +		_conversePanel.currentButton->state = 1; +		converseChangePos(_conversePanel.currentButton->id);  	}	  } diff --git a/saga/interface.h b/saga/interface.h index 654e7dea7d..a63740dee9 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -80,12 +80,38 @@ struct InterfacePanel {  	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 @@ public:  	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 @@ private:  	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 @@ private:  	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 @@ private:  	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 @@ private:  } // End of namespace Saga  #endif				/* INTERFACE_H__ */ -/* end "r_interface.h" */ diff --git a/saga/itedata.h b/saga/itedata.h index d604dfc4fd..299cc365db 100644 --- a/saga/itedata.h +++ b/saga/itedata.h @@ -71,7 +71,7 @@ struct ObjectTableData {  	int16 x;  	int16 y;  	int16 z; -	int32 frameNumber; +	int32 spriteListResourceId;  	byte scriptEntrypointNumber;  	uint16 interactBits;  }; diff --git a/saga/saga.cpp b/saga/saga.cpp index 711542418f..5aa29c6f66 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -392,7 +392,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const byte *stringsPoin  			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 @@ const char *SagaEngine::getObjectName(uint16 objectId) {  	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);			 diff --git a/saga/saga.h b/saga/saga.h index 2c6dd0e614..f77ede24a7 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -138,9 +138,11 @@ enum HitZoneFlags {  enum PanelButtonType { -	kPanelButtonVerb = 0, -	kPanelButtonArrow = 1, -	kPanelButtonConverseText = 2 +	kPanelButtonVerb = 1, +	kPanelButtonArrow = 2, +	kPanelButtonConverseText = 4, +	kPanelButtonInventory = 8, +	kPanelAllButtons = 15  };  enum TextStringIds { @@ -310,10 +312,10 @@ struct PanelButton {  	int height;  	int id;  	int keyChar; +	int state;  	int upSpriteNumber;  	int downSpriteNumber;  	int overSpriteNumber; -	int flag;  };  struct GameDisplayInfo { @@ -323,7 +325,8 @@ struct GameDisplayInfo {  	int pathStartY;  	int sceneHeight; -	int statusY; +	int statusXOffset; +	int statusYOffset;  	int statusWidth;  	int statusHeight;  	int statusTextY; @@ -339,18 +342,21 @@ struct GameDisplayInfo {  	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;  }; diff --git a/saga/script.cpp b/saga/script.cpp index 33390c6e1e..47823abf45 100644 --- a/saga/script.cpp +++ b/saga/script.cpp @@ -417,10 +417,10 @@ void Script::setLeftButtonVerb(int verb) {  	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 @@ void Script::setRightButtonVerb(int verb) {  	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 @@ void Script::whichObject(const Point& mousePoint) {  	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 @@ void Script::whichObject(const Point& mousePoint) {  	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 (newRightButtonVerb == kVerbWalkOnly) { -					if (_firstObjectSet) { -						objectId = ID_NOTHING; -					} else { -						newRightButtonVerb = _leftButtonVerb = kVerbWalkTo; -					} -				} else { -					if (newRightButtonVerb == kVerbLookOnly) { +				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 (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;  			}  		}  	} diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index 07c5dd947c..c3e3d0bff7 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -186,6 +186,7 @@ void Script::sfTakeObject(SCRIPTFUNC_PARAMS) {  	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);  	}  } diff --git a/saga/sprite.cpp b/saga/sprite.cpp index d272ed791a..36ed2cefc3 100644 --- a/saga/sprite.cpp +++ b/saga/sprite.cpp @@ -237,6 +237,33 @@ int Sprite::draw(SURFACE *ds, SpriteList &spriteList, int32 spriteNumber, const  	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; diff --git a/saga/sprite.h b/saga/sprite.h index 69f93331fd..80254c6807 100644 --- a/saga/sprite.h +++ b/saga/sprite.h @@ -71,6 +71,7 @@ public:  	~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); | 
