aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorMartin Kiewitz2010-11-01 16:09:33 +0000
committerMartin Kiewitz2010-11-01 16:09:33 +0000
commiteefa151d70c66558d4f40b41a32b1e0df30c1d89 (patch)
tree7d1ebf14a1ffe06affe34e37218d855a501b1934 /engines/sci/engine
parent9a350f43980d82ec001c077b28c035350478fe8e (diff)
downloadscummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.tar.gz
scummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.tar.bz2
scummvm-rg350-eefa151d70c66558d4f40b41a32b1e0df30c1d89.zip
SCI: saving/restoring script created windows now
fixes "GfxPorts::kernelSetActive" error based on code by [md5] svn-id: r54012
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/savegame.cpp65
-rw-r--r--engines/sci/engine/savegame.h156
2 files changed, 138 insertions, 83 deletions
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 0b6caa515b..ffe91534b8 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -40,6 +40,7 @@
#include "sci/engine/selector.h"
#include "sci/engine/vm_types.h"
#include "sci/engine/script.h" // for SCI_OBJ_EXPORTS and SCI_OBJ_SYNONYMS
+#include "sci/graphics/helpers.h"
#include "sci/graphics/palette.h"
#include "sci/graphics/ports.h"
#include "sci/sound/audio.h"
@@ -175,9 +176,6 @@ void syncWithSerializer(Common::Serializer &s, Class &obj) {
}
static void sync_SavegameMetadata(Common::Serializer &s, SavegameMetadata &obj) {
- // TODO: It would be a good idea to store a magic number & a header size here,
- // so that we can implement backward compatibility if the savegame format changes.
-
s.syncString(obj.name);
s.syncVersion(CURRENT_SAVEGAME_VERSION);
obj.version = s.getVersion();
@@ -605,6 +603,61 @@ void GfxPalette::saveLoadWithSerializer(Common::Serializer &s) {
}
}
+void GfxPorts::saveLoadWithSerializer(Common::Serializer &s) {
+ if (s.isLoading())
+ reset(); // remove all script generated windows
+
+ if (s.getVersion() >= 27) {
+ uint windowCount = 0;
+ uint id = PORTS_FIRSTSCRIPTWINDOWID;
+ if (s.isSaving()) {
+ while (id < _windowsById.size()) {
+ if (_windowsById[id])
+ windowCount++;
+ id++;
+ }
+ }
+ // Save/Restore window count
+ s.syncAsUint32LE(windowCount);
+
+ if (s.isSaving()) {
+ id = PORTS_FIRSTSCRIPTWINDOWID;
+ while (id < _windowsById.size()) {
+ if (_windowsById[id]) {
+ Window *window = (Window *)_windowsById[id];
+ window->saveLoadWithSerializer(s);
+ }
+ id++;
+ }
+ } else {
+ id = PORTS_FIRSTSCRIPTWINDOWID;
+ while (windowCount) {
+ Window *window = new Window(0);
+ window->saveLoadWithSerializer(s);
+
+ // add enough entries inside _windowsById as needed
+ while (id <= window->id) {
+ _windowsById.push_back(0);
+ id++;
+ }
+ _windowsById[window->id] = window;
+ // _windowList may not be 100% correct using that way of restoring
+ // saving/restoring ports won't work perfectly anyway, because the contents
+ // of the window can only get repainted by the scripts and they dont do that
+ // so we will get empty, transparent windows instead. So perfect window order
+ // shouldn't really matter
+ if (window->wndStyle & SCI_WINDOWMGR_STYLE_TOPMOST)
+ _windowList.push_front(window);
+ else
+ _windowList.push_back(window);
+
+ windowCount--;
+ id++;
+ }
+ }
+ }
+}
+
void SegManager::reconstructStack(EngineState *s) {
DataStack *stack = (DataStack *)(_heap[findSegmentByType(SEG_TYPE_STACK)]);
s->stack_base = stack->_entries;
@@ -711,6 +764,8 @@ bool gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savenam
sync_SavegameMetadata(ser, meta);
Graphics::saveThumbnail(*fh);
s->saveLoadWithSerializer(ser); // FIXME: Error handling?
+ if (g_sci->_gfxPorts)
+ g_sci->_gfxPorts->saveLoadWithSerializer(ser);
return true;
}
@@ -761,6 +816,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
s->reset(true);
s->saveLoadWithSerializer(ser); // FIXME: Error handling?
+
// Now copy all current state information
s->_segMan->reconstructStack(s);
@@ -775,8 +831,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
g_engine->setTotalPlayTime(meta.playTime * 1000);
if (g_sci->_gfxPorts)
- g_sci->_gfxPorts->reset();
-
+ g_sci->_gfxPorts->saveLoadWithSerializer(ser);
g_sci->_soundCmd->reconstructPlayList();
// Message state:
diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h
index 7ab28e126b..2b09f8fa11 100644
--- a/engines/sci/engine/savegame.h
+++ b/engines/sci/engine/savegame.h
@@ -1,80 +1,80 @@
-/* ScummVM - Graphic Adventure Engine
- *
- * ScummVM is the legal property of its developers, whose names
- * are too numerous to list here. Please refer to the COPYRIGHT
- * file distributed with this source distribution.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * 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$
- *
- */
-
-#ifndef SCI_ENGINE_SAVEGAME_H
-#define SCI_ENGINE_SAVEGAME_H
-
-#include "common/scummsys.h"
-#include "common/str.h"
-
-#include "sci/sci.h"
-
-namespace Sci {
-
-struct EngineState;
-
-enum {
- CURRENT_SAVEGAME_VERSION = 26,
- MINIMUM_SAVEGAME_VERSION = 14
-};
-
-// Savegame metadata
-struct SavegameMetadata {
- Common::String name;
- int version;
- Common::String gameVersion;
- int saveDate;
- int saveTime;
- uint32 playTime;
- uint16 gameObjectOffset;
- uint16 script0Size;
-};
-
-
-/**
- * Saves a game state to the hard disk in a portable way.
- * @param s The state to save
- * @param save The stream to save to
- * @param savename The description of the savegame
- * @return 0 on success, 1 otherwise
- */
-bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version);
-
-/**
- * Restores a game state from a directory.
- * @param s An older state from the same game
- * @param dirname The subdirectory to restore from
- */
-void gamestate_restore(EngineState *s, Common::SeekableReadStream *save);
-
-/**
- * Read the header from a savegame.
- */
-bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta);
-
-
-} // End of namespace Sci
-
-#endif // SCI_ENGINE_SAVEGAME_H
+ *
+ */
+
+#ifndef SCI_ENGINE_SAVEGAME_H
+#define SCI_ENGINE_SAVEGAME_H
+
+#include "common/scummsys.h"
+#include "common/str.h"
+
+#include "sci/sci.h"
+
+namespace Sci {
+
+struct EngineState;
+
+enum {
+ CURRENT_SAVEGAME_VERSION = 27,
+ MINIMUM_SAVEGAME_VERSION = 14
+};
+
+// Savegame metadata
+struct SavegameMetadata {
+ Common::String name;
+ int version;
+ Common::String gameVersion;
+ int saveDate;
+ int saveTime;
+ uint32 playTime;
+ uint16 gameObjectOffset;
+ uint16 script0Size;
+};
+
+
+/**
+ * Saves a game state to the hard disk in a portable way.
+ * @param s The state to save
+ * @param save The stream to save to
+ * @param savename The description of the savegame
+ * @return 0 on success, 1 otherwise
+ */
+bool gamestate_save(EngineState *s, Common::WriteStream *save, const char *savename, const char *version);
+
+/**
+ * Restores a game state from a directory.
+ * @param s An older state from the same game
+ * @param dirname The subdirectory to restore from
+ */
+void gamestate_restore(EngineState *s, Common::SeekableReadStream *save);
+
+/**
+ * Read the header from a savegame.
+ */
+bool get_savegame_metadata(Common::SeekableReadStream* stream, SavegameMetadata* meta);
+
+
+} // End of namespace Sci
+
+#endif // SCI_ENGINE_SAVEGAME_H