aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/game.cpp')
-rw-r--r--engines/sci/engine/game.cpp58
1 files changed, 26 insertions, 32 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp
index 1fa0e03d4c..6872039c89 100644
--- a/engines/sci/engine/game.cpp
+++ b/engines/sci/engine/game.cpp
@@ -197,9 +197,9 @@ int create_class_table_sci11(EngineState *s) {
Resource *vocab996 = s->resmgr->findResource(ResourceId(kResourceTypeVocab, 996), 1);
if (!vocab996)
- s->_classtable.resize(20);
+ s->seg_manager->_classtable.resize(20);
else
- s->_classtable.resize(vocab996->size >> 2);
+ s->seg_manager->_classtable.resize(vocab996->size >> 2);
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
Resource *heap = s->resmgr->findResource(ResourceId(kResourceTypeHeap, scriptnr), 0);
@@ -213,19 +213,19 @@ int create_class_table_sci11(EngineState *s) {
while (READ_LE_UINT16((byte*)seeker_ptr) == SCRIPT_OBJECT_MAGIC_NUMBER) {
if (READ_LE_UINT16((byte*)seeker_ptr + 14) & SCRIPT_INFO_CLASS) {
classnr = READ_LE_UINT16((byte*)seeker_ptr + 10);
- if (classnr >= (int)s->_classtable.size()) {
+ if (classnr >= (int)s->seg_manager->_classtable.size()) {
if (classnr >= SCRIPT_MAX_CLASSTABLE_SIZE) {
warning("Invalid class number 0x%x in script.%d(0x%x), offset %04x",
classnr, scriptnr, scriptnr, seeker_offset);
return 1;
}
- s->_classtable.resize(classnr + 1); // Adjust maximum number of entries
+ s->seg_manager->_classtable.resize(classnr + 1); // Adjust maximum number of entries
}
- s->_classtable[classnr].reg.offset = seeker_offset;
- s->_classtable[classnr].reg.segment = 0;
- s->_classtable[classnr].script = scriptnr;
+ s->seg_manager->_classtable[classnr].reg.offset = seeker_offset;
+ s->seg_manager->_classtable[classnr].reg.segment = 0;
+ s->seg_manager->_classtable[classnr].script = scriptnr;
}
seeker_ptr += READ_LE_UINT16((byte*)seeker_ptr + 2) * 2;
@@ -246,11 +246,12 @@ static int create_class_table_sci0(EngineState *s) {
int magic_offset; // For strange scripts in older SCI versions
Resource *vocab996 = s->resmgr->findResource(ResourceId(kResourceTypeVocab, 996), 1);
+ SciVersion version = s->_version; // for the offset defines
if (!vocab996)
- s->_classtable.resize(20);
+ s->seg_manager->_classtable.resize(20);
else
- s->_classtable.resize(vocab996->size >> 2);
+ s->seg_manager->_classtable.resize(vocab996->size >> 2);
for (scriptnr = 0; scriptnr < 1000; scriptnr++) {
int objtype = 0;
@@ -270,7 +271,7 @@ static int create_class_table_sci0(EngineState *s) {
break;
seeker += (int16)READ_LE_UINT16(script->data + seeker + 2);
if (seeker <= lastseeker) {
- s->_classtable.clear();
+ s->seg_manager->_classtable.clear();
error("Script version is invalid");
}
}
@@ -281,7 +282,7 @@ static int create_class_table_sci0(EngineState *s) {
seeker -= SCRIPT_OBJECT_MAGIC_OFFSET; // Adjust position; script home is base +8 bytes
classnr = (int16)READ_LE_UINT16(script->data + seeker + 4 + SCRIPT_SPECIES_OFFSET);
- if (classnr >= (int)s->_classtable.size()) {
+ if (classnr >= (int)s->seg_manager->_classtable.size()) {
if (classnr >= SCRIPT_MAX_CLASSTABLE_SIZE) {
warning("Invalid class number 0x%x in script.%d(0x%x), offset %04x",
@@ -289,7 +290,7 @@ static int create_class_table_sci0(EngineState *s) {
return 1;
}
- s->_classtable.resize(classnr + 1); // Adjust maximum number of entries
+ s->seg_manager->_classtable.resize(classnr + 1); // Adjust maximum number of entries
}
// Map the class ID to the script the corresponding class is contained in
@@ -303,9 +304,9 @@ static int create_class_table_sci0(EngineState *s) {
if (sugg_script == -1 || scriptnr == sugg_script /*|| !s->_classtable[classnr].reg.segment*/) {
// Now set the home script of the class
- s->_classtable[classnr].reg.offset = seeker + 4 - magic_offset;
- s->_classtable[classnr].reg.segment = 0;
- s->_classtable[classnr].script = scriptnr;
+ s->seg_manager->_classtable[classnr].reg.offset = seeker + 4 - magic_offset;
+ s->seg_manager->_classtable[classnr].reg.segment = 0;
+ s->seg_manager->_classtable[classnr].script = scriptnr;
}
seeker += SCRIPT_OBJECT_MAGIC_OFFSET; // Re-adjust position
@@ -326,6 +327,7 @@ int script_init_engine(EngineState *s) {
int result;
s->kernel_opt_flags = 0;
+ s->seg_manager = new SegManager(s->resmgr, s->_version);
if (s->_version >= SCI_VERSION_1_1)
result = create_class_table_sci11(s);
@@ -337,10 +339,9 @@ int script_init_engine(EngineState *s) {
return 1;
}
- s->seg_manager = new SegManager(s->_version >= SCI_VERSION_1_1);
s->gc_countdown = GC_INTERVAL - 1;
- SegmentId script_000_segment = script_get_segment(s, 0, SCRIPT_GET_LOCK);
+ SegmentId script_000_segment = s->seg_manager->getSegment(0, SCRIPT_GET_LOCK);
if (script_000_segment <= 0) {
debug(2, "Failed to instantiate script.000");
@@ -398,7 +399,8 @@ void internal_stringfrag_strncpy(EngineState *s, reg_t *dest, reg_t *src, int le
void script_free_vm_memory(EngineState *s) {
debug(2, "Freeing VM memory");
- s->_classtable.clear();
+ if (s->seg_manager)
+ s->seg_manager->_classtable.clear();
// Close all opened file handles
s->_fileHandles.clear();
@@ -433,14 +435,13 @@ void script_free_breakpoints(EngineState *s) {
int game_init(EngineState *s) {
// FIXME Use new VM instantiation code all over the place"
- reg_t game_obj; // Address of the game object
DataStack *stack;
stack = s->seg_manager->allocateStack(VM_STACK_SIZE, &s->stack_segment);
s->stack_base = stack->entries;
s->stack_top = s->stack_base + VM_STACK_SIZE;
- if (!script_instantiate(s, 0)) {
+ if (!script_instantiate(s->resmgr, s->seg_manager, s->_version, 0)) {
warning("game_init(): Could not instantiate script 0");
return 1;
}
@@ -473,20 +474,11 @@ int game_init(EngineState *s) {
srand(g_system->getMillis()); // Initialize random number generator
// script_dissect(0, s->_selectorNames);
- game_obj = script_lookup_export(s, 0, 0);
// The first entry in the export table of script 0 points to the game object
+ s->game_obj = script_lookup_export(s->seg_manager, 0, 0);
+ s->_gameName = obj_get_name(s->seg_manager, s->_version, s->game_obj);
- const char *tmp = obj_get_name(s, game_obj);
-
- if (!tmp) {
- warning("Error: script.000, export 0 (%04x:%04x) does not yield an object with a name -> sanity check failed", PRINT_REG(game_obj));
- return 1;
- }
- s->_gameName = tmp;
-
- debug(2, " \"%s\" at %04x:%04x", s->_gameName.c_str(), PRINT_REG(game_obj));
-
- s->game_obj = game_obj;
+ debug(2, " \"%s\" at %04x:%04x", s->_gameName.c_str(), PRINT_REG(s->game_obj));
// Mark parse tree as unused
s->parser_nodes[0].type = kParseTreeLeafNode;
@@ -512,7 +504,9 @@ int game_exit(EngineState *s) {
game_init_sound(s, SFX_STATE_FLAG_NOSOUND);
}
+ s->seg_manager->_classtable.clear();
delete s->seg_manager;
+ s->seg_manager = 0;
s->_synonyms.clear();