[Scummvm-cvs-logs] SF.net SVN: scummvm:[35539] scummvm/trunk/engines/saga

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Thu Dec 25 16:19:34 CET 2008


Revision: 35539
          http://scummvm.svn.sourceforge.net/scummvm/?rev=35539&view=rev
Author:   thebluegr
Date:     2008-12-25 15:19:33 +0000 (Thu, 25 Dec 2008)

Log Message:
-----------
SAGA2 HRS resources should be loaded correctly now

Modified Paths:
--------------
    scummvm/trunk/engines/saga/resource.cpp
    scummvm/trunk/engines/saga/resource.h
    scummvm/trunk/engines/saga/resource_hrs.cpp
    scummvm/trunk/engines/saga/script.cpp

Modified: scummvm/trunk/engines/saga/resource.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource.cpp	2008-12-25 15:16:53 UTC (rev 35538)
+++ scummvm/trunk/engines/saga/resource.cpp	2008-12-25 15:19:33 UTC (rev 35539)
@@ -484,8 +484,7 @@
 			}
 		}
 		if (_vm->isSaga2()) {
-			free(context->base);
-			free(context->groups);
+			free(context->categories);
 		}
 		free(context->table);
 	}

Modified: scummvm/trunk/engines/saga/resource.h
===================================================================
--- scummvm/trunk/engines/saga/resource.h	2008-12-25 15:16:53 UTC (rev 35538)
+++ scummvm/trunk/engines/saga/resource.h	2008-12-25 15:19:33 UTC (rev 35539)
@@ -84,9 +84,7 @@
 	bool isBigEndian;
 	ResourceData *table;
 	size_t count;
-	uint32 firstGroupOffset;	// SAGA2
-	ResourceData *base;			// SAGA2
-	ResourceData *groups;		// SAGA2
+	ResourceData *categories;		// SAGA2
 
 	Common::File *getFile(ResourceData *resourceData) const {
 		if (resourceData->patchData != NULL) {
@@ -109,6 +107,16 @@
 		return &table[resourceId];
 	}
 
+	// SAGA 2
+	int32 getEntryNum(uint32 id) {
+		for (int32 i = 0; i < (int32)count; i++) {
+			if (table[i].id == id) {
+				return i;
+			}
+		}
+		return -1;
+	}
+
 };
 
 struct MetaResource {
@@ -146,8 +154,7 @@
 	virtual void loadGlobalResources(int chapter, int actorsEntrance) = 0;
 
 	ResourceContext *getContext(uint16 fileType, int serial = 0) {
-		int i;
-		for (i = 0; i < _contextsCount; i++) {
+		for (int i = 0; i < _contextsCount; i++) {
 			if ((_contexts[i].fileType & fileType) && _contexts[i].serial == serial) {
 				return &_contexts[i];
 			}

Modified: scummvm/trunk/engines/saga/resource_hrs.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource_hrs.cpp	2008-12-25 15:16:53 UTC (rev 35538)
+++ scummvm/trunk/engines/saga/resource_hrs.cpp	2008-12-25 15:19:33 UTC (rev 35539)
@@ -42,10 +42,12 @@
 
 bool Resource_HRS::loadResContext_v2(ResourceContext *context, uint32 contextSize) {
 	ResourceData *origin = new ResourceData();
-	uint32 firstGroupOffset;
-	uint32 size;
+	uint32 firstEntryOffset;
+	uint32 tableSize;
 	int i, count;
+	const uint32 resourceSize = 4 + 4 + 4;	// id, size, offset
 
+	debug(3, "Context %s", context->fileName);
 	context->file->seek(0, SEEK_SET);
 	
 	// Read head element (origin)
@@ -59,39 +61,41 @@
 		return false;
 	}
 
-	// Read first group offset
+	// Read offset of first entry
 	context->file->seek(origin->offset - sizeof(uint32), SEEK_SET);
-	firstGroupOffset = context->file->readUint32LE();
+	firstEntryOffset = context->file->readUint32LE();
 
-	// Allocate buffers for root/base node, groups and data
-	context->base = (ResourceData *) calloc(origin->size / sizeof(*context->base), sizeof(*context->base));
-	size = origin->offset - firstGroupOffset - sizeof(uint32);
-	context->groups = (ResourceData *) calloc(size / sizeof(*context->groups), sizeof(*context->groups));
+	// Allocate buffers for table, categories and data
+	context->categories = (ResourceData *) calloc(origin->size / resourceSize, sizeof(*context->categories));
+	tableSize = origin->offset - firstEntryOffset - sizeof(uint32);
+	context->table = (ResourceData *) calloc(tableSize / resourceSize, sizeof(*context->table));
 
-	if (context->base == NULL || context->groups == NULL) {
+	if (context->categories == NULL || context->table == NULL) {
 		free(origin);
 		return false;
 	}
 
-	// Read base
-	count = origin->size / sizeof(*context->base);
+	// Read categories
+	count = origin->size / resourceSize;
 	for (i = 0; i < count; i++) {
-		context->base[i].id = context->file->readUint32LE();
-		context->base[i].offset = context->file->readUint32LE();
-		context->base[i].size = context->file->readUint32LE();
+		context->categories[i].id = context->file->readUint32BE();
+		context->categories[i].offset = context->file->readUint32LE();
+		context->categories[i].size = context->file->readUint32LE();
+		debug(3, "Category entry: id %u, offset %u, size %u", context->categories[i].id, context->categories[i].offset, context->categories[i].size);
 	}
 
-	context->file->seek(firstGroupOffset, SEEK_SET);
+	context->file->seek(firstEntryOffset, SEEK_SET);
 
-	// Read groups
-	count = size / sizeof(*context->groups);
+	// Read table entries
+	count = tableSize / resourceSize;
 	for (i = 0; i < count; i++) {
-		context->groups[i].id = context->file->readUint32LE();
-		context->groups[i].offset = context->file->readUint32LE();
-		context->groups[i].size = context->file->readUint32LE();
+		context->table[i].id = context->file->readUint32BE();
+		context->table[i].offset = context->file->readUint32LE();
+		context->table[i].size = context->file->readUint32LE();
+		debug(3, "Table entry: id %u, offset %u, size %u", context->table[i].id, context->table[i].offset, context->table[i].size);
 	}
 
-	context->count = origin->size / sizeof(*origin);
+	context->count = tableSize / resourceSize;
 
 	free(origin);
 	return true;

Modified: scummvm/trunk/engines/saga/script.cpp
===================================================================
--- scummvm/trunk/engines/saga/script.cpp	2008-12-25 15:16:53 UTC (rev 35538)
+++ scummvm/trunk/engines/saga/script.cpp	2008-12-25 15:19:33 UTC (rev 35539)
@@ -85,15 +85,30 @@
 		error("Script::Script() resource context not found");
 	}
 
+	uint32 scriptResourceId = 0;
+	
+	if (!_vm->isSaga2()) {
+		scriptResourceId = _vm->getResourceDescription()->moduleLUTResourceId;
+		debug(3, "Loading module LUT from resource %i", scriptResourceId);
+		_vm->_resource->loadResource(resourceContext, scriptResourceId, resourcePointer, resourceLength);
+	} else {
+		uint32 saga2DataSegId = MKID_BE('__DA');
+		int32 scr = _scriptContext->getEntryNum(saga2DataSegId);
+		if (scr < 0)
+			error("Unable to locate the script's data segment");
+		scriptResourceId = (uint32)scr;
+		debug(3, "Loading module LUT from resource %i", scriptResourceId);
+		_vm->_resource->loadResource(_scriptContext, scriptResourceId, resourcePointer, resourceLength);
+
+		//uint32 saga2ExportSegId = MKID_BE('_EXP');
+		// TODO: SAGA2 script export segment
+	}
+
 	// Do nothing for SAGA2 games for now
 	if (_vm->isSaga2()) {
 		return;
 	}
 
-	debug(3, "Loading module LUT from resource %i", _vm->getResourceDescription()->moduleLUTResourceId);
-	_vm->_resource->loadResource(resourceContext, _vm->getResourceDescription()->moduleLUTResourceId, resourcePointer, resourceLength);
-
-
 	// Create logical script LUT from resource
 	if (resourceLength % S_LUT_ENTRYLEN_ITECD == 0) {
 		_modulesLUTEntryLen = S_LUT_ENTRYLEN_ITECD;


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