From a5528ecc7e7da65ae89bae9c9d2cabe6b4e99145 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 6 Sep 2014 16:39:49 -0400 Subject: MADS: Fix spare screen background changes for TextView showing quotes --- engines/mads/nebular/menu_nebular.cpp | 47 ++++++++++++++++++----------------- engines/mads/nebular/menu_nebular.h | 2 +- engines/mads/scene_data.cpp | 22 ++++++++++++++-- engines/mads/scene_data.h | 3 ++- 4 files changed, 47 insertions(+), 27 deletions(-) (limited to 'engines') diff --git a/engines/mads/nebular/menu_nebular.cpp b/engines/mads/nebular/menu_nebular.cpp index a217ba684d..6e55b9c18f 100644 --- a/engines/mads/nebular/menu_nebular.cpp +++ b/engines/mads/nebular/menu_nebular.cpp @@ -434,7 +434,6 @@ void TextView::execute(MADSEngine *vm, const Common::String &resName) { TextView::TextView(MADSEngine *vm) : MenuView(vm) { _animating = false; _panSpeed = 0; - Common::fill(&_spareScreens[0], &_spareScreens[10], 0); _spareScreen = nullptr; _scrollCount = 0; _lineY = -1; @@ -449,7 +448,6 @@ TextView::TextView(MADSEngine *vm) : MenuView(vm) { } TextView::~TextView() { - delete _spareScreen; } void TextView::load() { @@ -570,11 +568,17 @@ void TextView::processCommand() { // Sets a secondary background number that can be later switched in with a PAGE command paramP = commandStr + 6; int spareIndex = commandStr[5] - '0'; - if ((spareIndex >= 0) && (spareIndex <= 9)) { - int screenId = getParameter(¶mP); + assert(spareIndex < 4); + int screenId = getParameter(¶mP); - _spareScreens[spareIndex] = screenId; - } + // Load the spare background + SceneInfo *sceneInfo = SceneInfo::init(_vm); + sceneInfo->_width = MADS_SCREEN_WIDTH; + sceneInfo->_height = MADS_SCENE_HEIGHT; + _spareScreens[spareIndex].setSize(MADS_SCREEN_WIDTH, MADS_SCENE_HEIGHT); + sceneInfo->loadMadsV1Background(screenId, "", SCENEFLAG_TRANSLATE, + _spareScreens[spareIndex]); + delete sceneInfo; } else if (!strncmp(commandStr, "PAGE", 4)) { // Signals to change to a previous specified secondary background @@ -582,10 +586,8 @@ void TextView::processCommand() { int spareIndex = getParameter(¶mP); // Only allow background switches if one isn't currently in progress - if (!_spareScreen && (_spareScreens[spareIndex] != 0)) { - _spareScreen = new MSurface(MADS_SCREEN_WIDTH, MADS_SCREEN_HEIGHT); - //_spareScreen->loadBackground(_spareScreens[spareIndex], &_bgSpare); - + if (!_spareScreen && _spareScreens[spareIndex].getPixels() != nullptr) { + _spareScreen = &_spareScreens[spareIndex]; _translationX = 0; } @@ -667,24 +669,23 @@ void TextView::doFrame() { // If a screen transition is in progress and it's time for another column, handle it if (_spareScreen) { byte *srcP = _spareScreen->getBasePtr(_translationX, 0); - byte *destP = scene._backgroundSurface.getBasePtr(_translationX, 0); + byte *bgP = scene._backgroundSurface.getBasePtr(_translationX, 0); + byte *screenP = (byte *)_vm->_screen.getBasePtr(_translationX, 0); - for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += _spareScreen->w, - destP += MADS_SCREEN_WIDTH) { - *destP = *srcP; + for (int y = 0; y < MADS_SCENE_HEIGHT; ++y, srcP += MADS_SCREEN_WIDTH, + bgP += MADS_SCREEN_WIDTH, screenP += MADS_SCREEN_WIDTH) { + *bgP = *srcP; + *screenP = *srcP; } - if (++_translationX >= MADS_SCREEN_WIDTH) { + // Flag the column of the screen is modified + _vm->_screen.copyRectToScreen(Common::Rect(_translationX, 0, + _translationX + 1, MADS_SCENE_HEIGHT)); + + // Keep moving the column to copy to the right + if (++_translationX == MADS_SCREEN_WIDTH) { // Surface transition is complete - /* - delete _spareScreen; _spareScreen = nullptr; - -// _vm->_palette->deleteRange(_bgCurrent); - delete _bgCurrent; - _bgCurrent = _bgSpare; - _bgSpare = nullptr; - */ } } diff --git a/engines/mads/nebular/menu_nebular.h b/engines/mads/nebular/menu_nebular.h index a22cb422b8..23d9fa3c03 100644 --- a/engines/mads/nebular/menu_nebular.h +++ b/engines/mads/nebular/menu_nebular.h @@ -166,7 +166,7 @@ private: Common::Array _textLines; Common::Point _pan; int _panSpeed; - int _spareScreens[10]; + MSurface _spareScreens[4]; int _scrollCount; int _lineY; uint32 _scrollTimeout; diff --git a/engines/mads/scene_data.cpp b/engines/mads/scene_data.cpp index e874468345..66848ca939 100644 --- a/engines/mads/scene_data.cpp +++ b/engines/mads/scene_data.cpp @@ -333,7 +333,7 @@ void SceneInfo::loadMadsV1Background(int sceneId, const Common::String &resName, // Get the ART resource if (sceneFlag) { - resourceName = Resources::formatName(RESPREFIX_RM, _artFileNum, ".ART"); + resourceName = Resources::formatName(RESPREFIX_RM, sceneId, ".ART"); } else { resourceName = "*" + Resources::formatResource(resName, resName); } @@ -346,9 +346,27 @@ void SceneInfo::loadMadsV1Background(int sceneId, const Common::String &resName, assert(_width == bgSurface.w && _height == bgSurface.h); stream = artResource.getItemStream(1); stream->read(bgSurface.getPixels(), bgSurface.w * bgSurface.h); + delete stream; + + if (flags & SCENEFLAG_TRANSLATE) { + // Load in the palette and translate it + Common::SeekableReadStream *palStream = artResource.getItemStream(0); + Common::Array palette; + + palStream->skip(4); // Skip width and height + int numColors = palStream->readUint16LE(); + assert(numColors <= 252); + palette.resize(numColors); + for (int i = 0; i < numColors; ++i) + palette[i].load(palStream); + delete palStream; + + // Translate the surface + _vm->_palette->_paletteUsage.process(palette, 0); + bgSurface.translate(palette); + } // Close the ART file - delete stream; artFile.close(); } diff --git a/engines/mads/scene_data.h b/engines/mads/scene_data.h index 783a9ab8a9..41e094b8f5 100644 --- a/engines/mads/scene_data.h +++ b/engines/mads/scene_data.h @@ -55,7 +55,8 @@ class SpriteSlot; enum { SCENEFLAG_DITHER = 0x01, // Dither to 16 colors - SCENEFLAG_LOAD_SHADOW = 0x10 // Load hard shadows + SCENEFLAG_LOAD_SHADOW = 0x10, // Load hard shadows + SCENEFLAG_TRANSLATE = 0x10000 // Translate palette of loaded background }; class VerbInit { -- cgit v1.2.3