diff options
| -rw-r--r-- | engines/kyra/lol.cpp | 14 | ||||
| -rw-r--r-- | engines/kyra/lol.h | 2 | ||||
| -rw-r--r-- | engines/kyra/scene_lol.cpp | 70 | ||||
| -rw-r--r-- | engines/kyra/screen_lol.cpp | 33 | ||||
| -rw-r--r-- | engines/kyra/sprites_lol.cpp | 15 | 
5 files changed, 89 insertions, 45 deletions
diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 4e2cfa4bb0..70bba25764 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -1697,12 +1697,18 @@ void LoLEngine::setPaletteBrightness(const Palette &srcPal, int brightness, int  void LoLEngine::generateBrightnessPalette(const Palette &src, Palette &dst, int brightness, int modifier) {  	dst.copy(src);  	if (_flags.use16ColorMode) { -		if (!(brightness && modifier >= 0 && modifier < 8 && (_flagsTable[31] & 0x08))) +		if (!brightness) +			modifier = 0; +		else if (modifier < 0 || modifier > 7 || (_flagsTable[31] & 0x08))  			modifier = 8; +		  		modifier >>= 1;  		if (modifier)  			modifier--; -		_blockBrightness = 16 * modifier; +		if (modifier > 3) +			modifier = 3; +		_blockBrightness = modifier << 4; +		_sceneUpdateRequired = true;  	} else {  		_screen->loadSpecialColors(dst); @@ -1743,7 +1749,6 @@ void LoLEngine::createGfxTables() {  		return;  	if (_flags.use16ColorMode) { -  		_screen->loadPalette("lol.nol", _screen->getPalette(0));  	} else {  		Palette tpal(256); @@ -3902,7 +3907,8 @@ void LoLEngine::displayAutomap() {  	for (int i = 0; i < 109; i++)  		_automapShapes[i] = _screen->getPtrToShape(shp, i + 11); -	_screen->generateGrayOverlay(_screen->getPalette(3), _mapOverlay, 52, 0, 0, 0, 256, false); +	if (!_flags.use16ColorMode) +		_screen->generateGrayOverlay(_screen->getPalette(3), _mapOverlay, 52, 0, 0, 0, 256, false);  	_screen->loadFont(Screen::FID_9_FNT, "FONT9PN.FNT");  	_screen->loadFont(Screen::FID_6_FNT, "FONT6PN.FNT"); diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index f1da207e57..6ef97c5148 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -1095,7 +1095,7 @@ private:  	uint16 _specialGuiShapeY;  	uint16 _specialGuiShapeMirrorFlag; -	char _lastSuppFile[12]; +	char _lastBlockDataFile[12];  	char _lastOverridePalFile[12];  	char *_lastOverridePalFilePtr;  	int _lastSpecialColor; diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 50d00fbf2a..022caa7da7 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -348,7 +348,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	if (file) {  		_lastSpecialColor = specialColor;  		_lastSpecialColorWeight = weight; -		strcpy(_lastSuppFile, file); +		strcpy(_lastBlockDataFile, file);  		if (palFile) {  			strcpy(_lastOverridePalFile, palFile);  			_lastOverridePalFilePtr = _lastOverridePalFile; @@ -359,14 +359,11 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	if (_flags.use16ColorMode) {  		if (_lastSpecialColor == 0x66) -			//_lastSpecialColor = stricmp(file, "YVEL2") ? 0xcc : 0x44; -			_lastSpecialColor = scumm_stricmp(file, "YVEL2") ? 0xc : 0x4; +			_lastSpecialColor = stricmp(file, "YVEL2") ? 0xcc : 0x44;  		else if (_lastSpecialColor == 0x6b) -			//_lastSpecialColor = 0xcc; -			_lastSpecialColor = 0xc; +			_lastSpecialColor = 0xcc;  		else -			//_lastSpecialColor = 0x44; -			_lastSpecialColor = 0x4; +			_lastSpecialColor = 0x44;  	}  	char fname[13]; @@ -374,7 +371,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	int tlen = 0;  	if (_flags.use16ColorMode) { -		snprintf(fname, sizeof(fname), "%s.VCF", _lastSuppFile); +		snprintf(fname, sizeof(fname), "%s.VCF", _lastBlockDataFile);  		_screen->loadBitmap(fname, 3, 3, 0);  		v = _screen->getCPagePtr(2);  		tlen = READ_LE_UINT16(v) << 5; @@ -387,7 +384,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  		memcpy(_vcfBlocks, v, tlen);  	} -	snprintf(fname, sizeof(fname), "%s.VCN", _lastSuppFile); +	snprintf(fname, sizeof(fname), "%s.VCN", _lastBlockDataFile);  	_screen->loadBitmap(fname, 3, 3, 0);  	v = _screen->getCPagePtr(2);  	tlen = READ_LE_UINT16(v); @@ -401,13 +398,12 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	_vcnBlocks = new uint8[vcnLen];  	if (_flags.use16ColorMode) { -		_screen->getPalette(0).fill(0, 16, 0xff);  		_screen->loadPalette("LOL.NOL", _screen->getPalette(0));  		/*static const uint8 colTable[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };  		Palette &pl = _screen->getPalette(0);  		for (int i = 15; i >= 0; i--)			 -			pl.copy(pl, i, 1, colTable[i]);*/ +			pl.copy(pl, i, 1, i);*/  	} else {  		if (_vcnShift) @@ -444,7 +440,7 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  	memcpy(_vcnBlocks, v, vcnLen);  	v += vcnLen; -	snprintf(fname, sizeof(fname), "%s.VMP", _lastSuppFile); +	snprintf(fname, sizeof(fname), "%s.VMP", _lastBlockDataFile);  	_screen->loadBitmap(fname, 3, 3, 0);  	v = _screen->getCPagePtr(2); @@ -464,12 +460,13 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  		weight = (weight > 0) ? (weight * 255) / 100 : 0;  		_screen->generateLevelOverlay(_screen->getPalette(0), _screen->getLevelOverlay(i), _lastSpecialColor, weight); -		for (int ii = 0; ii < 128; ii++) { +		int l = _flags.use16ColorMode ? 256 : 128; +		for (int ii = 0; ii < l; ii++) {  			if (_screen->getLevelOverlay(i)[ii] == 255)  				_screen->getLevelOverlay(i)[ii] = 0;  		} -		for (int ii = 128; ii < 256; ii++) +		for (int ii = l; ii < 256; ii++)  			_screen->getLevelOverlay(i)[ii] = ii & 0xff;  	} @@ -477,22 +474,21 @@ void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight  		_screen->getLevelOverlay(7)[i] = i & 0xff;  	if (_flags.use16ColorMode) { -		//_screen->getLevelOverlay(6)[0xee] = 0xee; -		//if (_lastSpecialColor == 0x44)			 -		//	_screen->getLevelOverlay(5)[0xee] = 0xee; -		_screen->getLevelOverlay(6)[0xe] = 0xe; -		if (_lastSpecialColor == 0x4)			 -			_screen->getLevelOverlay(5)[0xe] = 0xe; +		_screen->getLevelOverlay(6)[0xee] = 0xee; +		if (_lastSpecialColor == 0x44)			 +			_screen->getLevelOverlay(5)[0xee] = 0xee;  		for (int i = 0; i < 7; i++)  			memcpy(_screen->getLevelOverlay(i), _screen->getLevelOverlay(i + 1), 256); +		_screen->loadPalette("LOL.NOL", _screen->getPalette(0)); +  		static const uint8 colTable[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };  		for (int i = 0; i < 8; i++) {  			uint8 *pl = _screen->getLevelOverlay(7 - i); -			for (int ii = 15; ii >= 0; ii--) -				_vcnExpTable[((7 - i) << 4) + ii] = pl[colTable[ii]]; +			for (int ii = 0; ii < 16; ii++) +				_vcnExpTable[(i << 4) + ii] = pl[colTable[ii]];  		}  	} @@ -1496,9 +1492,13 @@ void LoLEngine::prepareSpecialScene(int fieldType, int hasDialogue, int suspendG  		gui_disableControls(controlMode);  		if (fadeFlag) { -			_screen->getPalette(3).copy(_screen->getPalette(0), 128); -			_screen->loadSpecialColors(_screen->getPalette(3)); -			_screen->fadePalette(_screen->getPalette(3), 10); +			if (_flags.use16ColorMode) { +				setPaletteBrightness(_screen->getPalette(0), _brightness, _lampEffect); +			} else { +				_screen->getPalette(3).copy(_screen->getPalette(0), 128); +				_screen->loadSpecialColors(_screen->getPalette(3)); +				_screen->fadePalette(_screen->getPalette(3), 10); +			}  			_screen->_fadeFlag = 0;  		} @@ -2086,10 +2086,26 @@ void LoLEngine::drawDecorations(int index) {  				xOffs = _levelShapeProperties[l].shapeX[shpIx];  				yOffs = _levelShapeProperties[l].shapeY[shpIx];  				shpIx = _dscOvlMap[shpIx]; -				ovl = _screen->getLevelOverlay(ovlIndex); +				int ov = ovlIndex; +				if (_flags.use16ColorMode) { +					uint8 bb = _blockBrightness >> 4; +					if (ov > bb) +						ov -= bb; +						else +						ov = 0; +				} +				ovl = _screen->getLevelOverlay(ov);  			} else if (_levelShapeProperties[l].shapeIndex[shpIx] != 0xffff) {  				scaleW = scaleH = 0x100; -				ovl = _screen->getLevelOverlay(7); +				int ov = 7; +				if (_flags.use16ColorMode) { +					uint8 bb = _blockBrightness >> 4; +					if (ov > bb) +						ov -= bb; +						else +						ov = 0; +				} +				ovl = _screen->getLevelOverlay(ov);  			}  			if (_levelShapeProperties[l].shapeIndex[shpIx] != 0xffff) { diff --git a/engines/kyra/screen_lol.cpp b/engines/kyra/screen_lol.cpp index bd37945fae..7b752a7b14 100644 --- a/engines/kyra/screen_lol.cpp +++ b/engines/kyra/screen_lol.cpp @@ -165,29 +165,33 @@ uint8 *Screen_LoL::generateLevelOverlay(const Palette &srcPal, uint8 *ovl, int o  	if (weight > 255)  		weight = 255; -	uint16 r = srcPal[opColor * 3]; -	uint16 g = srcPal[opColor * 3 + 1]; -	uint16 b = srcPal[opColor * 3 + 2]; +	uint8 *srt = new uint8[768]; +	memset(srt, 0x3f, 768); +	memcpy(srt, srcPal.getData(), srcPal.getNumColors() * 3); +	 +	uint16 r = srt[opColor * 3]; +	uint16 g = srt[opColor * 3 + 1]; +	uint16 b = srt[opColor * 3 + 2];  	uint8 *d = ovl;  	*d++ = 0; -	for (int i = 1; i != srcPal.getNumColors() - 1; i++) { -		uint16 a = srcPal[i * 3]; +	for (int i = 1; i != 255; i++) { +		uint16 a = srt[i * 3];  		uint8 dr = a - ((((a - r) * (weight >> 1)) << 1) >> 8); -		a = srcPal[i * 3 + 1]; +		a = srt[i * 3 + 1];  		uint8 dg = a - ((((a - g) * (weight >> 1)) << 1) >> 8); -		a = srcPal[i * 3 + 2]; +		a = srt[i * 3 + 2];  		uint8 db = a - ((((a - b) * (weight >> 1)) << 1) >> 8);  		int l = opColor; -		int m = 0x7fff; -		int ii = 127; +		int m = _use16ColorMode ? 0xffff : 0x7fff; +		int ii = _use16ColorMode ? 255 : 127;  		int x = 1; -		const uint8 *s = srcPal.getData() + 3; +		const uint8 *s = srt + 3;  		do { -			if (i == x) { +			if (!_use16ColorMode && i == x) {  				s += 3;  			} else {  				int t = *s++ - dr; @@ -203,8 +207,10 @@ uint8 *Screen_LoL::generateLevelOverlay(const Palette &srcPal, uint8 *ovl, int o  				}  				if (c <= m) { -					m = c; -					l = x; +					if (!_use16ColorMode || x != opColor && i != x) { +						m = c; +						l = x; +					}  				}  			}  			x++; @@ -213,6 +219,7 @@ uint8 *Screen_LoL::generateLevelOverlay(const Palette &srcPal, uint8 *ovl, int o  		*d++ = l & 0xff;  	} +	delete []srt;  	return ovl;  } diff --git a/engines/kyra/sprites_lol.cpp b/engines/kyra/sprites_lol.cpp index 23652a766d..e8d8b18ab2 100644 --- a/engines/kyra/sprites_lol.cpp +++ b/engines/kyra/sprites_lol.cpp @@ -940,6 +940,14 @@ void LoLEngine::drawDoor(uint8 *shape, uint8 *table, int index, int unk2, int w,  	if (d > 7)  		d = 7; +	if (_flags.use16ColorMode) { +		uint8 bb = _blockBrightness >> 4; +		if (d > bb) +			d -= bb; +		else +			d = 0; +	} +  	uint8 *ovl = _screen->getLevelOverlay(d);  	int doorScaledWitdh = _screen->getShapeScaledWidth(shape, _dmScaleW); @@ -992,6 +1000,13 @@ uint8 *LoLEngine::drawItemOrMonster(uint8 *shape, uint8 *table, int x, int y, in  	if (tblValue == -1) {  		r = 7 - ((r / 3) - 1);  		r = CLIP(r, 0, 7); +		if (_flags.use16ColorMode) { +			uint8 bb = _blockBrightness >> 4; +			if (r > bb) +				r -= bb; +			else +				r = 0; +		}  		ovl = _screen->getLevelOverlay(r);  	} else {  		memset(tmpOvl + 1, tblValue, 15);  | 
