SCI: Turn reconstruct_scripts into SegManager::reconstructScripts

svn-id: r44806
This commit is contained in:
Max Horn 2009-10-08 22:03:55 +00:00
parent 860f7ce39b
commit 0c457be0fb
2 changed files with 63 additions and 74 deletions

View file

@ -572,90 +572,78 @@ static void load_script(EngineState *s, Script *scr) {
} }
} }
// FIXME: The following should likely become a SegManager method void SegManager::reconstructScripts(EngineState *s) {
static void reconstruct_scripts(EngineState *s, SegManager *self) {
uint i; uint i;
SegmentObj *mobj; SegmentObj *mobj;
for (i = 0; i < self->_heap.size(); i++) { for (i = 0; i < _heap.size(); i++) {
if (self->_heap[i]) { mobj = _heap[i];
mobj = self->_heap[i]; if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT)
switch (mobj->getType()) { continue;
case SEG_TYPE_SCRIPT: {
Script *scr = (Script *)mobj;
// FIXME: Unify this code with script_instantiate_* Script *scr = (Script *)mobj;
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();
ObjMap::iterator it; // FIXME: Unify this code with script_instantiate_* ?
const ObjMap::iterator end = scr->_objects.end(); load_script(s, scr);
for (it = scr->_objects.begin(); it != end; ++it) { scr->_localsBlock = (scr->_localsSegment == 0) ? NULL : (LocalVariables *)(_heap[scr->_localsSegment]);
byte *data = scr->_buf + it->_value._pos.offset; if (getSciVersion() >= SCI_VERSION_1_1) {
it->_value.base = scr->_buf; scr->_exportTable = 0;
it->_value.base_obj = data; scr->_synonyms = 0;
} if (READ_LE_UINT16(scr->_buf + 6) > 0) {
break; 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++) { for (i = 0; i < _heap.size(); i++) {
if (self->_heap[i]) { mobj = _heap[i];
mobj = self->_heap[i]; if (!mobj || mobj->getType() != SEG_TYPE_SCRIPT)
switch (mobj->getType()) { continue;
case SEG_TYPE_SCRIPT: {
Script *scr = (Script *)mobj;
ObjMap::iterator it; Script *scr = (Script *)mobj;
const ObjMap::iterator end = scr->_objects.end();
for (it = scr->_objects.begin(); it != end; ++it) {
byte *data = scr->_buf + it->_value._pos.offset;
if (getSciVersion() >= SCI_VERSION_1_1) { // FIXME: Unify this code with Script::scriptObjInit ?
uint16 *funct_area = (uint16 *) (scr->_buf + READ_LE_UINT16( data + 6 )); ObjMap::iterator it;
uint16 *prop_area = (uint16 *) (scr->_buf + READ_LE_UINT16( data + 4 )); 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; if (getSciVersion() >= SCI_VERSION_1_1) {
it->_value.base_vars = prop_area; uint16 *funct_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 6 ));
} else { uint16 *prop_area = (uint16 *)(scr->_buf + READ_LE_UINT16( data + 4 ));
int funct_area = READ_LE_UINT16( data + SCRIPT_FUNCTAREAPTR_OFFSET );
Object *base_obj;
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) { base_obj = s->_segMan->getObject(it->_value.getSpeciesSelector());
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;
it->_value.base_method = (uint16 *)(data + funct_area); if (!base_obj) {
it->_value.base_vars = (uint16 *)(data + it->_value.variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET); 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;
default:
break; it->_value.base_method = (uint16 *)(data + funct_area);
it->_value.base_vars = (uint16 *)(data + it->_value.variable_names_nr * 2 + SCRIPT_SELECTOR_OFFSET);
} }
} }
} }
@ -756,7 +744,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
_reset_graphics_input(retval); _reset_graphics_input(retval);
reconstruct_stack(retval); reconstruct_stack(retval);
reconstruct_scripts(retval, retval->_segMan); retval->_segMan->reconstructScripts(retval);
retval->_segMan->reconstructClones(); retval->_segMan->reconstructClones();
retval->game_obj = s->game_obj; retval->game_obj = s->game_obj;
retval->script_000 = retval->_segMan->getScript(retval->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD)); retval->script_000 = retval->_segMan->getScript(retval->_segMan->getScriptSegment(0, SCRIPT_GET_DONT_LOAD));

View file

@ -79,6 +79,11 @@ public:
*/ */
void deallocateScript(int script_nr); 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 * Validate whether the specified public function is exported by
* the script in the specified segment. * the script in the specified segment.
@ -106,6 +111,7 @@ public:
*/ */
SegmentId getScriptSegment(int script_nr, ScriptLoadType load); SegmentId getScriptSegment(int script_nr, ScriptLoadType load);
// TODO: document this
reg_t lookupScriptExport(int script_nr, int export_index) { reg_t lookupScriptExport(int script_nr, int export_index) {
SegmentId seg = getScriptSegment(script_nr, SCRIPT_GET_DONT_LOAD); SegmentId seg = getScriptSegment(script_nr, SCRIPT_GET_DONT_LOAD);
return make_reg(seg, validateExportFunc(export_index, seg)); return make_reg(seg, validateExportFunc(export_index, seg));
@ -169,16 +175,11 @@ public:
*/ */
Clone *allocateClone(reg_t *addr); Clone *allocateClone(reg_t *addr);
/** /**
* Reconstructs clones. Used when restoring saved games * Reconstructs clones. Used when restoring saved games
*/ */
void reconstructClones(); void reconstructClones();
// 3. Objects (static, from Scripts, and dynmic, from Clones)
// 4. Stack // 4. Stack
/** /**