diff options
| author | Paul Gilbert | 2015-04-17 00:07:31 -0500 | 
|---|---|---|
| committer | Paul Gilbert | 2015-04-17 00:07:31 -0500 | 
| commit | 19142ef58a3e632b31a87a99b817e261f47c1bc4 (patch) | |
| tree | 306777f935558a3cb60a64a0985c29b38006e604 | |
| parent | 9ba234c0e09c4fc034ddd82f82483e10e2470dec (diff) | |
| download | scummvm-rg350-19142ef58a3e632b31a87a99b817e261f47c1bc4.tar.gz scummvm-rg350-19142ef58a3e632b31a87a99b817e261f47c1bc4.tar.bz2 scummvm-rg350-19142ef58a3e632b31a87a99b817e261f47c1bc4.zip | |
SHERLOCK: Implement map icon drawing/restoring
| -rw-r--r-- | engines/sherlock/graphics.cpp | 13 | ||||
| -rw-r--r-- | engines/sherlock/graphics.h | 2 | ||||
| -rw-r--r-- | engines/sherlock/map.cpp | 116 | ||||
| -rw-r--r-- | engines/sherlock/map.h | 7 | 
4 files changed, 126 insertions, 12 deletions
| diff --git a/engines/sherlock/graphics.cpp b/engines/sherlock/graphics.cpp index 306ff23548..6e986c839b 100644 --- a/engines/sherlock/graphics.cpp +++ b/engines/sherlock/graphics.cpp @@ -28,7 +28,7 @@  namespace Sherlock {  Surface::Surface(uint16 width, uint16 height): _freePixels(true) { -	create(width, height, Graphics::PixelFormat::createFormatCLUT8()); +	create(width, height);  }  Surface::Surface(Surface &src, const Common::Rect &r) : _freePixels(false) { @@ -39,12 +39,23 @@ Surface::Surface(Surface &src, const Common::Rect &r) : _freePixels(false) {  	format = Graphics::PixelFormat::createFormatCLUT8();  } +Surface::Surface() : _freePixels(false) { +}  Surface::~Surface() {  	if (_freePixels)  		free();  } +void Surface::create(uint16 width, uint16 height) { +	if (_freePixels) +		free(); + +	Graphics::Surface::create(width, height, Graphics::PixelFormat::createFormatCLUT8()); +	_freePixels = true; +} + +  /**   * Copy a surface into this one   */ diff --git a/engines/sherlock/graphics.h b/engines/sherlock/graphics.h index b54dc1ec37..85f3ba8c40 100644 --- a/engines/sherlock/graphics.h +++ b/engines/sherlock/graphics.h @@ -40,8 +40,10 @@ protected:  	Surface(Surface &src, const Common::Rect &r);  public:      Surface(uint16 width, uint16 height); +	Surface();  	~Surface(); +	void create(uint16 width, uint16 height);  	void blitFrom(const Graphics::Surface &src);  	void blitFrom(const Graphics::Surface &src, const Common::Point &pt);  	void blitFrom(const Graphics::Surface &src, const Common::Point &pt, diff --git a/engines/sherlock/map.cpp b/engines/sherlock/map.cpp index aae8d683c0..fa3bf99cab 100644 --- a/engines/sherlock/map.cpp +++ b/engines/sherlock/map.cpp @@ -26,11 +26,14 @@  namespace Sherlock {  Map::Map(SherlockEngine *vm): _vm(vm), _topLine(SHERLOCK_SCREEN_WIDTH, 12) { +	_mapCursors = nullptr;  	_shapes = nullptr;  	_iconShapes = nullptr;  	_point = 0;  	_placesShown = false;  	_charPoint = -1; +	_cursorIndex = -1; +	_drawMap = false;  	for (int idx = 0; idx < 3; ++idx)  		Common::fill(&_sequences[idx][0], &_sequences[idx][MAX_FRAME], 0); @@ -89,19 +92,14 @@ void Map::loadData() {  int Map::show() {  	Events &events = *_vm->_events;  	People &people = *_vm->_people; -	Scene &scene = *_vm->_scene;  	Screen &screen = *_vm->_screen;  	Common::Point lDrawn(-1, -1);  	bool changed = false, exitFlag = false; -	bool drawMap = true;  	// Set font and custom cursor for the map  	int oldFont = screen.fontNumber();  	screen.setFont(0); -	ImageFile mapCursors("omouse.vgs"); -	events.setCursor(mapCursors[0]); -  	// Load the entire map  	ImageFile bigMap("bigmap.vgs"); @@ -113,6 +111,7 @@ int Map::show() {  	screen._backBuffer1.blitFrom(bigMap[3], Common::Point(SHERLOCK_SCREEN_WIDTH - _bigPos.x, -_bigPos.y));  	screen._backBuffer1.blitFrom(bigMap[4], Common::Point(SHERLOCK_SCREEN_WIDTH - _bigPos.x, SHERLOCK_SCREEN_HEIGHT - _bigPos.y)); +	_drawMap = true;  	_point = -1;  	people[AL]._position = _lDrawnPos = _overPos; @@ -139,7 +138,7 @@ int Map::show() {  		}  		// Ignore scrolling attempts until the screen is drawn -		if (!drawMap) { +		if (!_drawMap) {  			Common::Point pt = events.mousePos();  			// Check for vertical map scrolling @@ -178,7 +177,7 @@ int Map::show() {  			saveTopLine();  			_savedPos.x = -1;  			updateMap(true); -		} else if (!drawMap) { +		} else if (!_drawMap) {  			if (!_placesShown) {  				showPlaces();  				_placesShown = true; @@ -192,7 +191,8 @@ int Map::show() {  				_charPoint = _point;  				walkTheStreets(); -				events.setCursor(mapCursors[1]); +				_cursorIndex = 1; +				events.setCursor((*_mapCursors)[_cursorIndex]);  			}  		} @@ -202,8 +202,8 @@ int Map::show() {  				exitFlag = true;  		} -		if (drawMap) { -			drawMap = false; +		if (_drawMap) { +			_drawMap = false;  			if (screen._fadeStyle)  				screen.randomTransition(); @@ -229,11 +229,16 @@ int Map::show() {   * Load and initialize all the sprites that are needed for the map display   */  void Map::setupSprites() { +	Events &events = *_vm->_events;  	People &people = *_vm->_people;  	Scene &scene = *_vm->_scene;  	typedef byte Sequences[16][MAX_FRAME];  	_savedPos.x = -1; +	_mapCursors = new ImageFile("omouse.vgs"); +	_cursorIndex = 0; +	events.setCursor((*_mapCursors)[_cursorIndex]); +  	_shapes = new ImageFile("mapicon.vgs");  	_iconShapes = new ImageFile("overicon.vgs"); @@ -264,6 +269,7 @@ void Map::setupSprites() {   * Free the sprites and data used by the map   */  void Map::freeSprites() { +	delete _mapCursors;  	delete _shapes;  	delete _iconShapes;  } @@ -300,7 +306,49 @@ void Map::saveTopLine() {   * Update all on-screen sprites to account for any scrolling of the map   */  void Map::updateMap(bool flushScreen) { -	// TODO +	Events &events = *_vm->_events; +	People &people = *_vm->_people; +	Screen &screen = *_vm->_screen; +	Common::Point osPos = _savedPos; +	Common::Point osSize = _savedSize; +	Common::Point hPos; + +	if (_cursorIndex >= 1) { +		if (++_cursorIndex > (1 + 8)) +			_cursorIndex = 1; + +		events.setCursor((*_mapCursors)[_cursorIndex]); +	} + +	if (!_drawMap && !flushScreen) +		restoreIcon(); +	else +		_savedPos.x = -1; + +	people[AL].adjustSprite(); + +	_lDrawnPos.x = hPos.x = people[AL]._position.x / 100 - _bigPos.x; +	_lDrawnPos.y = hPos.y = people[AL]._position.y / 100 - people[AL].frameHeight() - _bigPos.y; + +	// Draw the person icon +	saveIcon(people[AL]._imageFrame, hPos); +	if (people[AL]._sequenceNumber == MAP_DOWNLEFT || people[AL]._sequenceNumber == MAP_LEFT +			|| people[AL]._sequenceNumber == MAP_UPLEFT) +		screen._backBuffer1.transBlitFrom(people[AL]._imageFrame->_frame, hPos, true); +	else +		screen._backBuffer1.transBlitFrom(people[AL]._imageFrame->_frame, 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[AL]._imageFrame, Common::Point(people[AL]._position.x / 100 - _bigPos.x, +			people[AL]._position.y / 100 - people[AL].frameHeight() - _bigPos.y), +			&people[AL]._oldPosition.x, &people[AL]._oldPosition.y, &people[AL]._oldSize.x, &people[AL]._oldSize.y); + +		if (osPos.x != -1) +			screen.slamArea(osPos.x, osPos.y, osSize.x, osSize.y); +	}  }  /** @@ -310,4 +358,50 @@ void Map::walkTheStreets() {  	// TODO  } +/** + * Save the area under the player's icon + */ +void Map::saveIcon(ImageFrame *src, const Common::Point &pt) { +	Screen &screen = *_vm->_screen; +	Common::Point size(src->_width, src->_height); +	Common::Point pos = pt; + +	if (pos.x < 0) { +		size.x += pos.x; +		pos.x = 0; +	} +	 +	if (pos.y < 0) { +		size.y += pos.y; +		pos.y = 0; +	} + +	if ((pos.x + size.x) > SHERLOCK_SCREEN_WIDTH) +		size.x -= (pos.x + size.x) - SHERLOCK_SCREEN_WIDTH; + +	if ((pos.y + size.y) > SHERLOCK_SCREEN_HEIGHT) +		size.y -= (pos.y + size.y) - SHERLOCK_SCREEN_HEIGHT; + +	if (size.x < 1 || size.y < 1 || pos.x >= SHERLOCK_SCREEN_WIDTH || pos.y >= SHERLOCK_SCREEN_HEIGHT || _drawMap) { +		// Flag as the area not needing to be saved +		_savedPos.x = -1; +		return; +	} + +	_iconSave.create(size.x, size.y); +	_iconSave.blitFrom(screen._backBuffer1, Common::Point(0, 0), +		Common::Rect(pos.x, pos.y, pos.x + size.x, pos.y + size.y)); +} + +/** + * Restore the area under the player's icon + */ +void Map::restoreIcon() { +	Screen &screen = *_vm->_screen; + +	if (_savedPos.x >= 0 && _savedPos.y >= 0 && _savedPos.x <= SHERLOCK_SCREEN_WIDTH +			&& _savedPos.y < SHERLOCK_SCREEN_HEIGHT) +		screen._backBuffer1.blitFrom(_iconSave, _savedPos); +} +  } // End of namespace Sherlock diff --git a/engines/sherlock/map.h b/engines/sherlock/map.h index 32051d60b7..653d8c0084 100644 --- a/engines/sherlock/map.h +++ b/engines/sherlock/map.h @@ -45,6 +45,7 @@ private:  	Common::Point _savedPos;  	Common::Point _savedSize;  	Surface _topLine; +	ImageFile *_mapCursors;  	ImageFile *_shapes;  	ImageFile *_iconShapes;  	byte _sequences[3][MAX_FRAME]; @@ -54,6 +55,9 @@ private:  	int _point;  	bool _placesShown;  	int _charPoint; +	int _cursorIndex; +	bool _drawMap; +	Surface _iconSave;  private:  	void loadData(); @@ -67,6 +71,9 @@ private:  	void updateMap(bool flushScreen);  	void walkTheStreets(); + +	void saveIcon(ImageFrame *src, const Common::Point &pt); +	void restoreIcon();  public:  	Map(SherlockEngine *vm); | 
