aboutsummaryrefslogtreecommitdiff
path: root/engines/tsage/scenes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tsage/scenes.cpp')
-rw-r--r--engines/tsage/scenes.cpp106
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