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

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Thu Dec 25 13:09:24 CET 2008


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

Log Message:
-----------
- Implemented the SAGA2 resource loader
- Some cleanup

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/saga.cpp
    scummvm/trunk/engines/saga/script.cpp

Modified: scummvm/trunk/engines/saga/resource.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource.cpp	2008-12-25 03:29:55 UTC (rev 35535)
+++ scummvm/trunk/engines/saga/resource.cpp	2008-12-25 12:09:24 UTC (rev 35536)
@@ -483,6 +483,10 @@
 				delete context->table[j].patchData;
 			}
 		}
+		if (_vm->isSaga2()) {
+			free(context->base);
+			free(context->groups);
+		}
 		free(context->table);
 	}
 	free(_contexts);

Modified: scummvm/trunk/engines/saga/resource.h
===================================================================
--- scummvm/trunk/engines/saga/resource.h	2008-12-25 03:29:55 UTC (rev 35535)
+++ scummvm/trunk/engines/saga/resource.h	2008-12-25 12:09:24 UTC (rev 35536)
@@ -85,6 +85,7 @@
 	ResourceData *table;
 	size_t count;
 	uint32 firstGroupOffset;	// SAGA2
+	ResourceData *base;			// SAGA2
 	ResourceData *groups;		// SAGA2
 
 	Common::File *getFile(ResourceData *resourceData) const {

Modified: scummvm/trunk/engines/saga/resource_hrs.cpp
===================================================================
--- scummvm/trunk/engines/saga/resource_hrs.cpp	2008-12-25 03:29:55 UTC (rev 35535)
+++ scummvm/trunk/engines/saga/resource_hrs.cpp	2008-12-25 12:09:24 UTC (rev 35536)
@@ -41,31 +41,59 @@
 namespace Saga {
 
 bool Resource_HRS::loadResContext_v2(ResourceContext *context, uint32 contextSize) {
-	ResourceData *resourceData = new ResourceData();
+	ResourceData *origin = new ResourceData();
 	uint32 firstGroupOffset;
-	//const int resDataSize = 4 + 4 + 4;
+	uint32 size;
+	int i, count;
 
 	context->file->seek(0, SEEK_SET);
 	
 	// Read head element (origin)
-	resourceData->id = context->file->readUint32BE();
-	resourceData->offset = context->file->readUint32LE();
-	resourceData->size = context->file->readUint32LE();
+	origin->id = context->file->readUint32BE();		// this is BE on purpose
+	origin->offset = context->file->readUint32LE();
+	origin->size = context->file->readUint32LE();
 
 	// Check if the file is valid
-	if (resourceData->id != MKID_BE('HRES')) {	// header
-		free(resourceData);
+	if (origin->id != MKID_BE('HRES')) {	// header
+		free(origin);
 		return false;
 	}
 
 	// Read first group offset
-	context->file->seek(resourceData->offset - 4, SEEK_SET);
+	context->file->seek(origin->offset - sizeof(uint32), SEEK_SET);
 	firstGroupOffset = context->file->readUint32LE();
 
 	// Allocate buffers for root/base node, groups and data
-	// TODO
+	context->base = (ResourceData *) calloc(origin->size, sizeof(*context->base));
+	size = origin->offset - firstGroupOffset - sizeof(uint32);
+	context->groups = (ResourceData *) calloc(size / sizeof(*context->groups), sizeof(*context->groups));
 
-	free(resourceData);
+	if (context->base == NULL || context->groups == NULL) {
+		free(origin);
+		return false;
+	}
+
+	// Read base
+	count = origin->size / sizeof(*context->base);
+	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->file->seek(firstGroupOffset, SEEK_SET);
+
+	// Read groups
+	count = size / sizeof(*context->groups);
+	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->count = origin->size / sizeof(*origin);
+
+	free(origin);
 	return true;
 }
 

Modified: scummvm/trunk/engines/saga/saga.cpp
===================================================================
--- scummvm/trunk/engines/saga/saga.cpp	2008-12-25 03:29:55 UTC (rev 35535)
+++ scummvm/trunk/engines/saga/saga.cpp	2008-12-25 12:09:24 UTC (rev 35536)
@@ -118,33 +118,32 @@
 		}
 	}
 
+	if (getGameId() == GID_ITE) {
+		delete _isoMap;
+		delete _puzzle;
+	}
+
+	delete _sndRes;
+	delete _events;
+
 	if (!isSaga2()) {
-		if (getGameId() == GID_ITE)
-			delete _puzzle;
-		delete _sndRes;
-		delete _events;
 		delete _font;
 		delete _sprite;
-		delete _anim;
-		delete _script;
-		delete _interface;
-		delete _actor;
-		delete _palanim;
 	}
 
+	delete _anim;
+	delete _script;
+	if (!isSaga2())
+		delete _interface;
+	delete _actor;
+	delete _palanim;
 	delete _scene;
-
-	if (getGameId() == GID_ITE) {
-		delete _isoMap;
-	}
-
 	delete _render;
 	delete _music;
 	delete _sound;
 	delete _driver;
 	delete _gfx;
 	delete _console;
-
 	delete _resource;
 }
 
@@ -185,29 +184,24 @@
 
 	// Initialize engine modules
 	// TODO: implement differences for SAGA2
-	if (!isSaga2()) {
-		_sndRes = new SndRes(this);
-	}
-
+	_sndRes = new SndRes(this);
 	_events = new Events(this);
 
 	if (!isSaga2()) {
 		_font = new Font(this);
 		_sprite = new Sprite(this);
-		_anim = new Anim(this);
 	}
 
+	_anim = new Anim(this);
 	_script = new Script(this);
 	_interface = new Interface(this); // requires script module
 	_scene = new Scene(this);
 	_actor = new Actor(this);
+	_palanim = new PalAnim(this);
 
-	if (!isSaga2()) {
-		_palanim = new PalAnim(this);
-		if (getGameId() == GID_ITE) {
-			_isoMap = new IsoMap(this);
-			_puzzle = new Puzzle(this);
-		}
+	if (getGameId() == GID_ITE) {
+		_isoMap = new IsoMap(this);
+		_puzzle = new Puzzle(this);
 	}
 
 	// System initialization

Modified: scummvm/trunk/engines/saga/script.cpp
===================================================================
--- scummvm/trunk/engines/saga/script.cpp	2008-12-25 03:29:55 UTC (rev 35535)
+++ scummvm/trunk/engines/saga/script.cpp	2008-12-25 12:09:24 UTC (rev 35536)
@@ -158,7 +158,8 @@
 	_globalVoiceLUT.freeMem();
 
 	freeModules();
-	free(_modules);
+	if (!_vm->isSaga2())	// TODO: remove this once the script module is working for SAGA2
+		free(_modules);
 
 	free(_commonBuffer);
 }


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