aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorFlorian Kagerer2009-09-20 23:25:39 +0000
committerFlorian Kagerer2009-09-20 23:25:39 +0000
commit4d9258d3e56f45c87a279313098d3606c5e6d46e (patch)
tree6497a903534aae0b54dc4cde0808564ceff12f3b /engines/kyra
parente062a56c315d2a93a7496676741c767fd99b5e69 (diff)
downloadscummvm-rg350-4d9258d3e56f45c87a279313098d3606c5e6d46e.tar.gz
scummvm-rg350-4d9258d3e56f45c87a279313098d3606c5e6d46e.tar.bz2
scummvm-rg350-4d9258d3e56f45c87a279313098d3606c5e6d46e.zip
LOL/PC-98: start fixing color issues (still not working correctly though)
svn-id: r44223
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/lol.cpp14
-rw-r--r--engines/kyra/lol.h2
-rw-r--r--engines/kyra/scene_lol.cpp70
-rw-r--r--engines/kyra/screen_lol.cpp33
-rw-r--r--engines/kyra/sprites_lol.cpp15
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);