From 60dd3106885b9784af15cb96122d28a5f0bf33f1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 26 May 2010 06:53:08 +0000 Subject: Cleanup svn-id: r49227 --- engines/sci/engine/savegame.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 8dc06dab01..ff51f4015c 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -849,24 +849,19 @@ void SegManager::reconstructScripts(EngineState *s) { byte *data = scr->_buf + it->_value.getPos().offset; if (getSciVersion() >= SCI_VERSION_1_1) { - uint16 *funct_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 6 )); - uint16 *prop_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 )); - - it->_value._baseMethod = funct_area; - it->_value._baseVars = prop_area; + it->_value._baseMethod = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 6 )); + it->_value._baseVars = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 )); } else { int funct_area = READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET); - Object *_baseObj; - - _baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector()); + Object *baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector()); - if (!_baseObj) { + if (!baseObj) { warning("Object without a base class: Script %d, index %d (reg address %04x:%04x", scr->_nr, i, PRINT_REG(it->_value.getSpeciesSelector())); continue; } - it->_value.setVarCount(_baseObj->getVarCount()); - it->_value._baseObj = _baseObj->_baseObj; + it->_value.setVarCount(baseObj->getVarCount()); + it->_value._baseObj = baseObj->_baseObj; it->_value._baseMethod = (uint16 *)(data + funct_area); it->_value._baseVars = (uint16 *)(data + it->_value.getVarCount() * 2 + SCRIPT_SELECTOR_OFFSET); -- cgit v1.2.3 From bfaba64c6a3aee6875bf135147c2f29a621c876b Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Wed, 26 May 2010 14:25:51 +0000 Subject: Made find_unique_script_block() a member of the Script class svn-id: r49241 --- engines/sci/engine/savegame.cpp | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index ff51f4015c..8f341895c6 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -748,26 +748,6 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename return 0; } -static byte *find_unique_script_block(EngineState *s, byte *buf, int type) { - bool oldScriptHeader = (getSciVersion() == SCI_VERSION_0_EARLY); - - if (oldScriptHeader) - buf += 2; - - do { - int seeker_type = READ_LE_UINT16(buf); - - if (seeker_type == 0) break; - if (seeker_type == type) return buf; - - int seeker_size = READ_LE_UINT16(buf + 2); - assert(seeker_size > 0); - buf += seeker_size; - } while (1); - - return NULL; -} - // TODO: This should probably be turned into an EngineState or DataStack method. static void reconstruct_stack(EngineState *retval) { SegmentId stack_seg = retval->_segMan->findSegmentByType(SEG_TYPE_STACK); @@ -821,8 +801,8 @@ void SegManager::reconstructScripts(EngineState *s) { s->_segMan->scriptRelocateExportsSci11(i); } } else { - scr->_exportTable = (uint16 *) find_unique_script_block(s, scr->_buf, SCI_OBJ_EXPORTS); - scr->_synonyms = find_unique_script_block(s, scr->_buf, SCI_OBJ_SYNONYMS); + scr->_exportTable = (uint16 *) scr->findBlock(SCI_OBJ_EXPORTS); + scr->_synonyms = scr->findBlock(SCI_OBJ_SYNONYMS); scr->_exportTable += 3; } scr->_codeBlocks.clear(); -- cgit v1.2.3 From 0197e9f6a19738054a4b847e3217cd3794ef3ce3 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 26 May 2010 16:30:10 +0000 Subject: SCI: Making various object and script related things const svn-id: r49246 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 8f341895c6..c967dddf7d 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -833,7 +833,7 @@ void SegManager::reconstructScripts(EngineState *s) { it->_value._baseVars = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 )); } else { int funct_area = READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET); - Object *baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector()); + const Object *baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector()); if (!baseObj) { warning("Object without a base class: Script %d, index %d (reg address %04x:%04x", -- cgit v1.2.3 From a6156a680583bfd3876bcd1c6d5e550763d0a677 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 29 May 2010 15:29:27 +0000 Subject: Removed the scriptRelocateExportsSci11() hack. The open spell in QFG1VGA works now (thanks to waltervn for all his help on this) svn-id: r49311 --- engines/sci/engine/savegame.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c967dddf7d..ab8b9eec58 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -798,7 +798,6 @@ void SegManager::reconstructScripts(EngineState *s) { scr->_synonyms = 0; if (READ_LE_UINT16(scr->_buf + 6) > 0) { scr->setExportTableOffset(6); - s->_segMan->scriptRelocateExportsSci11(i); } } else { scr->_exportTable = (uint16 *) scr->findBlock(SCI_OBJ_EXPORTS); -- cgit v1.2.3 From 42d6ed880b92e19c469c70da92397bd860abb483 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 29 May 2010 21:42:42 +0000 Subject: SCI: Make Script::_exportTable const (yay :-) svn-id: r49315 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index ab8b9eec58..7310993473 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -800,7 +800,7 @@ void SegManager::reconstructScripts(EngineState *s) { scr->setExportTableOffset(6); } } else { - scr->_exportTable = (uint16 *) scr->findBlock(SCI_OBJ_EXPORTS); + scr->_exportTable = (const uint16 *)scr->findBlock(SCI_OBJ_EXPORTS); scr->_synonyms = scr->findBlock(SCI_OBJ_SYNONYMS); scr->_exportTable += 3; } -- cgit v1.2.3 From 5f2ff0b1e7147a5638e66bbd1362196b5419c330 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sat, 29 May 2010 23:56:37 +0000 Subject: Limit access to the _classTable array (now it's directly accessible only inside saveLoadWithSerializer() svn-id: r49318 --- engines/sci/engine/savegame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 7310993473..eb52a888fa 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -383,7 +383,7 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) { sync_SegManagerPtr(s, _segMan); - syncArray(s, _segMan->_classtable); + syncArray(s, _segMan->_classTable); #ifdef USE_OLD_MUSIC_FUNCTIONS sync_songlib(s, _sound._songlib); -- cgit v1.2.3 From c32e88fe0bb61e75ca983072ba28102d4efbf123 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 30 May 2010 16:14:31 +0000 Subject: Limit access to the _bufSize, _scriptSize and _heapSize members of the Script class svn-id: r49327 --- engines/sci/engine/savegame.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index eb52a888fa..363dc8a44a 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -758,22 +758,22 @@ static void reconstruct_stack(EngineState *retval) { } static void load_script(EngineState *s, Script *scr) { - scr->_buf = (byte *)malloc(scr->_bufSize); + scr->_buf = (byte *)malloc(scr->getBufSize()); assert(scr->_buf); Resource *script = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, scr->_nr), 0); assert(script != 0); - assert(scr->_bufSize >= script->size); + assert(scr->getBufSize() >= script->size); memcpy(scr->_buf, script->data, script->size); if (getSciVersion() >= SCI_VERSION_1_1) { Resource *heap = g_sci->getResMan()->findResource(ResourceId(kResourceTypeHeap, scr->_nr), 0); assert(heap != 0); - scr->_heapStart = scr->_buf + scr->_scriptSize; + scr->_heapStart = scr->_buf + scr->getScriptSize(); - assert(scr->_bufSize - scr->_scriptSize <= heap->size); + assert(scr->getBufSize() - scr->getScriptSize() <= heap->size); memcpy(scr->_heapStart, heap->data, heap->size); } } -- cgit v1.2.3 From 5cdb13b3e8a160e7eae14c03644ad3be5a38b415 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 30 May 2010 16:38:08 +0000 Subject: Made load_script() a member of the Script class svn-id: r49328 --- engines/sci/engine/savegame.cpp | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 363dc8a44a..2846aa5b9f 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -757,27 +757,6 @@ static void reconstruct_stack(EngineState *retval) { retval->stack_top = stack->_entries + stack->_capacity; } -static void load_script(EngineState *s, Script *scr) { - scr->_buf = (byte *)malloc(scr->getBufSize()); - assert(scr->_buf); - - Resource *script = g_sci->getResMan()->findResource(ResourceId(kResourceTypeScript, scr->_nr), 0); - assert(script != 0); - - assert(scr->getBufSize() >= script->size); - memcpy(scr->_buf, script->data, script->size); - - if (getSciVersion() >= SCI_VERSION_1_1) { - Resource *heap = g_sci->getResMan()->findResource(ResourceId(kResourceTypeHeap, scr->_nr), 0); - assert(heap != 0); - - scr->_heapStart = scr->_buf + scr->getScriptSize(); - - assert(scr->getBufSize() - scr->getScriptSize() <= heap->size); - memcpy(scr->_heapStart, heap->data, heap->size); - } -} - // TODO: Move thie function to a more appropriate place, such as vm.cpp or script.cpp void SegManager::reconstructScripts(EngineState *s) { uint i; @@ -791,7 +770,7 @@ void SegManager::reconstructScripts(EngineState *s) { Script *scr = (Script *)mobj; // FIXME: Unify this code with script_instantiate_* ? - load_script(s, scr); + scr->load(g_sci->getResMan()); scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(_heap[scr->_localsSegment]); if (getSciVersion() >= SCI_VERSION_1_1) { scr->_exportTable = 0; -- cgit v1.2.3 From 1fd3877ec7778535174cdfaef50810d619630fbb Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 30 May 2010 20:18:42 +0000 Subject: Cleanup svn-id: r49333 --- engines/sci/engine/savegame.cpp | 9 --------- 1 file changed, 9 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 2846aa5b9f..2d21ce6cbb 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -731,15 +731,6 @@ int gamestate_save(EngineState *s, Common::WriteStream *fh, const char* savename return 1; } -/* - if (s->sound_server) { - if ((s->sound_server->save)(s, dirname)) { - warning("Saving failed for the sound subsystem"); - //chdir(".."); - return 1; - } - } -*/ Common::Serializer ser(0, fh); sync_SavegameMetadata(ser, meta); Graphics::saveThumbnail(*fh); -- cgit v1.2.3 From a0ee93ece52213cd989a50902281d917fe392ea4 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 30 May 2010 21:49:07 +0000 Subject: SCI: Script exports and synonyms are now initialized when a script is loaded. Removed a sanity check inside script_instantiate_sci0 for a bug which no longer exists svn-id: r49336 --- engines/sci/engine/savegame.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 2d21ce6cbb..ae233f8c09 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -541,8 +541,8 @@ void Script::saveLoadWithSerializer(Common::Serializer &s) { } } - s.syncAsSint32LE(_numExports); - s.syncAsSint32LE(_numSynonyms); + s.skip(4, VER(9), VER(19)); // OBSOLETE: Used to be _numExports + s.skip(4, VER(9), VER(19)); // OBSOLETE: Used to be _numSynonyms s.syncAsSint32LE(_lockers); // Sync _objects. This is a hashmap, and we use the following on disk format: @@ -763,18 +763,6 @@ void SegManager::reconstructScripts(EngineState *s) { // FIXME: Unify this code with script_instantiate_* ? scr->load(g_sci->getResMan()); scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(_heap[scr->_localsSegment]); - if (getSciVersion() >= SCI_VERSION_1_1) { - scr->_exportTable = 0; - scr->_synonyms = 0; - if (READ_LE_UINT16(scr->_buf + 6) > 0) { - scr->setExportTableOffset(6); - } - } else { - scr->_exportTable = (const uint16 *)scr->findBlock(SCI_OBJ_EXPORTS); - scr->_synonyms = scr->findBlock(SCI_OBJ_SYNONYMS); - scr->_exportTable += 3; - } - scr->_codeBlocks.clear(); ObjMap::iterator it; const ObjMap::iterator end = scr->_objects.end(); -- cgit v1.2.3 From 693618d89a56ccc943f9f0608abf8737d5002d32 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 31 May 2010 00:04:38 +0000 Subject: Slight cleanup svn-id: r49339 --- engines/sci/engine/savegame.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index ae233f8c09..07c40b332c 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -751,14 +751,12 @@ static void reconstruct_stack(EngineState *retval) { // TODO: Move thie function to a more appropriate place, such as vm.cpp or script.cpp void SegManager::reconstructScripts(EngineState *s) { uint i; - SegmentObj *mobj; for (i = 0; i < _heap.size(); i++) { - mobj = _heap[i]; - if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT) + if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT) continue; - Script *scr = (Script *)mobj; + Script *scr = (Script *)_heap[i]; // FIXME: Unify this code with script_instantiate_* ? scr->load(g_sci->getResMan()); @@ -773,11 +771,10 @@ void SegManager::reconstructScripts(EngineState *s) { } for (i = 0; i < _heap.size(); i++) { - mobj = _heap[i]; - if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT) + if (!_heap[i] || _heap[i]->getType() != SEG_TYPE_SCRIPT) continue; - Script *scr = (Script *)mobj; + Script *scr = (Script *)_heap[i]; // FIXME: Unify this code with Script::scriptObjInit ? ObjMap::iterator it; -- cgit v1.2.3 From 3f4302214c334a590b8428fe7ae32c76e64b6ed5 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Mon, 31 May 2010 11:25:59 +0000 Subject: The save/load object init code is now unified with the regular object init code svn-id: r49346 --- engines/sci/engine/savegame.cpp | 40 ++++++++++------------------------------ 1 file changed, 10 insertions(+), 30 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 07c40b332c..20bcb687d5 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -757,17 +757,11 @@ void SegManager::reconstructScripts(EngineState *s) { continue; Script *scr = (Script *)_heap[i]; - - // FIXME: Unify this code with script_instantiate_* ? scr->load(g_sci->getResMan()); scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(_heap[scr->_localsSegment]); - ObjMap::iterator it; - const ObjMap::iterator end = scr->_objects.end(); - for (it = scr->_objects.begin(); it != end; ++it) { - byte *data = scr->_buf + it->_value.getPos().offset; - it->_value._baseObj = data; - } + for (ObjMap::iterator it = scr->_objects.begin(); it != scr->_objects.end(); ++it) + it->_value._baseObj = scr->_buf + it->_value.getPos().offset; } for (i = 0; i < _heap.size(); i++) { @@ -776,29 +770,15 @@ void SegManager::reconstructScripts(EngineState *s) { Script *scr = (Script *)_heap[i]; - // FIXME: Unify this code with Script::scriptObjInit ? - ObjMap::iterator it; - const ObjMap::iterator end = scr->_objects.end(); - for (it = scr->_objects.begin(); it != end; ++it) { - byte *data = scr->_buf + it->_value.getPos().offset; - - if (getSciVersion() >= SCI_VERSION_1_1) { - it->_value._baseMethod = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 6 )); - it->_value._baseVars = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 )); - } else { - int funct_area = READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET); - const Object *baseObj = s->_segMan->getObject(it->_value.getSpeciesSelector()); - - if (!baseObj) { - warning("Object without a base class: Script %d, index %d (reg address %04x:%04x", - scr->_nr, i, PRINT_REG(it->_value.getSpeciesSelector())); - continue; - } - it->_value.setVarCount(baseObj->getVarCount()); - it->_value._baseObj = baseObj->_baseObj; + for (ObjMap::iterator it = scr->_objects.begin(); it != scr->_objects.end(); ++it) { + reg_t addr = it->_value.getPos(); + Object *obj = scr->scriptObjInit(addr, false); - it->_value._baseMethod = (uint16 *)(data + funct_area); - it->_value._baseVars = (uint16 *)(data + it->_value.getVarCount() * 2 + SCRIPT_SELECTOR_OFFSET); + if (getSciVersion() < SCI_VERSION_1_1) { + if (!obj->initBaseObject(this, addr, false)) { + warning("Failed to locate base object for object at %04X:%04X; skipping", PRINT_REG(addr)); + scr->scriptObjRemove(addr); + } } } } -- cgit v1.2.3 From e083c20da1aab0090a5fc3ea624c9810c63dad52 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 1 Jun 2010 14:41:48 +0000 Subject: The system strings segment is a fixed segment of the segment manager, which doesn't change during the game, thus move all the system strings code and variables inside the segment manager svn-id: r49372 --- engines/sci/engine/savegame.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 20bcb687d5..85c9915d57 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -893,8 +893,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { retval->_gameObj = s->_gameObj; retval->script_000 = retval->_segMan->getScript(retval->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); retval->gc_countdown = GC_INTERVAL - 1; - retval->sys_strings_segment = retval->_segMan->findSegmentByType(SEG_TYPE_SYS_STRINGS); - retval->sys_strings = (SystemStrings *)(retval->_segMan->_heap[retval->sys_strings_segment]); // Time state: retval->last_wait_time = g_system->getMillis(); @@ -903,7 +901,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { // static parser information: if (retval->_voc) - retval->_voc->parser_base = make_reg(s->sys_strings_segment, SYS_STRING_PARSER_BASE); + retval->_voc->parser_base = make_reg(s->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); retval->successor = NULL; -- cgit v1.2.3 From 9c92bd1b810621bdaa779bd3354b10ad048c7924 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 1 Jun 2010 15:11:20 +0000 Subject: The parser vocabulary remains static throughout the game, thus it has been removed from the engine state svn-id: r49373 --- engines/sci/engine/savegame.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 85c9915d57..bba087d953 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -857,7 +857,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { } // Create a new EngineState object - retval = new EngineState(s->_voc, s->_segMan); + retval = new EngineState(s->_segMan); retval->_event = s->_event; // Copy some old data @@ -898,11 +898,6 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { retval->last_wait_time = g_system->getMillis(); retval->game_start_time = g_system->getMillis(); - // static parser information: - - if (retval->_voc) - retval->_voc->parser_base = make_reg(s->_segMan->getSysStringsSegment(), SYS_STRING_PARSER_BASE); - retval->successor = NULL; #ifdef USE_OLD_MUSIC_FUNCTIONS -- cgit v1.2.3 From 65f3cfcbd816fe05437298cd46621d9f058aaea3 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Tue, 1 Jun 2010 15:48:17 +0000 Subject: Stop reconstructing the engine state when restoring, but reset it instead svn-id: r49376 --- engines/sci/engine/savegame.cpp | 65 +++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 38 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index bba087d953..798f889460 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -821,7 +821,6 @@ static void reconstruct_sounds(EngineState *s) { #endif void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { - EngineState *retval; #ifdef USE_OLD_MUSIC_FUNCTIONS SongLibrary temp; #endif @@ -856,76 +855,66 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { thumbnail = 0; } - // Create a new EngineState object - retval = new EngineState(s->_segMan); - retval->_event = s->_event; - - // Copy some old data - retval->_soundCmd = s->_soundCmd; - - // Copy memory segment - retval->_memorySegmentSize = s->_memorySegmentSize; - memcpy(retval->_memorySegment, s->_memorySegment, s->_memorySegmentSize); - - retval->saveLoadWithSerializer(ser); // FIXME: Error handling? + s->reset(true); + s->saveLoadWithSerializer(ser); // FIXME: Error handling? #ifdef USE_OLD_MUSIC_FUNCTIONS s->_sound.sfx_exit(); #endif // Set exec stack base to zero - retval->execution_stack_base = 0; + s->execution_stack_base = 0; // Now copy all current state information #ifdef USE_OLD_MUSIC_FUNCTIONS - temp = retval->_sound._songlib; - retval->_sound.sfx_init(g_sci->getResMan(), s->sfx_init_flags, g_sci->_features->detectDoSoundType()); - retval->sfx_init_flags = s->sfx_init_flags; - retval->_sound._songlib.freeSounds(); - retval->_sound._songlib = temp; - retval->_soundCmd->updateSfxState(&retval->_sound); + temp = s->_sound._songlib; + s->_sound.sfx_init(g_sci->getResMan(), s->sfx_init_flags, g_sci->_features->detectDoSoundType()); + s->sfx_init_flags = s->sfx_init_flags; + s->_sound._songlib.freeSounds(); + s->_sound._songlib = temp; + s->_soundCmd->updateSfxState(&retval->_sound); #endif - reconstruct_stack(retval); - retval->_segMan->reconstructScripts(retval); - retval->_segMan->reconstructClones(); - retval->_gameObj = s->_gameObj; - retval->script_000 = retval->_segMan->getScript(retval->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); - retval->gc_countdown = GC_INTERVAL - 1; + reconstruct_stack(s); + s->_segMan->reconstructScripts(s); + s->_segMan->reconstructClones(); + s->_gameObj = s->_gameObj; + s->script_000 = s->_segMan->getScript(s->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); + s->gc_countdown = GC_INTERVAL - 1; // Time state: - retval->last_wait_time = g_system->getMillis(); - retval->game_start_time = g_system->getMillis(); + s->last_wait_time = g_system->getMillis(); + s->game_start_time = g_system->getMillis(); - retval->successor = NULL; + s->restoring = false; #ifdef USE_OLD_MUSIC_FUNCTIONS - retval->_sound._it = NULL; - retval->_sound._flags = s->_sound._flags; - retval->_sound._song = NULL; - retval->_sound._suspended = s->_sound._suspended; - reconstruct_sounds(retval); + s->_sound._it = NULL; + s->_sound._flags = s->_sound._flags; + s->_sound._song = NULL; + s->_sound._suspended = s->_sound._suspended; + reconstruct_sounds(s); #else - retval->_soundCmd->reconstructPlayList(meta.savegame_version); + s->_soundCmd->reconstructPlayList(meta.savegame_version); #endif // Message state: - retval->_msgState = new MessageState(retval->_segMan); + s->_msgState = new MessageState(s->_segMan); #ifdef ENABLE_SCI32 if (g_sci->_gui32) { g_sci->_gui32->init(); } else { #endif - g_sci->_gui->resetEngineState(retval); + g_sci->_gui->resetEngineState(s); g_sci->_gui->init(g_sci->_features->usesOldGfxFunctions()); #ifdef ENABLE_SCI32 } #endif - s->successor = retval; // Set successor + s->restoring = true; script_abort_flag = 2; // Abort current game with replay s->shrinkStackToBase(); } -- cgit v1.2.3 From 3c82b6578fa3bd4b3d91c1933dd390581dbe08d1 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Sun, 6 Jun 2010 23:00:33 +0000 Subject: Now that EngineState is not deleted when loading games, we can move some more state-related variables to it, and remove several FIXME's about non-const global variables. Also, the entries in the data stack are now deleted when loading (fixes a memory leak - thanks to digitall for this). svn-id: r49465 --- engines/sci/engine/savegame.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/sci/engine/savegame.cpp') diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index 798f889460..9bf23dedf5 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -615,7 +615,7 @@ void DynMem::saveLoadWithSerializer(Common::Serializer &s) { void DataStack::saveLoadWithSerializer(Common::Serializer &s) { s.syncAsUint32LE(_capacity); if (s.isLoading()) { - //free(entries); + free(_entries); _entries = (reg_t *)calloc(_capacity, sizeof(reg_t)); } } @@ -915,7 +915,7 @@ void gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) { s->restoring = true; - script_abort_flag = 2; // Abort current game with replay + s->script_abort_flag = 2; // Abort current game with replay s->shrinkStackToBase(); } -- cgit v1.2.3