diff options
author | Martin Kiewitz | 2010-11-01 16:09:33 +0000 |
---|---|---|
committer | Martin Kiewitz | 2010-11-01 16:09:33 +0000 |
commit | eefa151d70c66558d4f40b41a32b1e0df30c1d89 (patch) | |
tree | 7d1ebf14a1ffe06affe34e37218d855a501b1934 /engines/sci/engine | |
parent | 9a350f43980d82ec001c077b28c035350478fe8e (diff) | |
download | scummvm-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.cpp | 65 | ||||
-rw-r--r-- | engines/sci/engine/savegame.h | 156 |
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
|