aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Snover2017-02-08 18:52:20 -0600
committerColin Snover2017-04-22 13:01:37 -0500
commit93b337b8335a455d0108c168ebcfae655327753c (patch)
tree69a89200367f712689f26de88214b5e5c0f33cc9
parenta22e461208db6000adce464eb501159d015e3492 (diff)
downloadscummvm-rg350-93b337b8335a455d0108c168ebcfae655327753c.tar.gz
scummvm-rg350-93b337b8335a455d0108c168ebcfae655327753c.tar.bz2
scummvm-rg350-93b337b8335a455d0108c168ebcfae655327753c.zip
SCI: Do not sync objects when saving games
Commit 5de2668939a6735da2b3438b7c586fc185791ef8 silently changed behaviour from running this code only when restoring a game, to running all the time, in an apparent copy-paste error.
-rw-r--r--engines/sci/engine/savegame.cpp50
1 files changed, 26 insertions, 24 deletions
diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp
index 057d590b78..3b8429bf08 100644
--- a/engines/sci/engine/savegame.cpp
+++ b/engines/sci/engine/savegame.cpp
@@ -271,35 +271,37 @@ void SegManager::saveLoadWithSerializer(Common::Serializer &s) {
syncArray<Class>(s, _classTable);
- // Now that all scripts are loaded, init their objects.
- // Just like in Script::initializeObjectsSci0, we do two passes
- // in case an object is loaded before its base.
- int passes = getSciVersion() < SCI_VERSION_1_1 ? 2 : 1;
- for (int pass = 1; pass <= passes; ++pass) {
- for (uint i = 0; i < _heap.size(); i++) {
- if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT)
- continue;
-
- Script *scr = (Script *)_heap[i];
- scr->syncLocalsBlock(this);
+ if (s.isLoading()) {
+ // Now that all scripts are loaded, init their objects.
+ // Just like in Script::initializeObjectsSci0, we do two passes
+ // in case an object is loaded before its base.
+ int passes = getSciVersion() < SCI_VERSION_1_1 ? 2 : 1;
+ for (int pass = 1; pass <= passes; ++pass) {
+ for (uint i = 0; i < _heap.size(); i++) {
+ if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT)
+ continue;
- ObjMap objects = scr->getObjectMap();
- for (ObjMap::iterator it = objects.begin(); it != objects.end(); ++it) {
- reg_t addr = it->_value.getPos();
- Object *obj = scr->scriptObjInit(addr, false);
+ Script *scr = (Script *)_heap[i];
+ scr->syncLocalsBlock(this);
- if (pass == 2) {
- if (!obj->initBaseObject(this, addr, false)) {
- // TODO/FIXME: This should not be happening at all. It might indicate a possible issue
- // with the garbage collector. It happens for example in LSL5 (German, perhaps English too).
- warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr));
- objects.erase(addr.toUint16());
+ ObjMap objects = scr->getObjectMap();
+ for (ObjMap::iterator it = objects.begin(); it != objects.end(); ++it) {
+ reg_t addr = it->_value.getPos();
+ Object *obj = scr->scriptObjInit(addr, false);
+
+ if (pass == 2) {
+ if (!obj->initBaseObject(this, addr, false)) {
+ // TODO/FIXME: This should not be happening at all. It might indicate a possible issue
+ // with the garbage collector. It happens for example in LSL5 (German, perhaps English too).
+ warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr));
+ objects.erase(addr.toUint16());
+ }
}
}
- }
- if (s.isLoading() && pass == passes) {
- g_sci->_guestAdditions->segManSaveLoadScriptHook(*scr);
+ if (pass == passes) {
+ g_sci->_guestAdditions->segManSaveLoadScriptHook(*scr);
+ }
}
}
}