diff options
Diffstat (limited to 'engines/sherlock/scene.cpp')
-rw-r--r-- | engines/sherlock/scene.cpp | 109 |
1 files changed, 62 insertions, 47 deletions
diff --git a/engines/sherlock/scene.cpp b/engines/sherlock/scene.cpp index c571f27b0c..78d0cd862c 100644 --- a/engines/sherlock/scene.cpp +++ b/engines/sherlock/scene.cpp @@ -26,6 +26,8 @@ #include "sherlock/scalpel/scalpel.h" #include "sherlock/scalpel/scalpel_people.h" #include "sherlock/scalpel/scalpel_scene.h" +#include "sherlock/scalpel/scalpel_screen.h" +#include "sherlock/scalpel/3do/scalpel_3do_screen.h" #include "sherlock/tattoo/tattoo.h" #include "sherlock/tattoo/tattoo_scene.h" #include "sherlock/tattoo/tattoo_user_interface.h" @@ -215,7 +217,6 @@ Scene::Scene(SherlockEngine *vm): _vm(vm) { _currentScene = -1; _goToScene = -1; - _loadingSavedGame = false; _walkedInScene = false; _version = 0; _compressed = false; @@ -273,19 +274,20 @@ void Scene::selectScene() { } void Scene::freeScene() { + SaveManager &saves = *_vm->_saves; + if (_currentScene == -1) return; _vm->_ui->clearWindow(); _vm->_talk->freeTalkVars(); + _vm->_talk->clearSequences(); _vm->_inventory->freeInv(); _vm->_music->freeSong(); _vm->_sound->freeLoadedSounds(); - if (!_loadingSavedGame) + if (!saves._justLoaded) saveSceneStatus(); - else - _loadingSavedGame = false; _sequenceBuffer.clear(); _descText.clear(); @@ -355,7 +357,7 @@ bool Scene::loadScene(const Common::String &filename) { if (IS_ROSE_TATTOO) { // Resize the screen if necessary int fullWidth = SHERLOCK_SCREEN_WIDTH + bgHeader._scrollSize; - if (screen._backBuffer1.w() != fullWidth) { + if (screen._backBuffer1.width() != fullWidth) { screen._backBuffer1.create(fullWidth, SHERLOCK_SCREEN_HEIGHT); screen._backBuffer2.create(fullWidth, SHERLOCK_SCREEN_HEIGHT); } @@ -363,9 +365,8 @@ bool Scene::loadScene(const Common::String &filename) { // Handle initializing the palette screen.initPaletteFade(bgHeader._bytesWritten); rrmStream->read(screen._cMap, PALETTE_SIZE); - screen.translatePalette(screen._cMap); - paletteLoaded(); + screen.translatePalette(screen._cMap); // Read in background if (_compressed) { @@ -562,34 +563,37 @@ bool Scene::loadScene(const Common::String &filename) { // Read in the walk data size = rrmStream->readUint16LE(); - Common::SeekableReadStream *walkStream = !_compressed ? rrmStream : + Common::SeekableReadStream *walkStream = !_compressed ? rrmStream->readStream(size) : res.decompress(*rrmStream, size); - int startPos = walkStream->pos(); - while ((walkStream->pos() - startPos) < size) { - _walkPoints.push_back(WalkArray()); - _walkPoints[_walkPoints.size() - 1]._fileOffset = walkStream->pos() - startPos; - _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); - } - - if (_compressed) - delete walkStream; - // Translate the file offsets of the walk directory to indexes in the loaded walk data for (uint idx1 = 0; idx1 < _zones.size(); ++idx1) { for (uint idx2 = 0; idx2 < _zones.size(); ++idx2) { - int fileOffset = _walkDirectory[idx1][idx2]; - if (fileOffset == -1) + int dataOffset = _walkDirectory[idx1][idx2]; + if (dataOffset == -1) continue; + // Check to see if we've already loaded the walk set for the given data offset uint dataIndex = 0; - while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != fileOffset) + while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != dataOffset) ++dataIndex; - assert(dataIndex < _walkPoints.size()); + + if (dataIndex == _walkPoints.size()) { + // Walk data for that offset hasn't been loaded yet, so load it now + _walkPoints.push_back(WalkArray()); + + walkStream->seek(dataOffset); + _walkPoints[_walkPoints.size() - 1]._fileOffset = dataOffset; + _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); + dataIndex = _walkPoints.size() - 1; + } + _walkDirectory[idx1][idx2] = dataIndex; } } + delete walkStream; + if (IS_ROSE_TATTOO) { // Read in the entrance _entrance.load(*rrmStream); @@ -646,7 +650,7 @@ bool Scene::loadScene(const Common::String &filename) { } // Backup the image and set the palette - screen._backBuffer2.blitFrom(screen._backBuffer1); + screen._backBuffer2.SHblitFrom(screen._backBuffer1); screen.setPalette(screen._cMap); delete rrmStream; @@ -892,28 +896,38 @@ bool Scene::loadScene(const Common::String &filename) { // === WALK DATA === Read in the walk data roomStream->seek(header3DO_walkData_offset); - int startPos = roomStream->pos(); - while ((roomStream->pos() - startPos) < (int)header3DO_walkData_size) { - _walkPoints.push_back(WalkArray()); - _walkPoints[_walkPoints.size() - 1]._fileOffset = roomStream->pos() - startPos; - _walkPoints[_walkPoints.size() - 1].load(*roomStream, false); - } + // Read in the walk data + Common::SeekableReadStream *walkStream = !_compressed ? roomStream->readStream(header3DO_walkData_size) : + res.decompress(*roomStream, header3DO_walkData_size); // Translate the file offsets of the walk directory to indexes in the loaded walk data for (uint idx1 = 0; idx1 < _zones.size(); ++idx1) { for (uint idx2 = 0; idx2 < _zones.size(); ++idx2) { - int fileOffset = _walkDirectory[idx1][idx2]; - if (fileOffset == -1) + int dataOffset = _walkDirectory[idx1][idx2]; + if (dataOffset == -1) continue; + // Check to see if we've already loaded the walk set for the given data offset uint dataIndex = 0; - while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != fileOffset) + while (dataIndex < _walkPoints.size() && _walkPoints[dataIndex]._fileOffset != dataOffset) ++dataIndex; - assert(dataIndex < _walkPoints.size()); + + if (dataIndex == _walkPoints.size()) { + // Walk data for that offset hasn't been loaded yet, so load it now + _walkPoints.push_back(WalkArray()); + + walkStream->seek(dataOffset); + _walkPoints[_walkPoints.size() - 1]._fileOffset = dataOffset; + _walkPoints[_walkPoints.size() - 1].load(*walkStream, IS_ROSE_TATTOO); + dataIndex = _walkPoints.size() - 1; + } + _walkDirectory[idx1][idx2] = dataIndex; } } + delete walkStream; + // === EXITS === Read in the exits roomStream->seek(header3DO_exits_offset); @@ -983,12 +997,12 @@ bool Scene::loadScene(const Common::String &filename) { #if 0 // code to show the background - screen.blitFrom(screen._backBuffer1); + screen.SHblitFrom(screen._backBuffer1); _vm->_events->wait(10000); #endif // Backup the image - screen._backBuffer2.blitFrom(screen._backBuffer1); + screen._backBuffer2.SHblitFrom(screen._backBuffer1); } // Handle drawing any on-screen interface @@ -1090,9 +1104,9 @@ void Scene::checkSceneFlags(bool flag) { for (uint idx = 0; idx < _bgShapes.size(); ++idx) { Object &o = _bgShapes[idx]; - bool objectFlag = true; if (o._requiredFlag[0] || o._requiredFlag[1]) { + bool objectFlag = true; if (o._requiredFlag[0] != 0) objectFlag = _vm->readFlags(o._requiredFlag[0]); if (o._requiredFlag[1] != 0) @@ -1201,13 +1215,15 @@ void Scene::transitionToScene() { int cAnimNum = -1; - if (hSavedFacing < 101) { - // Standard info, so set it - people[HOLMES]._position = hSavedPos; - people[HOLMES]._sequenceNumber = hSavedFacing; - } else { - // It's canimation information - cAnimNum = hSavedFacing - 101; + if (!saves._justLoaded) { + if (hSavedFacing < 101) { + // Standard info, so set it + people[HOLMES]._position = hSavedPos; + people[HOLMES]._sequenceNumber = hSavedFacing; + } else { + // It's canimation information + cAnimNum = hSavedFacing - 101; + } } // Reset positioning for next load @@ -1221,7 +1237,7 @@ void Scene::transitionToScene() { // If the scene is capable of scrolling, set the current scroll so that whoever has control // of the scroll code is in the middle of the screen - if (screen._backBuffer1.w() > SHERLOCK_SCREEN_WIDTH) + if (screen._backBuffer1.width() > SHERLOCK_SCREEN_WIDTH) people[people._walkControl].centerScreenOnPerson(); for (uint objIdx = 0; objIdx < _bgShapes.size(); ++objIdx) { @@ -1280,7 +1296,7 @@ void Scene::transitionToScene() { } else { // fade in for 3DO screen.clear(); - screen.fadeIntoScreen3DO(3); + static_cast<Scalpel::Scalpel3DOScreen *>(_vm->_screen)->fadeIntoScreen3DO(3); } } else { screen.slamArea(screen._currentScroll.x, screen._currentScroll.y, SHERLOCK_SCREEN_WIDTH, SHERLOCK_SCREEN_HEIGHT); @@ -1374,10 +1390,9 @@ void Scene::synchronize(Serializer &s) { s.syncAsSint16LE(_currentScene); } else { s.syncAsSint16LE(_goToScene); - _loadingSavedGame = true; } - for (int sceneNum = 0; sceneNum < SCENES_COUNT; ++sceneNum) { + for (int sceneNum = 1; sceneNum < SCENES_COUNT; ++sceneNum) { for (int flag = 0; flag <= MAX_BGSHAPES; ++flag) { s.syncAsByte(_sceneStats[sceneNum][flag]); } |