Skip to content

Commit

Permalink
MADS: Fix spare screen background changes for TextView showing quotes
Browse files Browse the repository at this point in the history
  • Loading branch information
dreammaster committed Sep 6, 2014
1 parent 6201ddf commit a5528ec
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 27 deletions.
47 changes: 24 additions & 23 deletions engines/mads/nebular/menu_nebular.cpp
Expand Up @@ -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;
Expand All @@ -449,7 +448,6 @@ TextView::TextView(MADSEngine *vm) : MenuView(vm) {
}

TextView::~TextView() {
delete _spareScreen;
}

void TextView::load() {
Expand Down Expand Up @@ -570,22 +568,26 @@ 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(&paramP);
assert(spareIndex < 4);
int screenId = getParameter(&paramP);

_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
paramP = commandStr + 4;
int spareIndex = getParameter(&paramP);

// 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;
}

Expand Down Expand Up @@ -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;
*/
}
}

Expand Down
2 changes: 1 addition & 1 deletion engines/mads/nebular/menu_nebular.h
Expand Up @@ -166,7 +166,7 @@ class TextView : public MenuView {
Common::Array<TextLine> _textLines;
Common::Point _pan;
int _panSpeed;
int _spareScreens[10];
MSurface _spareScreens[4];
int _scrollCount;
int _lineY;
uint32 _scrollTimeout;
Expand Down
22 changes: 20 additions & 2 deletions engines/mads/scene_data.cpp
Expand Up @@ -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);
}
Expand All @@ -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<RGB6> 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();
}

Expand Down
3 changes: 2 additions & 1 deletion engines/mads/scene_data.h
Expand Up @@ -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 {
Expand Down

0 comments on commit a5528ec

Please sign in to comment.