[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