diff options
| -rw-r--r-- | scumm/intern.h | 2 | ||||
| -rw-r--r-- | scumm/palette_he.cpp | 53 | ||||
| -rw-r--r-- | scumm/script_v90he.cpp | 23 | 
3 files changed, 69 insertions, 9 deletions
| diff --git a/scumm/intern.h b/scumm/intern.h index 7abd6812f6..06e1ab6962 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -1002,6 +1002,8 @@ protected:  	uint8 *getHEPaletteIndex(int palSlot);  	int getHEPaletteColor(int palSlot, int color); +	int getPaletteUnk1(int palSlot, int arg_4, int arg_8, int start, int end); +  	void setHEPaletteColor(int palSlot, uint8 color, uint8 r, uint8 g, uint8 b);  	void setHEPaletteFromPtr(int palSlot, const uint8 *palData);  	void setHEPaletteFromCostume(int palSlot, int resId); diff --git a/scumm/palette_he.cpp b/scumm/palette_he.cpp index 4a8199a335..ed2c27ab26 100644 --- a/scumm/palette_he.cpp +++ b/scumm/palette_he.cpp @@ -78,6 +78,59 @@ uint8 *ScummEngine_v90he::getHEPaletteIndex(int palSlot) {  	}  } +int ScummEngine_v90he::getPaletteUnk1(int palSlot, int arg_4, int arg_8, int start, int end) { +	assert(palSlot >= 1 && palSlot <= _numPalettes); +	assert(start >= 1 && start <= 255); +	assert(end >= 1 && end <= 255); + +	int eax, edi, edp, edx, esi; +	int sum, bestitem, bestsum; +	uint8 *palPtr; + +	palPtr = _hePalettes + palSlot * 1024 + start * 3; + +	bestsum = 0xFFFFFFFF; +	bestitem = start; +	edp = arg_8; + +	for (int i = start; i <= end; i++) { +		esi = arg_4; + +		edi = *palPtr++; +		edx = *palPtr; +		esi -= edi; +		eax = edx; + +		edi = edp; +		eax = -eax; +		eax <<= 31; +		eax -= edx;		 +		edi -= edx; + +		eax += edp; + +		edx = esi; + +		eax *= edi; +		edx *= esi; + +		sum = edx + eax * 2; + +		palPtr += 2; + +		if (sum < bestsum) { +			if (sum == 0) { +				return i; +			} + +			bestsum = sum; +			bestitem = i; +		} +	} + +	return bestitem; +} +  int ScummEngine_v90he::getHEPaletteColor(int palSlot, int color) {  	assert(palSlot >= 1 && palSlot <= _numPalettes);  	assert(color >= 1 && color <= 255); diff --git a/scumm/script_v90he.cpp b/scumm/script_v90he.cpp index d2567d7bb0..28bfc3175f 100644 --- a/scumm/script_v90he.cpp +++ b/scumm/script_v90he.cpp @@ -2256,6 +2256,7 @@ void ScummEngine_v90he::o90_getObjectData() {  }  void ScummEngine_v90he::o90_getPaletteData() { +	int b, c, d, e;  	int palSlot, color;  	byte subOp = fetchScriptByte(); @@ -2263,13 +2264,13 @@ void ScummEngine_v90he::o90_getPaletteData() {  	switch (subOp) {  	case 0: +		e = pop(); +		d = pop(); +		palSlot = pop();  		pop(); -		pop(); -		pop(); -		pop(); -		pop(); -		pop(); -		push(0); +		c = pop(); +		b = pop(); +		push(getPaletteUnk1(palSlot, b, c, d, e));  		break;  	case 7:  		pop(); @@ -2289,9 +2290,13 @@ void ScummEngine_v90he::o90_getPaletteData() {  		break;  	case 172:  		pop(); -		pop(); -		pop(); -		push(0); +		c = pop(); +		c = MAX(0, c); +		c = MIN(c, 255); +		b = pop(); +		b = MAX(0, b); +		b = MIN(b, 255); +		push(getPaletteUnk1(1, b, c, 10, 245));  		break;  	default:  		error("o90_getPaletteData: Unknown case %d", subOp); | 
