[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