aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/scene_rpg.cpp
diff options
context:
space:
mode:
authorathrxx2016-01-09 22:00:51 +0100
committerathrxx2018-11-14 17:22:22 +0100
commitf49eaa5654b2ee2e41b1794a4576d24967e2f7d7 (patch)
tree9366d630ba3fc4d5f7579bc2602075e6dfe35c6b /engines/kyra/scene_rpg.cpp
parent61bd730bcf4ee311e79ab2fc49e3eca21018cdfe (diff)
downloadscummvm-rg350-f49eaa5654b2ee2e41b1794a4576d24967e2f7d7.tar.gz
scummvm-rg350-f49eaa5654b2ee2e41b1794a4576d24967e2f7d7.tar.bz2
scummvm-rg350-f49eaa5654b2ee2e41b1794a4576d24967e2f7d7.zip
KYRA: (EOB) - add support for FM-Towns version of EOB II
Diffstat (limited to 'engines/kyra/scene_rpg.cpp')
-rw-r--r--engines/kyra/scene_rpg.cpp141
1 files changed, 83 insertions, 58 deletions
diff --git a/engines/kyra/scene_rpg.cpp b/engines/kyra/scene_rpg.cpp
index dabc368a27..756f694a36 100644
--- a/engines/kyra/scene_rpg.cpp
+++ b/engines/kyra/scene_rpg.cpp
@@ -348,6 +348,7 @@ bool KyraRpgEngine::checkSceneUpdateNeed(int block) {
void KyraRpgEngine::drawVcnBlocks() {
uint8 *d = _sceneWindowBuffer;
uint16 *bdb = _blockDrawingBuffer;
+ uint16 *hiColorPal = screen()->get16bitPalette();
for (int y = 0; y < 15; y++) {
for (int x = 0; x < 22; x++) {
@@ -369,9 +370,9 @@ void KyraRpgEngine::drawVcnBlocks() {
vcnOffset &= 0x3FFF;
}
- uint8 *src = 0;
+ const uint8 *src = 0;
if (vcnOffset) {
- src = &_vcnBlocks[vcnOffset << 5];
+ src = &_vcnBlocks[vcnOffset << (4 + _vcnBpp)];
wllVcnOffset = _wllVcnOffset;
} else {
// floor/ceiling blocks
@@ -381,36 +382,46 @@ void KyraRpgEngine::drawVcnBlocks() {
vcnOffset &= 0x3FFF;
}
- src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset << 5);
+ src = (_vcfBlocks ? _vcfBlocks : _vcnBlocks) + (vcnOffset << (4 + _vcnBpp));
}
uint8 shift = _vcnShift ? _vcnShift[vcnOffset] : _blockBrightness;
if (horizontalFlip) {
for (int blockY = 0; blockY < 8; blockY++) {
- src += 3;
- for (int blockX = 0; blockX < 4; blockX++) {
- uint8 bl = *src--;
- *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
- *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
+ src += ((_vcnBpp << 2) - 1);
+ for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
+ if (_vcnBpp == 2) {
+ *(uint16*)d = hiColorPal[*src--];
+ d += 2;
+ } else {
+ uint8 bl = *src--;
+ *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
+ *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
+ }
}
- src += 5;
- d += 168;
+ src += ((_vcnBpp << 2) + 1);
+ d += 168 * _vcnBpp;
}
} else {
for (int blockY = 0; blockY < 8; blockY++) {
- for (int blockX = 0; blockX < 4; blockX++) {
- uint8 bl = *src++;
- *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
- *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
+ for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
+ if (_vcnBpp == 2) {
+ *(uint16*)d = hiColorPal[*src++];
+ d += 2;
+ } else {
+ uint8 bl = *src++;
+ *d++ = _vcnColTable[((bl >> 4) + wllVcnOffset) | shift];
+ *d++ = _vcnColTable[((bl & 0x0F) + wllVcnOffset) | shift];
+ }
}
- d += 168;
+ d += 168 * _vcnBpp;
}
}
- d -= 1400;
+ d -= 1400 * _vcnBpp;
if (vcnExtraOffsetWll) {
- d -= 8;
+ d -= 8 * _vcnBpp;
horizontalFlip = false;
if (vcnExtraOffsetWll & 0x4000) {
@@ -419,62 +430,76 @@ void KyraRpgEngine::drawVcnBlocks() {
}
shift = _vcnShift ? _vcnShift[vcnExtraOffsetWll] : _blockBrightness;
- src = &_vcnBlocks[vcnExtraOffsetWll << 5];
+ src = &_vcnBlocks[vcnExtraOffsetWll << (4 + _vcnBpp)];
uint8 *maskTable = _vcnTransitionMask ? &_vcnTransitionMask[vcnExtraOffsetWll << 5] : 0;
if (horizontalFlip) {
for (int blockY = 0; blockY < 8; blockY++) {
- src += 3;
+ src += ((_vcnBpp << 2) - 1);
maskTable += 3;
- for (int blockX = 0; blockX < 4; blockX++) {
- uint8 bl = *src--;
- uint8 mask = _vcnTransitionMask ? *maskTable-- : 0;
- uint8 h = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift];
- uint8 l = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift];
-
- if (_vcnTransitionMask)
- *d = (*d & (mask & 0x0F)) | h;
- else if (h)
- *d = h;
- d++;
-
- if (_vcnTransitionMask)
- *d = (*d & (mask >> 4)) | l;
- else if (l)
- *d = l;
- d++;
+ for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
+ if (_vcnBpp == 2) {
+ uint8 bl = *src--;
+ if (bl)
+ *(uint16*)d = hiColorPal[bl];
+ d += 2;
+ } else {
+ uint8 bl = *src--;
+ uint8 mask = _vcnTransitionMask ? *maskTable-- : 0;
+ uint8 h = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift];
+ uint8 l = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift];
+
+ if (_vcnTransitionMask)
+ *d = (*d & (mask & 0x0F)) | h;
+ else if (h)
+ *d = h;
+ d++;
+
+ if (_vcnTransitionMask)
+ *d = (*d & (mask >> 4)) | l;
+ else if (l)
+ *d = l;
+ d++;
+ }
}
- src += 5;
+ src += ((_vcnBpp << 2) + 1);
maskTable += 5;
- d += 168;
+ d += 168 * _vcnBpp;
}
} else {
for (int blockY = 0; blockY < 8; blockY++) {
- for (int blockX = 0; blockX < 4; blockX++) {
- uint8 bl = *src++;
- uint8 mask = _vcnTransitionMask ? *maskTable++ : 0;
- uint8 h = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift];
- uint8 l = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift];
-
- if (_vcnTransitionMask)
- *d = (*d & (mask >> 4)) | h;
- else if (h)
- *d = h;
- d++;
-
- if (_vcnTransitionMask)
- *d = (*d & (mask & 0x0F)) | l;
- else if (l)
- *d = l;
- d++;
+ for (int blockX = 0; blockX < 4 * _vcnBpp; blockX++) {
+ if (_vcnBpp == 2) {
+ uint8 bl = *src++;
+ if (bl)
+ *(uint16*)d = hiColorPal[bl];
+ d += 2;
+ } else {
+ uint8 bl = *src++;
+ uint8 mask = _vcnTransitionMask ? *maskTable++ : 0;
+ uint8 h = _vcnColTable[((bl >> 4) + wllVcnRmdOffset) | shift];
+ uint8 l = _vcnColTable[((bl & 0x0F) + wllVcnRmdOffset) | shift];
+
+ if (_vcnTransitionMask)
+ *d = (*d & (mask >> 4)) | h;
+ else if (h)
+ *d = h;
+ d++;
+
+ if (_vcnTransitionMask)
+ *d = (*d & (mask & 0x0F)) | l;
+ else if (l)
+ *d = l;
+ d++;
+ }
}
- d += 168;
+ d += 168 * _vcnBpp;
}
}
- d -= 1400;
+ d -= 1400 * _vcnBpp;
}
}
- d += 1232;
+ d += 1232 * _vcnBpp;
}
screen()->copyBlockToPage(_sceneDrawPage1, _sceneXoffset, 0, 176, 120, _sceneWindowBuffer);