diff options
| -rw-r--r-- | engines/sherlock/objects.cpp | 38 | ||||
| -rw-r--r-- | engines/sherlock/objects.h | 25 | ||||
| -rw-r--r-- | engines/sherlock/people.cpp | 12 | ||||
| -rw-r--r-- | engines/sherlock/people.h | 3 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel.cpp | 18 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel_map.cpp | 60 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel_people.cpp | 30 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel_scene.cpp | 74 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel_talk.cpp | 2 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/scalpel_user_interface.cpp | 14 | ||||
| -rw-r--r-- | engines/sherlock/scene.cpp | 22 | ||||
| -rw-r--r-- | engines/sherlock/talk.cpp | 14 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo.cpp | 2 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo.h | 1 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_people.cpp | 14 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_scene.cpp | 126 | ||||
| -rw-r--r-- | engines/sherlock/tattoo/tattoo_talk.cpp | 2 | 
17 files changed, 310 insertions, 147 deletions
diff --git a/engines/sherlock/objects.cpp b/engines/sherlock/objects.cpp index ee04644a9e..954dcc7884 100644 --- a/engines/sherlock/objects.cpp +++ b/engines/sherlock/objects.cpp @@ -328,7 +328,7 @@ void Sprite::checkSprite() {  						break;  					case WALK_AROUND: -						if (objBounds.contains(people[PLAYER]._walkTo.front())) { +						if (objBounds.contains(people[HOLMES]._walkTo.front())) {  							// Reached zone  							gotoStand();  						} else { @@ -374,10 +374,10 @@ void Sprite::checkSprite() {  									objBounds.right + CLEAR_DIST_X;  							} -							walkPos.x += people[PLAYER]._imageFrame->_frame.w / 2; +							walkPos.x += people[HOLMES]._imageFrame->_frame.w / 2;  							people._walkDest = walkPos; -							people[PLAYER]._walkTo.push(walkPos); -							people[PLAYER].setWalking(); +							people[HOLMES]._walkTo.push(walkPos); +							people[HOLMES].setWalking();  						}  						break; @@ -1313,7 +1313,7 @@ int Object::checkNameForCodes(const Common::String &name, const char *const mess  				scene._goToScene = 100;  			} -			people[PLAYER]._position = Point32(0, 0); +			people[HOLMES]._position = Point32(0, 0);  			break;  		}  	} else if (name.hasPrefix("!")) { @@ -1451,7 +1451,7 @@ int Object::pickUpObject(const char *const messages[]) {  		} else {  			// Play generic pickup sequence  			// Original moved cursor position here -			people[PLAYER].goAllTheWay(); +			people[HOLMES].goAllTheWay();  			ui._menuCounter = 25;  			ui._temp1 = 1;  		} @@ -1596,17 +1596,37 @@ void CAnim::load3DO(Common::SeekableReadStream &s) {  /*----------------------------------------------------------------*/  CAnimStream::CAnimStream() { -	_stream = nullptr; -	_frameSize = 0;  	_images = nullptr;  	_imageFrame = nullptr; +	_frameNumber = 0;  	_flags = 0;  	_scaleVal = 0;  	_zPlacement = 0;  } +CAnimStream::~CAnimStream() { +	delete _images; +} + +void CAnimStream::load(Common::SeekableReadStream *stream) { +	delete _images; +	_images = new ImageFile(*stream, false); +	_imageFrame = &(*_images)[0]; +	_frameNumber = 0; +} + +void CAnimStream::close() { +	delete _images; +	_images = nullptr; +	_imageFrame = nullptr; +	_frameNumber = 0; +} +  void CAnimStream::getNextFrame() { -	// TODO +	if (++_frameNumber < (int)_images->size()) +		_imageFrame = &(*_images)[_frameNumber]; +	else +		_imageFrame = nullptr;  }  /*----------------------------------------------------------------*/ diff --git a/engines/sherlock/objects.h b/engines/sherlock/objects.h index 6035bb4ee6..935b4b3cb2 100644 --- a/engines/sherlock/objects.h +++ b/engines/sherlock/objects.h @@ -464,10 +464,8 @@ struct CAnim {  };  class CAnimStream { -	Common::SeekableReadStream *_stream;	// Stream to read frames from -	int _frameSize;					// Temporary used to store the frame size - -	void *_images;					// TOOD: FIgure out hwo to hook up ImageFile with streaming support +	ImageFile *_images;					 +	int _frameNumber;  public:  	ImageFrame *_imageFrame; @@ -480,8 +478,27 @@ public:  	int _zPlacement;				// Used by doBgAnim for determining Z order  public:  	CAnimStream(); +	~CAnimStream(); + +	/** +	 * Load the animation's images +	 */ +	void load(Common::SeekableReadStream *stream); + +	/** +	 * Close any currently active animation +	 */ +	void close(); +	/** +	 * Get the next frame of the animation +	 */  	void getNextFrame(); + +	/** +	 * Returns whether the animation is active +	 */ +	bool active() const { return _imageFrame != nullptr; }  };  struct SceneImage { diff --git a/engines/sherlock/people.cpp b/engines/sherlock/people.cpp index 00d77d9f43..9f1d22b5a8 100644 --- a/engines/sherlock/people.cpp +++ b/engines/sherlock/people.cpp @@ -232,7 +232,7 @@ People::~People() {  }  void People::reset() { -	_data[PLAYER]->_description = "Sherlock Holmes!"; +	_data[HOLMES]->_description = "Sherlock Holmes!";  	// Note: Serrated Scalpel only uses a single Person slot for Sherlock.. Watson is handled by scene sprites  	int count = IS_SERRATED_SCALPEL ? 1 : MAX_CHARACTERS; @@ -356,9 +356,9 @@ void People::synchronize(Serializer &s) {  	s.syncAsByte(_holmesOn);  	if (IS_SERRATED_SCALPEL) { -		s.syncAsSint16LE(_data[PLAYER]->_position.x); -		s.syncAsSint16LE(_data[PLAYER]->_position.y); -		s.syncAsSint16LE(_data[PLAYER]->_sequenceNumber); +		s.syncAsSint16LE(_data[HOLMES]->_position.x); +		s.syncAsSint16LE(_data[HOLMES]->_position.y); +		s.syncAsSint16LE(_data[HOLMES]->_sequenceNumber);  	} else {  		for (uint idx = 0; idx < _data.size(); ++idx) {  			Person &p = *_data[idx]; @@ -375,8 +375,8 @@ void People::synchronize(Serializer &s) {  	s.syncAsSint16LE(_holmesQuotient);  	if (s.isLoading()) { -		_hSavedPos = _data[PLAYER]->_position; -		_hSavedFacing = _data[PLAYER]->_sequenceNumber; +		_hSavedPos = _data[HOLMES]->_position; +		_hSavedFacing = _data[HOLMES]->_sequenceNumber;  	}  } diff --git a/engines/sherlock/people.h b/engines/sherlock/people.h index 3d035b6b7b..19e050ead1 100644 --- a/engines/sherlock/people.h +++ b/engines/sherlock/people.h @@ -31,7 +31,8 @@  namespace Sherlock {  enum PeopleId { -	PLAYER			= 0, +	HOLMES			= 0, +	WATSON			= 1,  	MAX_NPC_PATH	= 200  }; diff --git a/engines/sherlock/scalpel/scalpel.cpp b/engines/sherlock/scalpel/scalpel.cpp index 4fe3b0327c..33f8c6b7a2 100644 --- a/engines/sherlock/scalpel/scalpel.cpp +++ b/engines/sherlock/scalpel/scalpel.cpp @@ -961,7 +961,7 @@ void ScalpelEngine::startScene() {  }  void ScalpelEngine::eraseMirror12() { -	Common::Point pt((*_people)[PLAYER]._position.x / FIXED_INT_MULTIPLIER, (*_people)[PLAYER]._position.y / FIXED_INT_MULTIPLIER); +	Common::Point pt((*_people)[HOLMES]._position.x / FIXED_INT_MULTIPLIER, (*_people)[HOLMES]._position.y / FIXED_INT_MULTIPLIER);  	// If player is in range of the mirror, then restore background from the secondary back buffer  	if (Common::Rect(70, 100, 200, 200).contains(pt)) { @@ -972,13 +972,13 @@ void ScalpelEngine::eraseMirror12() {  void ScalpelEngine::doMirror12() {  	People &people = *_people; -	Person &player = people[PLAYER]; +	Person &player = people[HOLMES]; -	Common::Point pt((*_people)[PLAYER]._position.x / FIXED_INT_MULTIPLIER, (*_people)[PLAYER]._position.y / FIXED_INT_MULTIPLIER); +	Common::Point pt((*_people)[HOLMES]._position.x / FIXED_INT_MULTIPLIER, (*_people)[HOLMES]._position.y / FIXED_INT_MULTIPLIER);  	int frameNum = player._walkSequences[player._sequenceNumber][player._frameNumber] +  		player._walkSequences[player._sequenceNumber][0] - 2; -	switch ((*_people)[PLAYER]._sequenceNumber) { +	switch ((*_people)[HOLMES]._sequenceNumber) {  	case WALK_DOWN:  		frameNum -= 7;  		break; @@ -1021,12 +1021,12 @@ void ScalpelEngine::doMirror12() {  	if (Common::Rect(80, 100, 145, 138).contains(pt)) {  		// Get the frame of Sherlock to draw -		ImageFrame &imageFrame = (*people[PLAYER]._images)[frameNum]; +		ImageFrame &imageFrame = (*people[HOLMES]._images)[frameNum];  		// Draw the mirror image of Holmes -		bool flipped = people[PLAYER]._sequenceNumber == WALK_LEFT || people[PLAYER]._sequenceNumber == STOP_LEFT -			|| people[PLAYER]._sequenceNumber == WALK_UPRIGHT || people[PLAYER]._sequenceNumber == STOP_UPRIGHT -			|| people[PLAYER]._sequenceNumber == WALK_DOWNLEFT || people[PLAYER]._sequenceNumber == STOP_DOWNLEFT; +		bool flipped = people[HOLMES]._sequenceNumber == WALK_LEFT || people[HOLMES]._sequenceNumber == STOP_LEFT +			|| people[HOLMES]._sequenceNumber == WALK_UPRIGHT || people[HOLMES]._sequenceNumber == STOP_UPRIGHT +			|| people[HOLMES]._sequenceNumber == WALK_DOWNLEFT || people[HOLMES]._sequenceNumber == STOP_DOWNLEFT;  		_screen->_backBuffer1.transBlitFrom(imageFrame, pt + Common::Point(38, -imageFrame._frame.h - 25), flipped);  		// Redraw the mirror borders to prevent the drawn image of Holmes from appearing outside of the mirror @@ -1046,7 +1046,7 @@ void ScalpelEngine::doMirror12() {  }  void ScalpelEngine::flushMirror12() { -	Common::Point pt((*_people)[PLAYER]._position.x / FIXED_INT_MULTIPLIER, (*_people)[PLAYER]._position.y / FIXED_INT_MULTIPLIER); +	Common::Point pt((*_people)[HOLMES]._position.x / FIXED_INT_MULTIPLIER, (*_people)[HOLMES]._position.y / FIXED_INT_MULTIPLIER);  	// If player is in range of the mirror, then draw the entire mirror area to the screen  	if (Common::Rect(70, 100, 200, 200).contains(pt)) diff --git a/engines/sherlock/scalpel/scalpel_map.cpp b/engines/sherlock/scalpel/scalpel_map.cpp index a9e566f73c..63cb4a342c 100644 --- a/engines/sherlock/scalpel/scalpel_map.cpp +++ b/engines/sherlock/scalpel/scalpel_map.cpp @@ -155,7 +155,7 @@ int ScalpelMap::show() {  	_drawMap = true;  	_charPoint = -1;  	_point = -1; -	people[PLAYER]._position = _lDrawnPos = _overPos; +	people[HOLMES]._position = _lDrawnPos = _overPos;  	// Show place icons  	showPlaces(); @@ -233,7 +233,7 @@ int ScalpelMap::show() {  		}  		if ((events._released || events._rightReleased) && _point != -1) { -			if (people[PLAYER]._walkCount == 0) { +			if (people[HOLMES]._walkCount == 0) {  				people._walkDest = _points[_point] + Common::Point(4, 9);  				_charPoint = _point; @@ -247,7 +247,7 @@ int ScalpelMap::show() {  		}  		// Check if a scene has beeen selected and we've finished "moving" to it -		if (people[PLAYER]._walkCount == 0) { +		if (people[HOLMES]._walkCount == 0) {  			if (_charPoint >= 1 && _charPoint < (int)_points.size())  				exitFlag = true;  		} @@ -266,7 +266,7 @@ int ScalpelMap::show() {  	}  	freeSprites(); -	_overPos = people[PLAYER]._position; +	_overPos = people[HOLMES]._position;  	// Reset font  	screen.setFont(oldFont); @@ -288,7 +288,7 @@ void ScalpelMap::setupSprites() {  	_shapes = new ImageFile("mapicon.vgs");  	_iconShapes = new ImageFile("overicon.vgs");  	_iconSave.create((*_shapes)[4]._width, (*_shapes)[4]._height, _vm->getPlatform()); -	Person &p = people[PLAYER]; +	Person &p = people[HOLMES];  	p._description = " ";  	p._type = CHARACTER;  	p._position = Common::Point(12400, 5000); @@ -353,11 +353,11 @@ void ScalpelMap::showPlaceName(int idx, bool highlighted) {  	int width = screen.stringWidth(name);  	if (!_cursorIndex) { -		saveIcon(people[PLAYER]._imageFrame, _lDrawnPos); +		saveIcon(people[HOLMES]._imageFrame, _lDrawnPos); -		bool flipped = people[PLAYER]._sequenceNumber == MAP_DOWNLEFT || people[PLAYER]._sequenceNumber == MAP_LEFT -			|| people[PLAYER]._sequenceNumber == MAP_UPLEFT; -		screen._backBuffer1.transBlitFrom(*people[PLAYER]._imageFrame, _lDrawnPos, flipped); +		bool flipped = people[HOLMES]._sequenceNumber == MAP_DOWNLEFT || people[HOLMES]._sequenceNumber == MAP_LEFT +			|| people[HOLMES]._sequenceNumber == MAP_UPLEFT; +		screen._backBuffer1.transBlitFrom(*people[HOLMES]._imageFrame, _lDrawnPos, flipped);  	}  	if (highlighted) { @@ -390,26 +390,26 @@ void ScalpelMap::updateMap(bool flushScreen) {  	else  		_savedPos.x = -1; -	people[PLAYER].adjustSprite(); +	people[HOLMES].adjustSprite(); -	_lDrawnPos.x = hPos.x = people[PLAYER]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x; -	_lDrawnPos.y = hPos.y = people[PLAYER]._position.y / FIXED_INT_MULTIPLIER - people[PLAYER].frameHeight() - _bigPos.y; +	_lDrawnPos.x = hPos.x = people[HOLMES]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x; +	_lDrawnPos.y = hPos.y = people[HOLMES]._position.y / FIXED_INT_MULTIPLIER - people[HOLMES].frameHeight() - _bigPos.y;  	// Draw the person icon -	saveIcon(people[PLAYER]._imageFrame, hPos); -	if (people[PLAYER]._sequenceNumber == MAP_DOWNLEFT || people[PLAYER]._sequenceNumber == MAP_LEFT -			|| people[PLAYER]._sequenceNumber == MAP_UPLEFT) -		screen._backBuffer1.transBlitFrom(*people[PLAYER]._imageFrame, hPos, true); +	saveIcon(people[HOLMES]._imageFrame, hPos); +	if (people[HOLMES]._sequenceNumber == MAP_DOWNLEFT || people[HOLMES]._sequenceNumber == MAP_LEFT +			|| people[HOLMES]._sequenceNumber == MAP_UPLEFT) +		screen._backBuffer1.transBlitFrom(*people[HOLMES]._imageFrame, hPos, true);  	else -		screen._backBuffer1.transBlitFrom(*people[PLAYER]._imageFrame, hPos, false); +		screen._backBuffer1.transBlitFrom(*people[HOLMES]._imageFrame, hPos, false);  	if (flushScreen) {  		screen.slamArea(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT);  	} else if (!_drawMap) {  		if (hPos.x > 0 && hPos.y >= 0 && hPos.x < SHERLOCK_SCREEN_WIDTH && hPos.y < SHERLOCK_SCREEN_HEIGHT) -			screen.flushImage(people[PLAYER]._imageFrame, Common::Point(people[PLAYER]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x, -			people[PLAYER]._position.y / FIXED_INT_MULTIPLIER - people[PLAYER].frameHeight() - _bigPos.y), -			&people[PLAYER]._oldPosition.x, &people[PLAYER]._oldPosition.y, &people[PLAYER]._oldSize.x, &people[PLAYER]._oldSize.y); +			screen.flushImage(people[HOLMES]._imageFrame, Common::Point(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER - _bigPos.x, +			people[HOLMES]._position.y / FIXED_INT_MULTIPLIER - people[HOLMES].frameHeight() - _bigPos.y), +			&people[HOLMES]._oldPosition.x, &people[HOLMES]._oldPosition.y, &people[HOLMES]._oldSize.x, &people[HOLMES]._oldSize.y);  		if (osPos.x != -1)  			screen.slamArea(osPos.x, osPos.y, osSize.x, osSize.y); @@ -428,15 +428,15 @@ void ScalpelMap::walkTheStreets() {  	const byte *path = _paths.getPath(start, dest);  	// Add in destination position -	people[PLAYER]._walkTo.clear(); +	people[HOLMES]._walkTo.clear();  	Common::Point destPos = people._walkDest;  	// Check for any intermediate points between the two locations  	if (path[0] || _charPoint > 50 || _oldCharPoint > 50) { -		people[PLAYER]._sequenceNumber = -1; +		people[HOLMES]._sequenceNumber = -1;  		if (_charPoint == 51 || _oldCharPoint == 51) { -			people[PLAYER].setWalking(); +			people[HOLMES].setWalking();  		} else {  			bool reversePath = false; @@ -453,25 +453,25 @@ void ScalpelMap::walkTheStreets() {  			} while (*path != 254);  			// Load up the path to use -			people[PLAYER]._walkTo.clear(); +			people[HOLMES]._walkTo.clear();  			if (reversePath) {  				for (int idx = (int)tempPath.size() - 1; idx >= 0; --idx) -					people[PLAYER]._walkTo.push(tempPath[idx]); +					people[HOLMES]._walkTo.push(tempPath[idx]);  			} else {  				for (int idx = 0; idx < (int)tempPath.size(); ++idx) -					people[PLAYER]._walkTo.push(tempPath[idx]); +					people[HOLMES]._walkTo.push(tempPath[idx]);  			} -			people._walkDest = people[PLAYER]._walkTo.pop() + Common::Point(12, 6); -			people[PLAYER].setWalking(); +			people._walkDest = people[HOLMES]._walkTo.pop() + Common::Point(12, 6); +			people[HOLMES].setWalking();  		}  	} else { -		people[PLAYER]._walkCount = 0; +		people[HOLMES]._walkCount = 0;  	}  	// Store the final destination icon position -	people[PLAYER]._walkTo.push(destPos); +	people[HOLMES]._walkTo.push(destPos);  }  void ScalpelMap::saveIcon(ImageFrame *src, const Common::Point &pt) { diff --git a/engines/sherlock/scalpel/scalpel_people.cpp b/engines/sherlock/scalpel/scalpel_people.cpp index b2aa4dcbb1..31be9b4cbc 100644 --- a/engines/sherlock/scalpel/scalpel_people.cpp +++ b/engines/sherlock/scalpel/scalpel_people.cpp @@ -52,8 +52,8 @@ void ScalpelPerson::adjustSprite() {  		if (!_walkCount) {  			// If there any points left for the character to walk to along the  			// route to a destination, then move to the next point -			if (!people[PLAYER]._walkTo.empty()) { -				people._walkDest = people[PLAYER]._walkTo.pop(); +			if (!people[HOLMES]._walkTo.empty()) { +				people._walkDest = people[HOLMES]._walkTo.pop();  				setWalking();  			} else {  				gotoStand(); @@ -179,8 +179,8 @@ void ScalpelPerson::gotoStand() {  	if (map._active) {  		_sequenceNumber = 0; -		people[PLAYER]._position.x = (map[map._charPoint].x - 6) * FIXED_INT_MULTIPLIER; -		people[PLAYER]._position.y = (map[map._charPoint].y + 10) * FIXED_INT_MULTIPLIER; +		people[HOLMES]._position.x = (map[map._charPoint].x - 6) * FIXED_INT_MULTIPLIER; +		people[HOLMES]._position.y = (map[map._charPoint].y + 10) * FIXED_INT_MULTIPLIER;  	}  	_oldWalkSequence = -1; @@ -401,14 +401,14 @@ void ScalpelPeople::setTalking(int speaker) {  void ScalpelPeople::synchronize(Serializer &s) {  	s.syncAsByte(_holmesOn); -	s.syncAsSint32LE(_data[PLAYER]->_position.x); -	s.syncAsSint32LE(_data[PLAYER]->_position.y); -	s.syncAsSint16LE(_data[PLAYER]->_sequenceNumber); +	s.syncAsSint32LE(_data[HOLMES]->_position.x); +	s.syncAsSint32LE(_data[HOLMES]->_position.y); +	s.syncAsSint16LE(_data[HOLMES]->_sequenceNumber);  	s.syncAsSint16LE(_holmesQuotient);  	if (s.isLoading()) { -		_hSavedPos = _data[PLAYER]->_position; -		_hSavedFacing = _data[PLAYER]->_sequenceNumber; +		_hSavedPos = _data[HOLMES]->_position; +		_hSavedFacing = _data[HOLMES]->_sequenceNumber;  	}  } @@ -442,22 +442,20 @@ void ScalpelPeople::setTalkSequence(int speaker, int sequenceNum) {  	}  } -  bool ScalpelPeople::loadWalk() { -	Resources &res = *_vm->_res;  	bool result = false; -	if (_data[PLAYER]->_walkLoaded) { +	if (_data[HOLMES]->_walkLoaded) {  		return false;  	} else {  		if (_vm->getPlatform() != Common::kPlatform3DO) { -			_data[PLAYER]->_images = new ImageFile("walk.vgs"); +			_data[HOLMES]->_images = new ImageFile("walk.vgs");  		} else {  			// Load walk.anim on 3DO, which is a cel animation file -			_data[PLAYER]->_images = new ImageFile3DO("walk.anim", kImageFile3DOType_CelAnimation); +			_data[HOLMES]->_images = new ImageFile3DO("walk.anim", kImageFile3DOType_CelAnimation);  		} -		_data[PLAYER]->setImageFrame(); -		_data[PLAYER]->_walkLoaded = true; +		_data[HOLMES]->setImageFrame(); +		_data[HOLMES]->_walkLoaded = true;  		result = true;  	} diff --git a/engines/sherlock/scalpel/scalpel_scene.cpp b/engines/sherlock/scalpel/scalpel_scene.cpp index f053747a56..87fe208520 100644 --- a/engines/sherlock/scalpel/scalpel_scene.cpp +++ b/engines/sherlock/scalpel/scalpel_scene.cpp @@ -138,7 +138,7 @@ void ScalpelScene::drawAllShapes() {  void ScalpelScene::checkBgShapes() {  	People &people = *_vm->_people; -	Person &holmes = people[PLAYER]; +	Person &holmes = people[HOLMES];  	Common::Point pt(holmes._position.x / FIXED_INT_MULTIPLIER, holmes._position.y / FIXED_INT_MULTIPLIER);  	// Call the base scene method to handle bg shapes @@ -229,14 +229,14 @@ void ScalpelScene::doBgAnim() {  			vm.eraseMirror12();  		// Restore the back buffer from the back buffer 2 in the changed area -		Common::Rect bounds(people[PLAYER]._oldPosition.x, people[PLAYER]._oldPosition.y, -			people[PLAYER]._oldPosition.x + people[PLAYER]._oldSize.x, -			people[PLAYER]._oldPosition.y + people[PLAYER]._oldSize.y); +		Common::Rect bounds(people[HOLMES]._oldPosition.x, people[HOLMES]._oldPosition.y, +			people[HOLMES]._oldPosition.x + people[HOLMES]._oldSize.x, +			people[HOLMES]._oldPosition.y + people[HOLMES]._oldSize.y);  		Common::Point pt(bounds.left, bounds.top); -		if (people[PLAYER]._type == CHARACTER) +		if (people[HOLMES]._type == CHARACTER)  			screen.restoreBackground(bounds); -		else if (people[PLAYER]._type == REMOVE) +		else if (people[HOLMES]._type == REMOVE)  			screen._backBuffer->blitFrom(screen._backBuffer2, pt, bounds);  		for (uint idx = 0; idx < _bgShapes.size(); ++idx) { @@ -291,8 +291,8 @@ void ScalpelScene::doBgAnim() {  			_canimShapes[idx].adjustObject();  	} -	if (people[PLAYER]._type == CHARACTER && people._holmesOn) -		people[PLAYER].adjustSprite(); +	if (people[HOLMES]._type == CHARACTER && people._holmesOn) +		people[HOLMES].adjustSprite();  	// Flag the bg shapes which need to be redrawn  	checkBgShapes(); @@ -331,16 +331,16 @@ void ScalpelScene::doBgAnim() {  	}  	// Draw the person if not animating -	if (people[PLAYER]._type == CHARACTER && people[PLAYER]._walkLoaded) { +	if (people[HOLMES]._type == CHARACTER && people[HOLMES]._walkLoaded) {  		// If Holmes is too far to the right, move him back so he's on-screen -		int xRight = SHERLOCK_SCREEN_WIDTH - 2 - people[PLAYER]._imageFrame->_frame.w; -		int tempX = MIN(people[PLAYER]._position.x / FIXED_INT_MULTIPLIER, xRight); +		int xRight = SHERLOCK_SCREEN_WIDTH - 2 - people[HOLMES]._imageFrame->_frame.w; +		int tempX = MIN(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER, xRight); -		bool flipped = people[PLAYER]._sequenceNumber == WALK_LEFT || people[PLAYER]._sequenceNumber == STOP_LEFT || -			people[PLAYER]._sequenceNumber == WALK_UPLEFT || people[PLAYER]._sequenceNumber == STOP_UPLEFT || -			people[PLAYER]._sequenceNumber == WALK_DOWNRIGHT || people[PLAYER]._sequenceNumber == STOP_DOWNRIGHT; -		screen._backBuffer->transBlitFrom(*people[PLAYER]._imageFrame, -			Common::Point(tempX, people[PLAYER]._position.y / FIXED_INT_MULTIPLIER - people[PLAYER]._imageFrame->_frame.h), flipped); +		bool flipped = people[HOLMES]._sequenceNumber == WALK_LEFT || people[HOLMES]._sequenceNumber == STOP_LEFT || +			people[HOLMES]._sequenceNumber == WALK_UPLEFT || people[HOLMES]._sequenceNumber == STOP_UPLEFT || +			people[HOLMES]._sequenceNumber == WALK_DOWNRIGHT || people[HOLMES]._sequenceNumber == STOP_DOWNRIGHT; +		screen._backBuffer->transBlitFrom(*people[HOLMES]._imageFrame, +			Common::Point(tempX, people[HOLMES]._position.y / FIXED_INT_MULTIPLIER - people[HOLMES]._imageFrame->_frame.h), flipped);  	}  	// Draw all static and active shapes are NORMAL and are in front of the person @@ -390,20 +390,20 @@ void ScalpelScene::doBgAnim() {  		_animating = 0;  		screen.slamRect(Common::Rect(0, 0, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCENE_HEIGHT));  	} else { -		if (people[PLAYER]._type != INVALID && ((_goToScene == -1 || _canimShapes.empty()))) { -			if (people[PLAYER]._type == REMOVE) { +		if (people[HOLMES]._type != INVALID && ((_goToScene == -1 || _canimShapes.empty()))) { +			if (people[HOLMES]._type == REMOVE) {  				screen.slamRect(Common::Rect( -					people[PLAYER]._oldPosition.x, people[PLAYER]._oldPosition.y, -					people[PLAYER]._oldPosition.x + people[PLAYER]._oldSize.x, -					people[PLAYER]._oldPosition.y + people[PLAYER]._oldSize.y +					people[HOLMES]._oldPosition.x, people[HOLMES]._oldPosition.y, +					people[HOLMES]._oldPosition.x + people[HOLMES]._oldSize.x, +					people[HOLMES]._oldPosition.y + people[HOLMES]._oldSize.y  				)); -				people[PLAYER]._type = INVALID; +				people[HOLMES]._type = INVALID;  			} else { -				screen.flushImage(people[PLAYER]._imageFrame, -					Common::Point(people[PLAYER]._position.x / FIXED_INT_MULTIPLIER, -						people[PLAYER]._position.y / FIXED_INT_MULTIPLIER - people[PLAYER].frameHeight()), -					&people[PLAYER]._oldPosition.x, &people[PLAYER]._oldPosition.y, -					&people[PLAYER]._oldSize.x, &people[PLAYER]._oldSize.y); +				screen.flushImage(people[HOLMES]._imageFrame, +					Common::Point(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER, +						people[HOLMES]._position.y / FIXED_INT_MULTIPLIER - people[HOLMES].frameHeight()), +					&people[HOLMES]._oldPosition.x, &people[HOLMES]._oldPosition.y, +					&people[HOLMES]._oldSize.x, &people[HOLMES]._oldSize.y);  			}  		} @@ -525,8 +525,8 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) {  	if (walkPos.x != -1) {  		// Holmes must walk to the walk point before the cAnimation is started -		if (people[PLAYER]._position != walkPos) -			people[PLAYER].walkToCoords(walkPos, walkDir); +		if (people[HOLMES]._position != walkPos) +			people[HOLMES].walkToCoords(walkPos, walkDir);  	}  	if (talk._talkToAbort) @@ -563,7 +563,7 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) {  	if (cAnim._name.size() > 0 && cAnim._type != NO_SHAPE) {  		if (tpPos.x != -1) -			people[PLAYER]._type = REMOVE; +			people[HOLMES]._type = REMOVE;  		Common::String fname = cAnim._name + ".vgs";  		if (!res.isInCache(fname)) { @@ -653,14 +653,14 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) {  			cObj._frameNumber += dir;  		} -		people[PLAYER]._type = CHARACTER; +		people[HOLMES]._type = CHARACTER;  	}  	// Teleport to ending coordinates if necessary  	if (tpPos.x != -1) { -		people[PLAYER]._position = tpPos;	// Place the player -		people[PLAYER]._sequenceNumber = tpDir; -		people[PLAYER].gotoStand(); +		people[HOLMES]._position = tpPos;	// Place the player +		people[HOLMES]._sequenceNumber = tpDir; +		people[HOLMES].gotoStand();  	}  	if (playRate < 0) @@ -686,10 +686,10 @@ int ScalpelScene::startCAnim(int cAnimNum, int playRate) {  	if (tpPos.x != -1 && !talk._talkToAbort) {  		// Teleport to ending coordinates -		people[PLAYER]._position = tpPos; -		people[PLAYER]._sequenceNumber = tpDir; +		people[HOLMES]._position = tpPos; +		people[HOLMES]._sequenceNumber = tpDir; -		people[PLAYER].gotoStand(); +		people[HOLMES].gotoStand();  	}  	events.setCursor(oldCursor); diff --git a/engines/sherlock/scalpel/scalpel_talk.cpp b/engines/sherlock/scalpel/scalpel_talk.cpp index 5d2ece611b..ea5a0fb713 100644 --- a/engines/sherlock/scalpel/scalpel_talk.cpp +++ b/engines/sherlock/scalpel/scalpel_talk.cpp @@ -456,7 +456,7 @@ OpcodeReturn ScalpelTalk::cmdWalkToCoords(const byte *&str) {  	People &people = *_vm->_people;  	++str; -	people[PLAYER].walkToCoords(Point32(((str[0] - 1) * 256 + str[1] - 1) * FIXED_INT_MULTIPLIER, +	people[HOLMES].walkToCoords(Point32(((str[0] - 1) * 256 + str[1] - 1) * FIXED_INT_MULTIPLIER,  		str[2] * FIXED_INT_MULTIPLIER), str[3] - 1);  	if (_talkToAbort)  		return RET_EXIT; diff --git a/engines/sherlock/scalpel/scalpel_user_interface.cpp b/engines/sherlock/scalpel/scalpel_user_interface.cpp index cb2bf65342..8dd15e5827 100644 --- a/engines/sherlock/scalpel/scalpel_user_interface.cpp +++ b/engines/sherlock/scalpel/scalpel_user_interface.cpp @@ -326,7 +326,7 @@ void ScalpelUserInterface::handleInput() {  			} else {  				people._walkDest = pt;  				people._allowWalkAbort = false; -				people[PLAYER].goAllTheWay(); +				people[HOLMES].goAllTheWay();  			}  			if (_oldKey != -1) { @@ -511,7 +511,7 @@ void ScalpelUserInterface::examine() {  			scene.startCAnim(_cNum, canimSpeed);  		} else if (obj._lookPosition.y != 0) {  			// Need to walk to the object to be examined -			people[PLAYER].walkToCoords(obj._lookPosition, obj._lookFacing); +			people[HOLMES].walkToCoords(obj._lookPosition, obj._lookFacing);  		}  		if (!talk._talkToAbort) { @@ -2236,13 +2236,13 @@ void ScalpelUserInterface::checkAction(ActionType &action, const char *const mes  					printed = true;  					if (pt.x != -1)  						// Holmes needs to walk to object before the action is done -						people[PLAYER].walkToCoords(pt, dir); +						people[HOLMES].walkToCoords(pt, dir);  					if (!talk._talkToAbort) {  						// Ensure Holmes is on the exact intended location -						people[PLAYER]._position = pt; -						people[PLAYER]._sequenceNumber = dir; -						people[PLAYER].gotoStand(); +						people[HOLMES]._position = pt; +						people[HOLMES]._sequenceNumber = dir; +						people[HOLMES].gotoStand();  						talk.talkTo(action._names[nameIdx].c_str() + 2);  						if (ch == 'T') @@ -2255,7 +2255,7 @@ void ScalpelUserInterface::checkAction(ActionType &action, const char *const mes  		if (doCAnim && !talk._talkToAbort) {  			if (pt.x != -1)  				// Holmes needs to walk to object before the action is done -				people[PLAYER].walkToCoords(pt, dir); +				people[HOLMES].walkToCoords(pt, dir);  		}  		for (int nameIdx = 0; nameIdx < NAMES_COUNT; ++nameIdx) { diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index 2e80f0789e..da7f088a06 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -240,8 +240,8 @@ void Scene::selectScene() {  		_tempFadeStyle = 0;  	} -	people._walkDest = Common::Point(people[PLAYER]._position.x / FIXED_INT_MULTIPLIER, -		people[PLAYER]._position.y / FIXED_INT_MULTIPLIER); +	people._walkDest = Common::Point(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER, +		people[HOLMES]._position.y / FIXED_INT_MULTIPLIER);  	_restoreFlag = true;  	events.clearEvents(); @@ -964,8 +964,8 @@ void Scene::transitionToScene() {  				hSavedPos = Point32(160 * FIXED_INT_MULTIPLIER, 100 * FIXED_INT_MULTIPLIER);  				hSavedFacing = 4;  			} else { -				hSavedPos = people[PLAYER]._position; -				hSavedFacing = people[PLAYER]._sequenceNumber; +				hSavedPos = people[HOLMES]._position; +				hSavedFacing = people[HOLMES]._sequenceNumber;  			}  		} else {  			// setup entrance info @@ -988,8 +988,8 @@ void Scene::transitionToScene() {  	if (hSavedFacing < 101) {  		// Standard info, so set it -		people[PLAYER]._position = hSavedPos; -		people[PLAYER]._sequenceNumber = hSavedFacing; +		people[HOLMES]._position = hSavedPos; +		people[HOLMES]._sequenceNumber = hSavedFacing;  	} else {  		// It's canimation information  		cAnimNum = hSavedFacing - 101; @@ -1001,7 +1001,7 @@ void Scene::transitionToScene() {  	if (cAnimNum != -1) {  		// Prevent Holmes from being drawn -		people[PLAYER]._position = Common::Point(0, 0); +		people[HOLMES]._position = Common::Point(0, 0);  	}  	for (uint objIdx = 0; objIdx < _bgShapes.size(); ++objIdx) { @@ -1020,8 +1020,8 @@ void Scene::transitionToScene() {  			}  			if (Common::Rect(topLeft.x, topLeft.y, bottomRight.x, bottomRight.y).contains( -					Common::Point(people[PLAYER]._position.x / FIXED_INT_MULTIPLIER,  -					people[PLAYER]._position.y / FIXED_INT_MULTIPLIER))) { +					Common::Point(people[HOLMES]._position.x / FIXED_INT_MULTIPLIER,  +					people[HOLMES]._position.y / FIXED_INT_MULTIPLIER))) {  				// Current point is already inside box - impact occurred on  				// a previous call. So simply do nothing except talk until the  				// player is clear of the box @@ -1073,7 +1073,7 @@ void Scene::transitionToScene() {  		PositionFacing pt = c._goto[0];  		c._goto[0].x = c._goto[0].y = -1; -		people[PLAYER]._position = Common::Point(0, 0); +		people[HOLMES]._position = Common::Point(0, 0);  		startCAnim(cAnimNum, 1);  		c._goto[0] = pt; @@ -1205,7 +1205,7 @@ void Scene::synchronize(Serializer &s) {  void Scene::checkBgShapes() {  	People &people = *_vm->_people; -	Person &holmes = people[PLAYER]; +	Person &holmes = people[HOLMES];  	Common::Point pt(holmes._position.x / FIXED_INT_MULTIPLIER, holmes._position.y / FIXED_INT_MULTIPLIER);  	// Iterate through the shapes diff --git a/engines/sherlock/talk.cpp b/engines/sherlock/talk.cpp index 0e9feedd87..bb8a059d34 100644 --- a/engines/sherlock/talk.cpp +++ b/engines/sherlock/talk.cpp @@ -169,13 +169,13 @@ void Talk::talkTo(const Common::String &filename) {  	// Turn on the Exit option  	ui._endKeyActive = true; -	if (people[PLAYER]._walkCount || people[PLAYER]._walkTo.size() > 0) { +	if (people[HOLMES]._walkCount || people[HOLMES]._walkTo.size() > 0) {  		// Only interrupt if an action if trying to do an action, and not just  		// if the player is walking around the scene  		if (people._allowWalkAbort)  			abortFlag = true; -		people[PLAYER].gotoStand(); +		people[HOLMES].gotoStand();  	}  	if (_talkToAbort) @@ -501,7 +501,7 @@ void Talk::talk(int objNum) {  		events.setCursor(WAIT);  		if (obj._lookPosition.y != 0)  			// Need to walk to character first -			people[PLAYER].walkToCoords(obj._lookPosition, obj._lookFacing); +			people[HOLMES].walkToCoords(obj._lookPosition, obj._lookFacing);  		events.setCursor(ARROW);  		if (!_talkToAbort) @@ -516,7 +516,7 @@ void Talk::talk(int objNum) {  		events.setCursor(WAIT);  		if (obj._lookPosition.y != 0)  			// Walk over to person to talk to -			people[PLAYER].walkToCoords(obj._lookPosition, obj._lookFacing); +			people[HOLMES].walkToCoords(obj._lookPosition, obj._lookFacing);  		events.setCursor(ARROW);  		if (!_talkToAbort) { @@ -1318,14 +1318,14 @@ OpcodeReturn Talk::cmdEnableEndKey(const byte *&str) {  OpcodeReturn Talk::cmdHolmesOff(const byte *&str) {  	People &people = *_vm->_people; -	people[PLAYER]._type = REMOVE; +	people[HOLMES]._type = REMOVE;  	return RET_SUCCESS;  }  OpcodeReturn Talk::cmdHolmesOn(const byte *&str) {  	People &people = *_vm->_people; -	people[PLAYER]._type = CHARACTER; +	people[HOLMES]._type = CHARACTER;  	return RET_SUCCESS;  } @@ -1452,7 +1452,7 @@ OpcodeReturn Talk::cmdWalkToCAnimation(const byte *&str) {  	++str;  	CAnim &animation = scene._cAnim[str[0] - 1]; -	people[PLAYER].walkToCoords(animation._goto[0], animation._goto[0]._facing); +	people[HOLMES].walkToCoords(animation._goto[0], animation._goto[0]._facing);  	return _talkToAbort ? RET_EXIT : RET_SUCCESS;  } diff --git a/engines/sherlock/tattoo/tattoo.cpp b/engines/sherlock/tattoo/tattoo.cpp index 0961601487..60803c7fbb 100644 --- a/engines/sherlock/tattoo/tattoo.cpp +++ b/engines/sherlock/tattoo/tattoo.cpp @@ -33,6 +33,7 @@ namespace Tattoo {  TattooEngine::TattooEngine(OSystem *syst, const SherlockGameDescription *gameDesc) :  		SherlockEngine(syst, gameDesc) {  	_creditsActive = false; +	_runningProlog = false;  }  void TattooEngine::showOpening() { @@ -48,6 +49,7 @@ void TattooEngine::initialize() {  	// Initialise the global flags  	_flags.resize(3200);  	_flags[1] = _flags[4] = _flags[76] = true; +	_runningProlog = true;  	// Add some more files to the cache  	_res->addToCache("walk.lib"); diff --git a/engines/sherlock/tattoo/tattoo.h b/engines/sherlock/tattoo/tattoo.h index 28fa77f409..6cafc3fe52 100644 --- a/engines/sherlock/tattoo/tattoo.h +++ b/engines/sherlock/tattoo/tattoo.h @@ -49,6 +49,7 @@ protected:  	virtual void startScene();  public:  	bool _creditsActive; +	bool _runningProlog;  public:  	TattooEngine(OSystem *syst, const SherlockGameDescription *gameDesc);  	virtual ~TattooEngine() {} diff --git a/engines/sherlock/tattoo/tattoo_people.cpp b/engines/sherlock/tattoo/tattoo_people.cpp index f70b079760..7560ca1593 100644 --- a/engines/sherlock/tattoo/tattoo_people.cpp +++ b/engines/sherlock/tattoo/tattoo_people.cpp @@ -108,7 +108,7 @@ void TattooPerson::adjustSprite() {  	// See if the player has come to a stop after clicking on an Arrow zone to leave the scene.  	// If so, this will set up the exit information for the scene transition  	if (!_walkCount && scene._exitZone != -1 && scene._walkedInScene && scene._goToScene != -1 && -			!_description.compareToIgnoreCase(people[PLAYER]._description)) {  +			!_description.compareToIgnoreCase(people[HOLMES]._description)) {   		people._hSavedPos = scene._exits[scene._exitZone]._newPosition;  		people._hSavedFacing = scene._exits[scene._exitZone]._newFacing; @@ -187,20 +187,20 @@ void TattooPerson::gotoStand() {  	if (npc != -1 && people[npc]._npcFacing != -1) {  		if (people[npc]._npcFacing == FACING_PLAYER) {  			// See where Holmes is with respect to the NPC (x coords) -			if (people[PLAYER]._position.x < people[npc]._position.x) +			if (people[HOLMES]._position.x < people[npc]._position.x)  				people[npc]._npcFacing = STOP_LEFT;  			else  				people[npc]._npcFacing = STOP_RIGHT;  			// See where Holmes is with respect to the NPC (y coords) -			if (people[PLAYER]._position.y < people[npc]._position.y - (10 * FIXED_INT_MULTIPLIER)) { +			if (people[HOLMES]._position.y < people[npc]._position.y - (10 * FIXED_INT_MULTIPLIER)) {  				// Holmes is above the NPC so reset the facing to the diagonal ups  				if (people[npc]._npcFacing == STOP_RIGHT)  					people[npc]._npcFacing = STOP_UPRIGHT;  				else  					people[npc]._npcFacing = STOP_UPLEFT;  			} else { -				if (people[PLAYER]._position.y > people[npc]._position.y + (10 * FIXED_INT_MULTIPLIER)) { +				if (people[HOLMES]._position.y > people[npc]._position.y + (10 * FIXED_INT_MULTIPLIER)) {  					// Holmes is below the NPC so reset the facing to the diagonal downs  					if (people[npc]._npcFacing == STOP_RIGHT)  						people[npc]._npcFacing = STOP_DOWNRIGHT; @@ -446,7 +446,7 @@ int TattooPeople::findSpeaker(int speaker) {  	if (result == -1) {  		bool flag = _vm->readFlags(76); -		if (_data[PLAYER]->_type == CHARACTER && ((speaker == 0 && flag) || (speaker == 1 && !flag))) +		if (_data[HOLMES]->_type == CHARACTER && ((speaker == 0 && flag) || (speaker == 1 && !flag)))  			return -1;  		for (uint idx = 1; idx < _data.size(); ++idx) { @@ -481,8 +481,8 @@ void TattooPeople::synchronize(Serializer &s) {  	s.syncAsSint16LE(_holmesQuotient);  	if (s.isLoading()) { -		_hSavedPos = _data[PLAYER]->_position; -		_hSavedFacing = _data[PLAYER]->_sequenceNumber; +		_hSavedPos = _data[HOLMES]->_position; +		_hSavedFacing = _data[HOLMES]->_sequenceNumber;  	}  } diff --git a/engines/sherlock/tattoo/tattoo_scene.cpp b/engines/sherlock/tattoo/tattoo_scene.cpp index ce20f17730..a64c86b24b 100644 --- a/engines/sherlock/tattoo/tattoo_scene.cpp +++ b/engines/sherlock/tattoo/tattoo_scene.cpp @@ -803,10 +803,134 @@ void TattooScene::setupBGArea(const byte cMap[PALETTE_SIZE]) {  	}  } +#define ADJUST_COORD(COORD) if (COORD != -1) COORD *= FIXED_INT_MULTIPLIER +  int TattooScene::startCAnim(int cAnimNum, int playRate) { -	error("TODO: startCAnim"); +	TattooEngine &vm = *(TattooEngine *)_vm; +	Events &events = *_vm->_events; +	TattooPeople &people = *(TattooPeople *)_vm->_people; +	Resources &res = *_vm->_res; +	Talk &talk = *_vm->_talk; +	UserInterface &ui = *_vm->_ui; + +	// Exit immediately if the anim number is out of range, or the anim doesn't have a position specified +	if (cAnimNum < 0 || cAnimNum >= (int)_cAnim.size() || _cAnim[cAnimNum]._position.x == -1) +		// Return out of range error +		return -1; + +	// Get the co-ordinates that the Player & NPC #1 must walk to and end on +	CAnim &cAnim = _cAnim[cAnimNum]; +	PositionFacing goto1 = cAnim._goto[0]; +	PositionFacing goto2 = cAnim._goto[1]; +	PositionFacing teleport1 = cAnim._teleport[0]; +	PositionFacing teleport2 = cAnim._teleport[1]; + +	// If the co-ordinates are valid (not -1), adjust them by the fixed int multiplier +	ADJUST_COORD(goto1.x); +	ADJUST_COORD(goto1.y); +	ADJUST_COORD(goto2.x); +	ADJUST_COORD(goto2.y); +	ADJUST_COORD(teleport1.x); +	ADJUST_COORD(teleport1.y); +	ADJUST_COORD(teleport2.x); +	ADJUST_COORD(teleport2.y); + +	// See if the Player must walk to a position before the animation starts +	SpriteType savedPlayerType = people[HOLMES]._type; +	if (goto1.x != -1 && people[HOLMES]._type == CHARACTER) { +		if (people[HOLMES]._position != goto1) +			people[HOLMES].walkToCoords(goto1, goto1._facing); +	} + +	if (talk._talkToAbort) +		return 1; + +	// See if NPC #1 must walk to a position before the animation starts +	SpriteType savedNPCType = people[WATSON]._type; +	if (goto2.x != -1 && people[WATSON]._type == CHARACTER) { +		if (people[WATSON]._position != goto2) +			people[WATSON].walkToCoords(goto2, goto2._facing); +	} + +	if (talk._talkToAbort) +		return 1; + +	// Turn the player (and NPC #1 if neccessary) off before running the canimation +	if (teleport1.x != -1 && savedPlayerType == CHARACTER) +		people[HOLMES]._type = REMOVE; + +	if (teleport2.x != -1 && savedNPCType == CHARACTER) +		people[WATSON]._type = REMOVE; + +	if (ui._windowOpen) +		ui.banishWindow(); +	 +	//_activeCAnim._filesize = cAnim._size; + +	// Open up the room resource file and get the data for the animation +	Common::SeekableReadStream *stream = res.load(_rrmName); +	stream->seek(44 + cAnimNum * 4); +	stream->seek(stream->readUint32LE()); +	Common::SeekableReadStream *animStream = stream->readStream(cAnim._size); +	delete stream; + +	// Set up the active animation +	_activeCAnim._position = cAnim._position; +	_activeCAnim._oldBounds = Common::Rect(0, 0, 0, 0); +	_activeCAnim._flags = cAnim._flags; +	_activeCAnim._scaleVal = cAnim._scaleVal; +	_activeCAnim._zPlacement = 0; + +	_activeCAnim.load(animStream); + +	while (_activeCAnim.active() && !_vm->shouldQuit()) { +		doBgAnim(); + +		events.pollEvents(); +		if (events.kbHit()) { +			Common::KeyState keyState = events.getKey(); + +			if (keyState.keycode == Common::KEYCODE_ESCAPE && vm._runningProlog) { +				_vm->setFlags(-76); +				_vm->setFlags(396); +				_goToScene = 1; +				talk._talkToAbort = true; +				_activeCAnim.close(); +			} +		} +	} + +	// Turn the people back on +	people[HOLMES]._type = savedPlayerType; +	if (teleport2.x != -1) +		people[WATSON]._type = savedNPCType; + +	// Teleport the Player to the ending coordinates if necessary +	if (teleport1.x != -1 && savedPlayerType == CHARACTER) { +		people[HOLMES]._position = teleport1; +		people[HOLMES]._sequenceNumber = teleport1._facing; +		people[HOLMES].gotoStand(); +	} + +	// Teleport Watson to the ending coordinates if necessary +	if (teleport2.x != -1 && savedNPCType == CHARACTER) { +		people[WATSON]._position = teleport2; +		people[WATSON]._sequenceNumber = teleport2._facing; +		people[WATSON].gotoStand(); +	} + +	// Flag the Canimation to be cleared +	_activeCAnim._zPlacement = REMOVE; +	_activeCAnim._removeBounds = _activeCAnim._oldBounds; + +	// Free up the animation +	_activeCAnim.close(); + +	return 1;  } +#undef ADJUST_COORD +  void TattooScene::setNPCPath(int npc) {  	TattooPeople &people = *(TattooPeople *)_vm->_people;  	Talk &talk = *_vm->_talk; diff --git a/engines/sherlock/tattoo/tattoo_talk.cpp b/engines/sherlock/tattoo/tattoo_talk.cpp index 28c0132dd9..3768d12497 100644 --- a/engines/sherlock/tattoo/tattoo_talk.cpp +++ b/engines/sherlock/tattoo/tattoo_talk.cpp @@ -243,7 +243,7 @@ OpcodeReturn TattooTalk::cmdWalkHolmesToCoords(const byte *&str) {  		x = -1 * (x - 16384);  	// TODO: The RT walkToCoords call has an extra parameter, person, which is 0 (Holmes) here  	warning("TODO: cmdWalkHolmesToCoords - call RT walkToCoords variant"); -	people[PLAYER].walkToCoords(Point32(x * FIXED_INT_MULTIPLIER, +	people[HOLMES].walkToCoords(Point32(x * FIXED_INT_MULTIPLIER,  		((str[2] - 1) * 256 + str[3] - 1) * FIXED_INT_MULTIPLIER), DIRECTION_CONVERSION[str[4] - 1]);  	if (_talkToAbort)  		return RET_EXIT;  | 
