diff options
| -rw-r--r-- | engines/sherlock/scalpel/tsage/logo.cpp | 222 | ||||
| -rw-r--r-- | engines/sherlock/scalpel/tsage/logo.h | 36 | 
2 files changed, 230 insertions, 28 deletions
| diff --git a/engines/sherlock/scalpel/tsage/logo.cpp b/engines/sherlock/scalpel/tsage/logo.cpp index bf1c0f522a..0fa8bf808a 100644 --- a/engines/sherlock/scalpel/tsage/logo.cpp +++ b/engines/sherlock/scalpel/tsage/logo.cpp @@ -67,6 +67,11 @@ void Visage::setVisage(int resNum, int rlbNum) {  	}  } +void Visage::clear() { +	delete _stream; +	_stream = nullptr; +} +  Visage::~Visage() {  	delete _stream;  } @@ -151,7 +156,7 @@ ScalpelEngine *Object::_vm;  Object::Object() {  	_vm = nullptr; -	_animMode = ANIM_MODE_NONE; +	_isAnimating = false;  	_frame = 0;  	_numFrames = 0;  	_frameChange = 0; @@ -161,8 +166,8 @@ void Object::setVisage(int visage, int strip) {  	_visage.setVisage(visage, strip);  } -void Object::setAnimMode(AnimationMode mode) { -	_animMode = mode; +void Object::setAnimMode(bool isAnimating) { +	_isAnimating = isAnimating;  	_finished = false;  	_updateStartFrame = _vm->_events->getFrameCounter(); @@ -171,26 +176,24 @@ void Object::setAnimMode(AnimationMode mode) {  	_frameChange = 1;  } +void Object::erase() { +	Screen &screen = *_vm->_screen; +	 +	if (_visage.isLoaded() && !_oldBounds.isEmpty()) +		screen.blitFrom(screen._backBuffer1, Common::Point(_oldBounds.left, _oldBounds.top), _oldBounds); +} +  void Object::update() {  	Screen &screen = *_vm->_screen;  	if (_visage.isLoaded()) { -		switch (_animMode) { -		case ANIM_MODE_5: +		if (_isAnimating) {  			if (_frame < _visage.getFrameCount())  				_frame = changeFrame();  			else  				_finished = true; -			break; - -		default: -			break;  		} -		// Erase previous frame, if any -		if (!_oldBounds.isEmpty()) -			screen.blitFrom(screen._backBuffer1, Common::Point(_oldBounds.left, _oldBounds.top), _oldBounds); -  		// Get the new frame  		ObjectSurface s;  		_visage.getFrame(s, _frame); @@ -236,6 +239,10 @@ bool Object::isAnimEnded() const {  	return _finished;  } +bool Object::isMoving() const { +	return (_destination.x != 0) && (_destination != _position); +} +  /*----------------------------------------------------------------*/  bool Logo::show(ScalpelEngine *vm) { @@ -249,11 +256,15 @@ bool Logo::show(ScalpelEngine *vm) {  		events.wait(2);  		events.setButtonState(); +		// Erase areas from previous frame, and update and re-draw objects +		for (int idx = 0; idx < 4; ++idx) +			logo->_objects[idx].erase();  		for (int idx = 0; idx < 4; ++idx)  			logo->_objects[idx].update();  		interrupted = vm->shouldQuit() || events.kbHit() || events._pressed;  		if (interrupted) { +			// Keyboard or mouse button pressed, so break out of logo display  			events.clearEvents();  			break;  		} @@ -292,10 +303,12 @@ Logo::~Logo() {  }  bool Logo::finished() const { -	return _counter >= 4; +	return _counter >= 442;  }  void Logo::nextFrame() { +	Screen &screen = *_vm->_screen; +  	switch (_counter++) {  	case 0:  		// Load the background and fade it in @@ -309,18 +322,179 @@ void Logo::nextFrame() {  		_objects[0]._frame = 1;  		_objects[0]._position = Common::Point(169, 107);  		_objects[0]._numFrames = 7; -		_objects[0].setAnimMode(ANIM_MODE_5); +		_objects[0].setAnimMode(true);  		break;  	case 2:  		// Keep waiting until first animation ends -		if (!_objects[0].isAnimEnded()) +		if (!_objects[0].isAnimEnded()) {  			--_counter; +		} else { +			// Start second half of the shapes animation +			_objects[0].setVisage(16, 2); +			_objects[0]._frame = 1; +			_objects[0]._numFrames = 11; +			_objects[0].setAnimMode(true); +		}  		break;  	case 3:  		// Keep waiting until second animation of shapes ordering themselves ends -		return; +		if (!_objects[0].isAnimEnded()) { +			--_counter; +		} else { +			// Fade out the background but keep the shapes visible +			fade(_palette2); +			screen._backBuffer1.clear(); +			screen.clear(); +		} +		break; + +	case 13: { +		// Load the new palette +		byte palette[PALETTE_SIZE]; +		_lib.getPalette(palette, 12); +		screen.setPalette(palette); +		break; +	} + +	case 14: +		_objects[0].setVisage(12, 1); +		_objects[0]._frame = 1; +		_objects[0]._numFrames = 7; +		_objects[0]._position = Common::Point(170, 142); +		_objects[0].setDestination(Common::Point(158, 71)); +		break; + +	case 15: +		// Wait until the logo has expanded upwards to form EA logo +		if (_objects[0].isMoving()) +			--_counter; +		break; + +	case 16: +		fade(_palette3, 40); +		break; + +	case 20: +		// Show the 'Electronic Arts' company name +		_objects[1].setVisage(14, 1); +		_objects[1]._frame = 1; +		_objects[1]._position = Common::Point(152, 98); +		break; + +	case 140: +		// Start sequence of positioning and size hand cursor in an arc +		_objects[2].setVisage(18, 1); +		_objects[2]._frame = 1; +		_objects[2]._position = Common::Point(33, 91); +		break; + +	case 145: +		_objects[2]._frame = 2; +		_objects[2]._position = Common::Point(44, 124); +		break; + +	case 150: +		_objects[2]._frame = 3; +		_objects[2]._position = Common::Point(64, 153); +		break; + +	case 155: +		_objects[2]._frame = 4; +		_objects[2]._position = Common::Point(87, 174); +		break; + +	case 160: +		_objects[2]._frame = 5; +		_objects[2]._position = Common::Point(114, 191); +		break; + +	case 165: +		_objects[2]._frame = 6; +		_objects[2]._position = Common::Point(125, 184); +		break; + +	case 170: +		_objects[2]._frame = 7; +		_objects[2]._position = Common::Point(154, 187); +		break; + +	case 175: +		_objects[2]._frame = 8; +		_objects[2]._position = Common::Point(181, 182); +		break; + +	case 180: +		_objects[2]._frame = 9; +		_objects[2]._position = Common::Point(191, 167); +		break; + +	case 185: +		_objects[2]._frame = 10; +		_objects[2]._position = Common::Point(190, 150); +		break; + +	case 190: +		_objects[2]._frame = 11; +		_objects[2]._position = Common::Point(182, 139); +		break; + +	case 195: +		_objects[2]._frame = 11; +		_objects[2]._position = Common::Point(170, 130); +		break; + +	case 200: +		_objects[2]._frame = 11; +		_objects[2]._position = Common::Point(158, 121); +		break; + +	case 205: +		// Show a highlighting of the company name +		_objects[2].remove(); +		_objects[3].setVisage(19, 1); +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 213: +		_objects[3]._frame = 2; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 221: +		_objects[1].remove(); +		break; + +	case 222: +		_objects[3]._frame = 3; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 230: +		_objects[3]._frame = 4; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 238: +		_objects[3]._frame = 5; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 246: +		_objects[3]._frame = 6; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 254: +		_objects[3]._frame = 7; +		_objects[3]._position = Common::Point(155, 94); +		break; + +	case 262: +		_objects[3]._frame = 8; +		_objects[3]._position = Common::Point(155, 94); +		break;  	default:  		break; @@ -354,18 +528,22 @@ void Logo::loadBackground() {  	screen.blitFrom(screen._backBuffer1);  } -void Logo::fade(const byte palette[PALETTE_SIZE]) { +void Logo::fade(const byte palette[PALETTE_SIZE], int step) {  	Events &events = *_vm->_events;  	Screen &screen = *_vm->_screen; +	byte startPalette[PALETTE_SIZE];  	byte tempPalette[PALETTE_SIZE]; -	for (int percent = 0; percent < 100; percent += 6) { +	screen.getPalette(startPalette); + +	for (int percent = 0; percent < 100; percent += step) {  		for (int palIndex = 0; palIndex < 256; ++palIndex) { -			const byte *palP = (const byte *)&palette[palIndex * 3]; +			const byte *pal1P = (const byte *)&startPalette[palIndex * 3]; +			const byte *pal2P = (const byte *)&palette[palIndex * 3];  			byte *destP = &tempPalette[palIndex * 3]; -			for (int rgbIndex = 0; rgbIndex < 3; ++rgbIndex, ++palP, ++destP) { -				*destP = (int)*palP * percent / 100; +			for (int rgbIndex = 0; rgbIndex < 3; ++rgbIndex, ++pal1P, ++pal2P, ++destP) { +				*destP = (int)*pal1P + ((int)*pal2P - (int)*pal1P) * percent / 100;  			}  		} diff --git a/engines/sherlock/scalpel/tsage/logo.h b/engines/sherlock/scalpel/tsage/logo.h index 0b1f0a0500..0dcd35e281 100644 --- a/engines/sherlock/scalpel/tsage/logo.h +++ b/engines/sherlock/scalpel/tsage/logo.h @@ -41,8 +41,6 @@ class ScalpelEngine;  namespace TsAGE { -enum AnimationMode { ANIM_MODE_NONE = 0, ANIM_MODE_4 = 4, ANIM_MODE_5 = 5 }; -  class ObjectSurface : public Surface {  public:  	Common::Point _centroid; @@ -73,6 +71,11 @@ public:  	void setVisage(int resNum, int rlbNum = 9999);  	/** +	 * Clear the visage +	 */ +	void clear(); + +	/**  	 * Get a frame from the visage  	 */  	void getFrame(ObjectSurface &s, int frameNum); @@ -92,7 +95,7 @@ class Object {  private:  	Visage _visage;  	uint32 _updateStartFrame; -	int _animMode; +	bool _isAnimating;  	bool _finished;  	/** @@ -107,6 +110,7 @@ private:  public:  	static ScalpelEngine *_vm;  	Common::Point _position; +	Common::Point _destination;  	Common::Rect _oldBounds;  	int _frame;  	int _numFrames; @@ -120,9 +124,14 @@ public:  	void setVisage(int visage, int strip);  	/** -	 * Sets the animation mode +	 * Sets whether the object is animating  	 */ -	void setAnimMode(AnimationMode mode); +	void setAnimMode(bool isAnimating); + +	/** +	 * Starts an object moving to a given destination +	 */ +	void setDestination(const Common::Point &pt) { _destination = pt; }  	/**  	 * Returns true if an animation is ended @@ -130,9 +139,24 @@ public:  	bool isAnimEnded() const;  	/** +	 * Return true if object is moving +	 */ +	bool isMoving() const; + +	/** +	 * Erase the area the object was previously drawn at, by restoring the background +	 */ +	void erase(); + +	/**  	 * Update the frame  	 */  	void update(); + +	/** +	 * Remove an object from being displayed +	 */ +	void remove() { _visage.clear(); }  };  class Logo { @@ -161,7 +185,7 @@ private:  	/**  	 * Fade from the current palette to a new one  	 */ -	void fade(const byte palette[PALETTE_SIZE]); +	void fade(const byte palette[PALETTE_SIZE], int step = 6);  public:  	static bool show(ScalpelEngine *vm);  }; | 
