[Scummvm-cvs-logs] scummvm master -> 95b4713ffaf3be9e31bf54cad71c76aa637de510
dreammaster
dreammaster at scummvm.org
Tue Apr 19 13:09:47 CEST 2011
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
5dcfd1e32c TSAGE: Reworked the saving code to fix crashes
95b4713ffa TSAGE: Changed Scene::_sceneNumber to avoid confusion with SceneManager::_sceneNumber
Commit: 5dcfd1e32c185e88b09a3ff1341aaf78b674572b
https://github.com/scummvm/scummvm/commit/5dcfd1e32c185e88b09a3ff1341aaf78b674572b
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-04-19T04:02:27-07:00
Commit Message:
TSAGE: Reworked the saving code to fix crashes
Note that this undoes the recent compilation fix for GCC, since it didn't work. For now, used an explicit void ** conversion as previously suggested.
Changed paths:
engines/tsage/core.h
engines/tsage/saveload.cpp
engines/tsage/saveload.h
engines/tsage/scenes.cpp
engines/tsage/scenes.h
diff --git a/engines/tsage/core.h b/engines/tsage/core.h
index 6508d15..c18984f 100644
--- a/engines/tsage/core.h
+++ b/engines/tsage/core.h
@@ -728,6 +728,7 @@ public:
}
SynchronisedList<SceneObject *>::iterator begin() { return _objList.begin(); }
SynchronisedList<SceneObject *>::iterator end() { return _objList.end(); }
+ int size() const { return _objList.size(); }
bool contains(SceneObject *sceneObj) { return tSage::contains(_objList, sceneObj); }
void push_back(SceneObject *sceneObj) { _objList.push_back(sceneObj); }
void push_front(SceneObject *sceneObj) { _objList.push_front(sceneObj); }
diff --git a/engines/tsage/saveload.cpp b/engines/tsage/saveload.cpp
index 594d30f..73c9d02 100644
--- a/engines/tsage/saveload.cpp
+++ b/engines/tsage/saveload.cpp
@@ -151,13 +151,13 @@ Common::Error Saver::save(int slot, const Common::String &saveName) {
}
Common::Error Saver::restore(int slot) {
- assert(!getMacroSaveFlag());
+ assert(!getMacroRestoreFlag());
// Signal any objects registered for notification
_loadNotifiers.notify(false);
// Set fields
- _macroSaveFlag = true;
+ _macroRestoreFlag = true;
_saveSlot = slot;
_unresolvedPtrs.clear();
@@ -335,7 +335,7 @@ bool Saver::savegamesExist() const {
*/
int Saver::blockIndexOf(SavedObject *p) {
int objIndex = 1;
- SynchronisedList<SavedObject *>::iterator iObj;
+ Common::List<SavedObject *>::iterator iObj;
for (iObj = _objList.begin(); iObj != _objList.end(); ++iObj, ++objIndex) {
SavedObject *iObjP = *iObj;
@@ -347,6 +347,30 @@ int Saver::blockIndexOf(SavedObject *p) {
}
/**
+ * Returns the number of objects in the object list registry
+ */
+int Saver::getObjectCount() const {
+ int count = 0;
+ Common::List<SavedObject *>::const_iterator i;
+
+ for (i = _objList.begin(); i != _objList.end(); ++i, ++count)
+ ;
+ return count;
+}
+
+/**
+ * List any currently active objects
+ */
+void Saver::listObjects() {
+ Common::List<SavedObject *>::iterator i;
+ int count = 1;
+
+ for (i = _objList.begin(); i != _objList.end(); ++i, ++count)
+ debug("%d - %s", count, (*i)->getClassName().c_str());
+ debug("");
+}
+
+/**
* Returns the pointer associated with the specified object index
*/
void Saver::resolveLoadPointers() {
@@ -358,12 +382,14 @@ void Saver::resolveLoadPointers() {
int objIndex = 1;
for (SynchronisedList<SavedObject *>::iterator iObj = _objList.begin(); iObj != _objList.end(); ++iObj, ++objIndex) {
Common::List<SavedObjectRef>::iterator iPtr;
+ SavedObject *pObj = *iObj;
for (iPtr = _unresolvedPtrs.begin(); iPtr != _unresolvedPtrs.end(); ) {
SavedObjectRef &r = *iPtr;
if (r._objIndex == objIndex) {
// Found an unresolved pointer to this object
- *r._savedObject = *iObj;
+ SavedObject **objPP = r._savedObject;
+ *objPP = pObj;
iPtr = _unresolvedPtrs.erase(iPtr);
} else {
++iPtr;
diff --git a/engines/tsage/saveload.h b/engines/tsage/saveload.h
index 945d144..c45271b 100644
--- a/engines/tsage/saveload.h
+++ b/engines/tsage/saveload.h
@@ -54,8 +54,8 @@ struct tSageSavegameHeader {
// FIXME: workaround to supress spurious strict-alias warnings on older GCC
// versions. this should be resolved with the savegame rewrite
#define SYNC_POINTER(x) do { \
- SavedObject *y = (SavedObject *)x; \
- s.syncPointer(&y); \
+ SavedObject **y = (SavedObject **)((void *)&x); \
+ s.syncPointer(y); \
} while (false)
#define SYNC_ENUM(FIELD, TYPE) int v_##FIELD = (int)FIELD; s.syncAsUint16LE(v_##FIELD); \
@@ -176,7 +176,7 @@ typedef SavedObject *(*SavedObjectFactory)(const Common::String &className);
class Saver {
private:
- SynchronisedList<SavedObject *> _objList;
+ Common::List<SavedObject *> _objList;
FunctionList<bool> _saveNotifiers;
FunctionList<bool> _loadNotifiers;
Common::List<SaveListener *> _listeners;
@@ -212,6 +212,8 @@ public:
bool getMacroSaveFlag() const { return _macroSaveFlag; }
bool getMacroRestoreFlag() const { return _macroRestoreFlag; }
int blockIndexOf(SavedObject *p);
+ int getObjectCount() const;
+ void listObjects();
};
extern Saver *_saver;
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index 748e866..fc82f16 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -27,6 +27,7 @@
#include "tsage/globals.h"
#include "tsage/ringworld_logic.h"
#include "tsage/tsage.h"
+#include "tsage/saveload.h"
namespace tSage {
@@ -39,6 +40,7 @@ SceneManager::SceneManager() {
_fadeMode = FADEMODE_GRADUAL;
_scrollerRect = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
_saver->addListener(this);
+ _objectCount = 0;
}
SceneManager::~SceneManager() {
@@ -107,6 +109,12 @@ void SceneManager::sceneChange() {
// Free any regions
disposeRegions();
+ // Ensure that the same number of objects are registered now as when the scene started
+ if (_objectCount > 0) {
+ assert(_objectCount == _saver->getObjectCount());
+ }
+ _objectCount = _saver->getObjectCount();
+
// Instantiate and set the new scene
_scene = getNewScene();
_scene->postInit();
diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h
index 1a6f927..6353972 100644
--- a/engines/tsage/scenes.h
+++ b/engines/tsage/scenes.h
@@ -88,6 +88,7 @@ public:
int _sceneLoadCount;
Rect _scrollerRect;
SceneObjectList _altSceneObjects;
+ int _objectCount;
public:
SceneManager();
virtual ~SceneManager();
Commit: 95b4713ffaf3be9e31bf54cad71c76aa637de510
https://github.com/scummvm/scummvm/commit/95b4713ffaf3be9e31bf54cad71c76aa637de510
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2011-04-19T04:07:37-07:00
Commit Message:
TSAGE: Changed Scene::_sceneNumber to avoid confusion with SceneManager::_sceneNumber
Changed paths:
engines/tsage/converse.cpp
engines/tsage/ringworld_scenes1.cpp
engines/tsage/ringworld_scenes10.cpp
engines/tsage/scenes.cpp
engines/tsage/scenes.h
diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp
index d77e536..57c5c48 100644
--- a/engines/tsage/converse.cpp
+++ b/engines/tsage/converse.cpp
@@ -530,7 +530,7 @@ void StripManager::start(int stripNum, EventHandler *owner, StripCallback *callb
_stripNum = stripNum;
_callbackObject = callback;
- _sceneNumber = _globals->_sceneManager._scene->_sceneNumber;
+ _sceneNumber = _globals->_sceneManager._scene->_screenNumber;
_sceneBounds = _globals->_sceneManager._scene->_sceneBounds;
_script.clear();
@@ -631,7 +631,7 @@ void StripManager::remove() {
if (_activeSpeaker)
_activeSpeaker->remove();
- if (_sceneNumber != _globals->_sceneManager._scene->_sceneNumber) {
+ if (_sceneNumber != _globals->_sceneManager._scene->_screenNumber) {
_globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
_globals->_sceneManager._scene->loadScene(_sceneNumber);
}
@@ -695,7 +695,7 @@ void StripManager::signal() {
_activeSpeaker->remove();
_activeSpeaker = speakerP;
- if ((_activeSpeaker->_newSceneNumber == -1) && (_globals->_sceneManager._scene->_sceneNumber != _sceneNumber)) {
+ if ((_activeSpeaker->_newSceneNumber == -1) && (_globals->_sceneManager._scene->_screenNumber != _sceneNumber)) {
_globals->_sceneManager._scene->_sceneBounds = _sceneBounds;
_globals->_sceneManager._scene->loadScene(_sceneNumber);
}
diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp
index c8d10e1..3495df0 100644
--- a/engines/tsage/ringworld_scenes1.cpp
+++ b/engines/tsage/ringworld_scenes1.cpp
@@ -2424,7 +2424,7 @@ void Scene60::signal() {
void Scene60::process(Event &event) {
Scene::process(event);
- if (_sceneNumber == 60) {
+ if (_screenNumber == 60) {
if (_gfxButton.process(event))
_globals->_sceneManager.changeScene(50);
}
diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp
index 4d413a0..5e0cabd 100644
--- a/engines/tsage/ringworld_scenes10.cpp
+++ b/engines/tsage/ringworld_scenes10.cpp
@@ -785,7 +785,7 @@ void Scene9400::dispatch() {
void Scene9400::postInit(SceneObjectList *OwnerList) {
Scene::postInit();
- _sceneNumber = 9400;
+ _screenNumber = 9400;
setZoomPercents(0, 100, 200, 100);
_globals->_player.postInit();
_object1.postInit(0);
diff --git a/engines/tsage/scenes.cpp b/engines/tsage/scenes.cpp
index fc82f16..8454c7e 100644
--- a/engines/tsage/scenes.cpp
+++ b/engines/tsage/scenes.cpp
@@ -248,7 +248,7 @@ Scene::~Scene() {
void Scene::synchronise(Serialiser &s) {
s.syncAsSint32LE(_field12);
- s.syncAsSint32LE(_sceneNumber);
+ s.syncAsSint32LE(_screenNumber);
s.syncAsSint32LE(_activeScreenNumber);
s.syncAsSint32LE(_sceneMode);
_backgroundBounds.synchronise(s);
@@ -281,7 +281,7 @@ void Scene::dispatch() {
void Scene::loadScene(int sceneNum) {
warning("loadScene(%d)", sceneNum);
- _sceneNumber = sceneNum;
+ _screenNumber = sceneNum;
if (_globals->_scenePalette.loadPalette(sceneNum))
_globals->_sceneManager._hasPalette = true;
diff --git a/engines/tsage/scenes.h b/engines/tsage/scenes.h
index 6353972..0ac9067 100644
--- a/engines/tsage/scenes.h
+++ b/engines/tsage/scenes.h
@@ -39,7 +39,7 @@ private:
void drawAltObjects();
public:
int _field12;
- int _sceneNumber;
+ int _screenNumber;
int _activeScreenNumber;
int _sceneMode;
StripManager _stripManager;
More information about the Scummvm-git-logs
mailing list