aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorMatthew Hoops2011-02-14 22:38:12 -0500
committerMatthew Hoops2011-02-14 22:38:12 -0500
commitee09af6a12e26f100a9a0457dcb552707abd4288 (patch)
tree4899f6bc8b41a926ae89ecbc3c5fd38fac54ee03 /engines
parent8ef4594f9b9016f6b93fc176dd8aea8bdd7d85cf (diff)
downloadscummvm-rg350-ee09af6a12e26f100a9a0457dcb552707abd4288.tar.gz
scummvm-rg350-ee09af6a12e26f100a9a0457dcb552707abd4288.tar.bz2
scummvm-rg350-ee09af6a12e26f100a9a0457dcb552707abd4288.zip
SCI: Fix loading SCI32 games
The frames/items in GfxFrameout need to be cleared upon loading
Diffstat (limited to 'engines')
-rw-r--r--engines/sci/engine/savegame.cpp16
-rw-r--r--engines/sci/graphics/frameout.cpp6
-rw-r--r--engines/sci/graphics/frameout.h3
3 files changed, 22 insertions, 3 deletions
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 610698fbd9..ab355cebb4 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -47,6 +47,10 @@
#include "sci/sound/audio.h"
#include "sci/sound/music.h"
+#ifdef ENABLE_SCI32
+#include "sci/graphics/frameout.h"
+#endif
+
namespace Sci {
@@ -130,6 +134,13 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) {
// Reset _scriptSegMap, to be restored below
_scriptSegMap.clear();
+
+#ifdef ENABLE_SCI32
+ // Clear any planes/screen items currently showing so they
+ // don't show up after the load.
+ if (getSciVersion() >= SCI_VERSION_2)
+ g_sci->_gfxFrameout->clear();
+#endif
}
s.skip(4, VER(14), VER(18)); // OBSOLETE: Used to be _exportsAreWide
@@ -166,16 +177,15 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) {
_heap[i] = NULL; // set as freed
continue;
}
- }
#ifdef ENABLE_SCI32
- else if (type == SEG_TYPE_ARRAY) {
+ } else if (type == SEG_TYPE_ARRAY) {
// Set the correct segment for SCI32 arrays
_arraysSegId = i;
} else if (type == SEG_TYPE_STRING) {
// Set the correct segment for SCI32 strings
_stringSegId = i;
- }
#endif
+ }
if (s.isLoading())
mobj = SegmentObj::createSegmentObj(type);
diff --git a/engines/sci/graphics/frameout.cpp b/engines/sci/graphics/frameout.cpp
index 026a2ff405..ab4a2c9c1a 100644
--- a/engines/sci/graphics/frameout.cpp
+++ b/engines/sci/graphics/frameout.cpp
@@ -58,6 +58,12 @@ GfxFrameout::GfxFrameout(SegManager *segMan, ResourceManager *resMan, GfxCoordAd
GfxFrameout::~GfxFrameout() {
}
+void GfxFrameout::clear() {
+ _screenItems.clear();
+ _planes.clear();
+ _planePictures.clear();
+}
+
void GfxFrameout::kernelAddPlane(reg_t object) {
PlaneEntry newPlane;
diff --git a/engines/sci/graphics/frameout.h b/engines/sci/graphics/frameout.h
index 93d61ba22e..347ecb9424 100644
--- a/engines/sci/graphics/frameout.h
+++ b/engines/sci/graphics/frameout.h
@@ -28,6 +28,8 @@
namespace Sci {
+class GfxPicture;
+
struct PlaneEntry {
reg_t object;
uint16 priority;
@@ -99,6 +101,7 @@ public:
void addPlanePicture(reg_t object, GuiResourceId pictureId, uint16 startX);
void deletePlanePictures(reg_t object);
+ void clear();
private:
SegManager *_segMan;