[Scummvm-cvs-logs] SF.net SVN: scummvm:[44806] scummvm/trunk/engines/sci/engine
fingolfin at users.sourceforge.net
fingolfin at users.sourceforge.net
Fri Oct 9 00:03:55 CEST 2009
Revision: 44806
http://scummvm.svn.sourceforge.net/scummvm/?rev=44806&view=rev
Author: fingolfin
Date: 2009-10-08 22:03:55 +0000 (Thu, 08 Oct 2009)
Log Message:
-----------
SCI: Turn reconstruct_scripts into SegManager::reconstructScripts
Modified Paths:
--------------
scummvm/trunk/engines/sci/engine/savegame.cpp
scummvm/trunk/engines/sci/engine/seg_manager.h
Modified: scummvm/trunk/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/savegame.cpp 2009-10-08 21:39:33 UTC (rev 44805)
+++ scummvm/trunk/engines/sci/engine/savegame.cpp 2009-10-08 22:03:55 UTC (rev 44806)
@@ -572,91 +572,79 @@
}
}
-// FIXME: The following should likely become a SegManager method
-static void reconstruct_scripts(EngineState *s, SegManager *self) {
+void SegManager::reconstructScripts(EngineState *s) {
uint i;
SegmentObj *mobj;
- for (i = 0; i < self->_heap.size(); i++) {
- if (self->_heap[i]) {
- mobj = self->_heap[i];
- switch (mobj->getType()) {
- case SEG_TYPE_SCRIPT: {
- Script *scr = (Script *)mobj;
+ for (i = 0; i < _heap.size(); i++) {
+ mobj = _heap[i];
+ if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT)
+ continue;
- // FIXME: Unify this code with script_instantiate_*
- load_script(s, scr);
- scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(s->_segMan->_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);
- 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 += 3;
- }
- scr->_codeBlocks.clear();
+ Script *scr = (Script *)mobj;
- ObjMap::iterator it;
- const ObjMap::iterator end = scr->_objects.end();
- for (it = scr->_objects.begin(); it != end; ++it) {
- byte *data = scr->_buf + it->_value._pos.offset;
- it->_value.base = scr->_buf;
- it->_value.base_obj = data;
- }
- break;
+ // FIXME: Unify this code with script_instantiate_* ?
+ load_script(s, scr);
+ 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);
+ s->_segMan->scriptRelocateExportsSci11(i);
}
- default:
- break;
- }
+ } 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 += 3;
}
+ scr->_codeBlocks.clear();
+
+ ObjMap::iterator it;
+ const ObjMap::iterator end = scr->_objects.end();
+ for (it = scr->_objects.begin(); it != end; ++it) {
+ byte *data = scr->_buf + it->_value._pos.offset;
+ it->_value.base = scr->_buf;
+ it->_value.base_obj = data;
+ }
}
- for (i = 0; i < self->_heap.size(); i++) {
- if (self->_heap[i]) {
- mobj = self->_heap[i];
- switch (mobj->getType()) {
- case SEG_TYPE_SCRIPT: {
- Script *scr = (Script *)mobj;
+ for (i = 0; i < _heap.size(); i++) {
+ mobj = _heap[i];
+ if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT)
+ continue;
- ObjMap::iterator it;
- const ObjMap::iterator end = scr->_objects.end();
- for (it = scr->_objects.begin(); it != end; ++it) {
- byte *data = scr->_buf + it->_value._pos.offset;
+ Script *scr = (Script *)mobj;
- 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 ));
+ // 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._pos.offset;
- it->_value.base_method = funct_area;
- it->_value.base_vars = prop_area;
- } else {
- int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
- Object *base_obj;
+ 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 ));
- base_obj = s->_segMan->getObject(it->_value.getSpeciesSelector());
+ it->_value.base_method = funct_area;
+ it->_value.base_vars = prop_area;
+ } else {
+ int funct_area = READ_LE_UINT16(data + SCRIPT_FUNCTAREAPTR_OFFSET);
+ Object *base_obj;
- if (!base_obj) {
- 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.variable_names_nr = base_obj->_variables.size();
- it->_value.base_obj = base_obj->base_obj;
+ base_obj = s->_segMan->getObject(it->_value.getSpeciesSelector());
- it->_value.base_method = (uint16 *)(data + funct_area);
- it->_value.base_vars = (uint16 *)(data + it->_value.variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
- }
+ if (!base_obj) {
+ warning("Object without a base class: Script %d, index %d (reg address %04x:%04x",
+ scr->_nr, i, PRINT_REG(it->_value.getSpeciesSelector()));
+ continue;
}
- break;
+ it->_value.variable_names_nr = base_obj->_variables.size();
+ it->_value.base_obj = base_obj->base_obj;
+
+ it->_value.base_method = (uint16 *)(data + funct_area);
+ it->_value.base_vars = (uint16 *)(data + it->_value.variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
}
- default:
- break;
- }
}
}
}
@@ -756,7 +744,7 @@
_reset_graphics_input(retval);
reconstruct_stack(retval);
- reconstruct_scripts(retval, retval->_segMan);
+ retval->_segMan->reconstructScripts(retval);
retval->_segMan->reconstructClones();
retval->game_obj = s->game_obj;
retval->script_000 = retval->_segMan->getScript(retval->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD));
Modified: scummvm/trunk/engines/sci/engine/seg_manager.h
===================================================================
--- scummvm/trunk/engines/sci/engine/seg_manager.h 2009-10-08 21:39:33 UTC (rev 44805)
+++ scummvm/trunk/engines/sci/engine/seg_manager.h 2009-10-08 22:03:55 UTC (rev 44806)
@@ -80,6 +80,11 @@
void deallocateScript(int script_nr);
/**
+ * Reconstructs scripts. Used when restoring saved games
+ */
+ void reconstructScripts(EngineState *s);
+
+ /**
* Validate whether the specified public function is exported by
* the script in the specified segment.
* @param pubfunct Index of the function to validate
@@ -106,6 +111,7 @@
*/
SegmentId getScriptSegment(int script_nr, ScriptLoadType load);
+ // TODO: document this
reg_t lookupScriptExport(int script_nr, int export_index) {
SegmentId seg = getScriptSegment(script_nr, SCRIPT_GET_DONT_LOAD);
return make_reg(seg, validateExportFunc(export_index, seg));
@@ -169,16 +175,11 @@
*/
Clone *allocateClone(reg_t *addr);
-
/**
* Reconstructs clones. Used when restoring saved games
*/
void reconstructClones();
- // 3. Objects (static, from Scripts, and dynmic, from Clones)
-
-
-
// 4. Stack
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list