diff options
Diffstat (limited to 'engines/tsage/scenes.cpp')
-rw-r--r-- | engines/tsage/scenes.cpp | 106 |
1 files changed, 67 insertions, 39 deletions
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp index 9a99049c19..4625661b62 100644 --- a/engines/tsage/scenes.cpp +++ b/engines/tsage/scenes.cpp @@ -18,9 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ - * */ #include "tsage/scenes.h" @@ -62,12 +59,16 @@ void SceneManager::checkScene() { } void SceneManager::sceneChange() { + int activeScreenNumber = 0; + // Handle removing the scene - if (_scene) + if (_scene) { + activeScreenNumber = _scene->_activeScreenNumber; _scene->remove(); + } // Clear the scene objects - SynchronisedList<SceneObject *>::iterator io = _globals->_sceneObjects->begin(); + SynchronizedList<SceneObject *>::iterator io = _globals->_sceneObjects->begin(); while (io != _globals->_sceneObjects->end()) { SceneObject *sceneObj = *io; ++io; @@ -83,7 +84,7 @@ void SceneManager::sceneChange() { } // Clear the hotspot list - SynchronisedList<SceneItem *>::iterator ii = _globals->_sceneItems.begin(); + SynchronizedList<SceneItem *>::iterator ii = _globals->_sceneItems.begin(); while (ii != _globals->_sceneItems.end()) { SceneItem *sceneItem = *ii; ++ii; @@ -122,11 +123,11 @@ void SceneManager::sceneChange() { if (!_saver->getMacroRestoreFlag()) _scene->postInit(); else - _scene->loadScene(_sceneNumber); + _scene->loadScene(activeScreenNumber); } Scene *SceneManager::getNewScene() { - return SceneFactory::createScene(_nextSceneNumber); + return _globals->_game->createScene(_nextSceneNumber); } void SceneManager::fadeInIfNecessary() { @@ -160,7 +161,7 @@ void SceneManager::changeScene(int newSceneNumber) { } // Stop any objects that were animating - SynchronisedList<SceneObject *>::iterator i; + SynchronizedList<SceneObject *>::iterator i; for (i = _globals->_sceneObjects->begin(); i != _globals->_sceneObjects->end(); ++i) { SceneObject *sceneObj = *i; Common::Point pt(0, 0); @@ -223,18 +224,24 @@ void SceneManager::setBgOffset(const Common::Point &pt, int loadCount) { _sceneLoadCount = loadCount; } -void SceneManager::listenerSynchronise(Serialiser &s) { +void SceneManager::listenerSynchronize(Serializer &s) { s.validate("SceneManager"); - _altSceneObjects.synchronise(s); + if (s.isLoading() && !_globals->_sceneManager._scene) + // Loading a savegame straight from the launcher, so instantiate a blank placeholder scene + // in order for the savegame loading to work correctly + _globals->_sceneManager._scene = new Scene(); + + _altSceneObjects.synchronize(s); s.syncAsSint32LE(_sceneNumber); + s.syncAsUint16LE(_globals->_sceneManager._scene->_activeScreenNumber); + if (s.isLoading()) { changeScene(_sceneNumber); checkScene(); } - s.syncAsUint16LE(_globals->_sceneManager._scene->_activeScreenNumber); - _globals->_sceneManager._scrollerRect.synchronise(s); + _globals->_sceneManager._scrollerRect.synchronize(s); SYNC_POINTER(_globals->_scrollFollower); s.syncAsSint16LE(_loadMode); } @@ -251,14 +258,17 @@ Scene::Scene() : _sceneBounds(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), Scene::~Scene() { } -void Scene::synchronise(Serialiser &s) { +void Scene::synchronize(Serializer &s) { + if (s.getVersion() >= 2) + StripCallback::synchronize(s); + s.syncAsSint32LE(_field12); s.syncAsSint32LE(_screenNumber); s.syncAsSint32LE(_activeScreenNumber); s.syncAsSint32LE(_sceneMode); - _backgroundBounds.synchronise(s); - _sceneBounds.synchronise(s); - _oldSceneBounds.synchronise(s); + _backgroundBounds.synchronize(s); + _sceneBounds.synchronize(s); + _oldSceneBounds.synchronize(s); s.syncAsSint16LE(_fieldA); s.syncAsSint16LE(_fieldE); @@ -314,7 +324,7 @@ void Scene::loadSceneData(int sceneNum) { // Load the priority regions _priorities.load(sceneNum); - // Initialise the section enabled list + // Initialize the section enabled list Common::set_to(&_enabledSections[0], &_enabledSections[16 * 16], 0xffff); _globals->_sceneOffset.x = (_sceneBounds.left / 160) * 160; @@ -428,7 +438,7 @@ void Scene::drawAltObjects() { Common::Array<SceneObject *> objList; // Initial loop to set the priority for entries in the list - for (SynchronisedList<SceneObject *>::iterator i = _globals->_sceneManager._altSceneObjects.begin(); + for (SynchronizedList<SceneObject *>::iterator i = _globals->_sceneManager._altSceneObjects.begin(); i != _globals->_sceneManager._altSceneObjects.end(); ++i) { SceneObject *obj = *i; objList.push_back(obj); @@ -453,36 +463,54 @@ void Scene::drawAltObjects() { } void Scene::setZoomPercents(int yStart, int minPercent, int yEnd, int maxPercent) { - int var_6 = 0; + int currDiff = 0; int v = 0; while (v < yStart) _zoomPercents[v++] = minPercent; int diff1 = ABS(maxPercent - minPercent); int diff2 = ABS(yEnd - yStart); - int var_8 = MAX(diff1, diff2); - - while (var_8-- != 0) { - _zoomPercents[v] = minPercent; - if (diff2 <= diff1) { - ++minPercent; - var_6 += diff2; - if (var_6 >= diff1) { - var_6 -= diff1; - ++v; - } - } else { - ++v; - var_6 += diff1; - if (var_6 >= diff2) { - var_6 -= diff2; - ++minPercent; - } - } + int remainingDiff = MAX(diff1, diff2); + + while (remainingDiff-- != 0) { + _zoomPercents[v] = minPercent; + if (diff2 <= diff1) { + ++minPercent; + currDiff += diff2; + if (currDiff >= diff1) { + currDiff -= diff1; + ++v; + } + } else { + ++v; + currDiff += diff1; + if (currDiff >= diff2) { + currDiff -= diff2; + ++minPercent; + } + } } while (yEnd < 256) _zoomPercents[yEnd++] = minPercent; } +/*--------------------------------------------------------------------------*/ + +void Game::execute() { + // Main game loop + bool activeFlag = false; + do { + // Process all currently atcive game handlers + activeFlag = false; + for (SynchronizedList<GameHandler *>::iterator i = _handlers.begin(); i != _handlers.end(); ++i) { + GameHandler *gh = *i; + if (gh->_lockCtr.getCtr() == 0) { + gh->execute(); + activeFlag = true; + } + } + } while (activeFlag && !_vm->getEventManager()->shouldQuit()); +} + } // End of namespace tSage |