diff options
| author | Paul Gilbert | 2014-06-04 09:30:10 -0400 | 
|---|---|---|
| committer | Paul Gilbert | 2014-06-04 09:30:10 -0400 | 
| commit | c551115b4b31e653cc046b6ea91fd306e6b8dc5e (patch) | |
| tree | 26fc79c7ad84e448eb1d91531fd5a267db744c49 | |
| parent | 38b705a238e104a755ed0f48aa2b40a0214eba83 (diff) | |
| download | scummvm-rg350-c551115b4b31e653cc046b6ea91fd306e6b8dc5e.tar.gz scummvm-rg350-c551115b4b31e653cc046b6ea91fd306e6b8dc5e.tar.bz2 scummvm-rg350-c551115b4b31e653cc046b6ea91fd306e6b8dc5e.zip  | |
MADS: Fix memory corruption when dealing with monster in scene 703
| -rw-r--r-- | engines/mads/animation.cpp | 6 | ||||
| -rw-r--r-- | engines/mads/palette.cpp | 19 | 
2 files changed, 14 insertions, 11 deletions
diff --git a/engines/mads/animation.cpp b/engines/mads/animation.cpp index 6af8a9ae5f..512a3979f9 100644 --- a/engines/mads/animation.cpp +++ b/engines/mads/animation.cpp @@ -310,8 +310,10 @@ void Animation::load(UserInterface &interfaceSurface, DepthSurface &depthSurface  	for (int idx = 0; idx < _header._spriteSetsCount; ++idx)  		usageList.push_back(_spriteSets[idx]->_usageIndex); -	if (usageList.size() > 0) -		_vm->_palette->_paletteUsage.updateUsage(usageList, _header._messagesCount); +	if (usageList.size() > 0) { +		int spritesUsageIndex = _spriteSets[0]->_usageIndex; +		_vm->_palette->_paletteUsage.updateUsage(usageList, spritesUsageIndex); +	}  	// Remaps the sprite list indexes for frames to the loaded sprite list indexes  	for (uint i = 0; i < _frameEntries.size(); ++i) { diff --git a/engines/mads/palette.cpp b/engines/mads/palette.cpp index f8670c71dc..eedbf36ddd 100644 --- a/engines/mads/palette.cpp +++ b/engines/mads/palette.cpp @@ -143,12 +143,12 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  	for (uint palIndex = 0; palIndex < palette.size(); ++palIndex) {  		bool changed = false; -		int var4 = 0xffff; +		int newPalIndex = -1;  		int v1 = palRange[palIndex]._v2;  		if (palette[v1]._flags & 8) {  			changed = true; -			var4 = 0xFD; +			newPalIndex = 0xFD;  		}  		if (hasUsage && palette[v1]._flags & 0x10) { @@ -156,7 +156,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  				if ((*tempUsage._data)[usageIndex]._palIndex == palIndex) {  					changed = true;  					int dataIndex = MIN(usageIndex, _data->size() - 1); -					var4 = (*_data)[dataIndex]._palIndex; +					newPalIndex = (*_data)[dataIndex]._palIndex;  				}  			}  		} @@ -165,11 +165,11 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  			for (uint usageIndex = 0; usageIndex < _data->size() && !changed; ++usageIndex) {  				if ((*_data)[usageIndex]._palIndex == palIndex) {  					changed = true; -					var4 = 0xF0 + usageIndex; +					newPalIndex = 0xF0 + usageIndex;  					// Copy data into the high end of the main palette  					RGB6 &pSrc = palette[palIndex]; -					byte *pDest = &_vm->_palette->_mainPalette[var4 * 3]; +					byte *pDest = &_vm->_palette->_mainPalette[newPalIndex * 3];  					pDest[0] = pSrc.r;  					pDest[1] = pSrc.g;  					pDest[2] = pSrc.b; @@ -201,7 +201,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  					if (var2 > var10) {  						changed = true; -						var4 = idx; +						newPalIndex = idx;  						var2 = var10;  					}  				} @@ -214,7 +214,7 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  					--palCount;  					++freeIndex;  					changed = true; -					var4 = idx; +					newPalIndex = idx;  					RGB6 &pSrc = palette[palIndex];  					byte *pDest = &_vm->_palette->_mainPalette[idx * 3]; @@ -229,11 +229,12 @@ int PaletteUsage::process(Common::Array<RGB6> &palette, uint flags) {  		// In at least scene 318, when the doctor knocks you with the blackjack,  		// the changed flag can be false  		//assert(changed); +		assert(newPalIndex != -1);  		int var52 = (noUsageFlag && palette[palIndex]._u2) ? 2 : 0; -		_vm->_palette->_palFlags[var4] |= var52 | rgbMask; -		palette[palIndex]._palIndex = var4; +		_vm->_palette->_palFlags[newPalIndex] |= var52 | rgbMask; +		palette[palIndex]._palIndex = newPalIndex;  	}  	_vm->_palette->_rgbList[rgbIndex] = true;  | 
