aboutsummaryrefslogtreecommitdiff
path: root/engines/illusions/backgroundresource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/illusions/backgroundresource.cpp')
-rw-r--r--engines/illusions/backgroundresource.cpp84
1 files changed, 69 insertions, 15 deletions
diff --git a/engines/illusions/backgroundresource.cpp b/engines/illusions/backgroundresource.cpp
index 754b9d2e80..a4111c7893 100644
--- a/engines/illusions/backgroundresource.cpp
+++ b/engines/illusions/backgroundresource.cpp
@@ -53,8 +53,12 @@ void BackgroundResourceLoader::load(Resource *resource) {
// TODO camera_fadeClear();
int index = backgroundItem->_bgRes->findMasterBgIndex();
_vm->_camera->set(backgroundItem->_bgRes->_bgInfos[index - 1]._panPoint, backgroundItem->_bgRes->_bgInfos[index - 1]._surfInfo._dimensions);
+
+ if (backgroundItem->_bgRes->_palettesCount > 0) {
+ Palette *palette = &backgroundItem->_bgRes->_palettes[backgroundItem->_bgRes->_paletteIndex - 1];
+ _vm->_screen->setPalette(palette->_palette, 1, palette->_count);
+ }
- // NOTE Skipped palette loading (not used in BBDOU)
}
void BackgroundResourceLoader::unload(Resource *resource) {
@@ -150,6 +154,15 @@ int ScaleLayer::getScale(Common::Point pos) {
return _values[pos.y];
}
+// Palette
+
+void Palette::load(byte *dataStart, Common::SeekableReadStream &stream) {
+ _count = stream.readUint16LE();
+ _unk = stream.readUint16LE();
+ uint32 paletteOffs = stream.readUint32LE();
+ _palette = dataStart + paletteOffs;
+}
+
// BackgroundObject
void BackgroundObject::load(byte *dataStart, Common::SeekableReadStream &stream) {
@@ -176,13 +189,15 @@ void BackgroundResource::load(byte *data, uint32 dataSize) {
Common::MemoryReadStream stream(data, dataSize, DisposeAfterUse::NO);
// TODO A lot
+ stream.seek(8);
+ _paletteIndex = stream.readUint16LE();
+
// Load background pixels
stream.seek(0x0A);
_bgInfosCount = stream.readUint16LE();
_bgInfos = new BgInfo[_bgInfosCount];
stream.seek(0x20);
uint32 bgInfosOffs = stream.readUint32LE();
- debug("_bgInfosCount: %d", _bgInfosCount);
for (uint i = 0; i < _bgInfosCount; ++i) {
stream.seek(bgInfosOffs + i * 0x1C);
_bgInfos[i].load(data, stream);
@@ -232,6 +247,18 @@ void BackgroundResource::load(byte *data, uint32 dataSize) {
stream.seek(namedPointsOffs);
_namedPoints.load(namedPointsCount, stream);
+ // Load palettes
+ stream.seek(0x18);
+ _palettesCount = stream.readUint16LE();
+ _palettes = new Palette[_palettesCount];
+ stream.seek(0x3C);
+ uint32 palettesOffs = stream.readUint32LE();
+ debug(0, "_palettesCount: %d", _palettesCount);
+ for (uint i = 0; i < _palettesCount; ++i) {
+ stream.seek(palettesOffs + i * 8);
+ _palettes[i].load(data, stream);
+ }
+
}
int BackgroundResource::findMasterBgIndex() {
@@ -255,7 +282,7 @@ bool BackgroundResource::findNamedPoint(uint32 namedPointId, Common::Point &pt)
// BackgroundItem
-BackgroundItem::BackgroundItem(IllusionsEngine *vm) : _vm(vm), _tag(0), _pauseCtr(0), _bgRes(0) {
+BackgroundItem::BackgroundItem(IllusionsEngine *vm) : _vm(vm), _tag(0), _pauseCtr(0), _bgRes(0), _savedPalette(0) {
}
BackgroundItem::~BackgroundItem() {
@@ -282,6 +309,41 @@ void BackgroundItem::freeSurface() {
}
void BackgroundItem::drawTiles(Graphics::Surface *surface, TileMap &tileMap, byte *tilePixels) {
+ switch (_vm->getGameId()) {
+ case kGameIdDuckman:
+ drawTiles8(surface, tileMap, tilePixels);
+ break;
+ case kGameIdBBDOU:
+ drawTiles16(surface, tileMap, tilePixels);
+ break;
+ }
+}
+
+void BackgroundItem::drawTiles8(Graphics::Surface *surface, TileMap &tileMap, byte *tilePixels) {
+ const int kTileWidth = 32;
+ const int kTileHeight = 8;
+ const int kTileSize = kTileWidth * kTileHeight;
+ uint tileMapIndex = 0;
+ for (int tileY = 0; tileY < tileMap._height; ++tileY) {
+ int tileDestY = tileY * kTileHeight;
+ int tileDestH = MIN(kTileHeight, surface->h - tileDestY);
+ for (int tileX = 0; tileX < tileMap._width; ++tileX) {
+ int tileDestX = tileX * kTileWidth;
+ int tileDestW = MIN(kTileWidth, surface->w - tileDestX);
+ uint16 tileIndex = READ_LE_UINT16(tileMap._map + 2 * tileMapIndex);
+ ++tileMapIndex;
+ byte *src = tilePixels + (tileIndex - 1) * kTileSize;
+ byte *dst = (byte*)surface->getBasePtr(tileDestX, tileDestY);
+ for (int h = 0; h < tileDestH; ++h) {
+ memcpy(dst, src, tileDestW);
+ dst += surface->pitch;
+ src += kTileWidth;
+ }
+ }
+ }
+}
+
+void BackgroundItem::drawTiles16(Graphics::Surface *surface, TileMap &tileMap, byte *tilePixels) {
const int kTileWidth = 32;
const int kTileHeight = 8;
const int kTileSize = kTileWidth * kTileHeight * 2;
@@ -318,10 +380,8 @@ void BackgroundItem::pause() {
*/
// TODO _vm->setDefPointDimensions1();
_vm->_camera->getActiveState(_savedCameraState);
- /* Unused
- _savedPalette = malloc(1024);
- savePalette(_savedPalette);
- */
+ _savedPalette = new byte[1024];
+ _vm->_screen->getPalette(_savedPalette);
freeSurface();
}
}
@@ -335,11 +395,9 @@ void BackgroundItem::unpause() {
krndictAddID(_bgRes->_item48s[i].id, _bgRes->_item48s[i]);
*/
initSurface();
- /* Unused
- restorePalette(_savedPalette, 1, 256);
- free(_savedPalette);
+ _vm->_screen->setPalette(_savedPalette, 1, 256);
+ delete[] _savedPalette;
_savedPalette = 0;
- */
// TODO _vm->_screen->_fadeClear();
_vm->_camera->setActiveState(_savedCameraState);
_vm->_backgroundItems->refreshPan();
@@ -437,8 +495,4 @@ bool BackgroundItems::findActiveBackgroundNamedPoint(uint32 namedPointId, Common
return backgroundResource ? backgroundResource->findNamedPoint(namedPointId, pt) : false;
}
-BackgroundItem *BackgroundItems::debugFirst() {
- return *(_items.begin());
-}
-
} // End of namespace Illusions