aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h2
-rw-r--r--scumm/palette_he.cpp53
-rw-r--r--scumm/script_v90he.cpp23
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);