diff options
| -rw-r--r-- | engines/mads/assets.cpp | 4 | ||||
| -rw-r--r-- | engines/mads/assets.h | 5 | ||||
| -rw-r--r-- | engines/mads/sprites.cpp | 26 | ||||
| -rw-r--r-- | engines/mads/sprites.h | 1 | ||||
| -rw-r--r-- | engines/mads/user_interface.cpp | 2 | 
5 files changed, 29 insertions, 9 deletions
| diff --git a/engines/mads/assets.cpp b/engines/mads/assets.cpp index 0bbf6177eb..82585d574a 100644 --- a/engines/mads/assets.cpp +++ b/engines/mads/assets.cpp @@ -76,7 +76,7 @@ void SpriteAsset::load(Common::SeekableReadStream *stream, int flags) {  	spriteStream->skip(32);  	_frameCount = spriteStream->readUint16LE(); -	if ((flags & SPRITE_SET_CHAR_INFO) == 0) +	if ((flags & ASSET_CHAR_INFO) == 0)  		_charInfo = nullptr;  	else  		_charInfo = new SpriteSetCharInfo(spriteStream); @@ -98,7 +98,7 @@ void SpriteAsset::load(Common::SeekableReadStream *stream, int flags) {  	delete palStream;  	// Process the palette data -	if (flags & 9) { +	if (flags & (ASSET_TRANSLATE | ASSET_SPINNING_OBJECT)) {  		_usageIndex = 0;  		if (flags & 8) { diff --git a/engines/mads/assets.h b/engines/mads/assets.h index 9242802187..155590f9bd 100644 --- a/engines/mads/assets.h +++ b/engines/mads/assets.h @@ -29,7 +29,10 @@  namespace MADS { -#define SPRITE_SET_CHAR_INFO 4 +enum AssetFlags { +	ASSET_TRANSLATE = 1, ASSET_HEADER_ONLY = 2, ASSET_CHAR_INFO = 4, +	ASSET_SPINNING_OBJECT = 8 +};  class MADSEngine;  class MSprite; diff --git a/engines/mads/sprites.cpp b/engines/mads/sprites.cpp index 4f5d50db4f..acbb22077f 100644 --- a/engines/mads/sprites.cpp +++ b/engines/mads/sprites.cpp @@ -36,8 +36,6 @@ enum {  	kMarker = 2  }; -#define TRANSPARENT_COLOR_INDEX 0xFF -  class DepthEntry {  public:  	int depth; @@ -61,7 +59,7 @@ MSprite::MSprite()  MSprite::MSprite(Common::SeekableReadStream *source, const Common::Array<RGB6> &palette,  		const Common::Rect &bounds)  	: MSurface(bounds.width(), bounds.height()), -	  _offset(Common::Point(bounds.left, bounds.top)) { +	  _offset(Common::Point(bounds.left, bounds.top)), _transparencyIndex(0xFF) {  	// Load the sprite data  	loadSprite(source, palette);  } @@ -123,16 +121,34 @@ void MSprite::loadSprite(Common::SeekableReadStream *source,  		}  	} +	// Do a first post-sprite generation loop to find a pixel that the sprite  +	// will not use to designate as the transparency +	bool colorUsed[PALETTE_COUNT]; +	Common::fill(&colorUsed[0], &colorUsed[PALETTE_COUNT], false); +	for (outp = getData(); spriteSize > 0; --spriteSize, ++outp) { +		if (*outp != transIndex) +			colorUsed[palette[*outp]._palIndex] = true; +	} + +	_transparencyIndex = PALETTE_COUNT - 1; +	while (_transparencyIndex >= 0 && colorUsed[_transparencyIndex]) +		--_transparencyIndex; +	assert(_transparencyIndex >= 0); +  	// Do a final iteration over the sprite to convert it's pixels to  	// the final positions in the main palette +	spriteSize = this->w * this->h;  	for (outp = getData(); spriteSize > 0; --spriteSize, ++outp) { -		if (*outp != transIndex) +		if (*outp != transIndex) {  			*outp = palette[*outp]._palIndex; +		} else { +			*outp = _transparencyIndex; +		}  	}  }  byte MSprite::getTransparencyIndex() const { -	return TRANSPARENT_COLOR_INDEX; +	return _transparencyIndex;  }  /*------------------------------------------------------------------------*/ diff --git a/engines/mads/sprites.h b/engines/mads/sprites.h index 324122e348..6ea3c9e52e 100644 --- a/engines/mads/sprites.h +++ b/engines/mads/sprites.h @@ -117,6 +117,7 @@ public:  	virtual ~MSprite();  	Common::Point _offset; +	int _transparencyIndex;  	byte getTransparencyIndex() const;  }; diff --git a/engines/mads/user_interface.cpp b/engines/mads/user_interface.cpp index e410d173d7..7392d53a16 100644 --- a/engines/mads/user_interface.cpp +++ b/engines/mads/user_interface.cpp @@ -845,7 +845,7 @@ void UserInterface::loadInventoryAnim(int objectId) {  	if (_vm->_invObjectsAnimated) {  		Common::String resName = Common::String::format("*OB%.3dI", objectId); -		SpriteAsset *asset = new SpriteAsset(_vm, resName, 8); +		SpriteAsset *asset = new SpriteAsset(_vm, resName, ASSET_SPINNING_OBJECT);  		_invSpritesIndex = scene._sprites.add(asset, 1);  		if (_invSpritesIndex >= 0) {  			_invFrameNumber = 1; | 
