aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/resource_rsc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/resource_rsc.cpp')
-rw-r--r--engines/saga/resource_rsc.cpp166
1 files changed, 83 insertions, 83 deletions
diff --git a/engines/saga/resource_rsc.cpp b/engines/saga/resource_rsc.cpp
index 035db7723a..7d5753ea07 100644
--- a/engines/saga/resource_rsc.cpp
+++ b/engines/saga/resource_rsc.cpp
@@ -52,6 +52,12 @@ struct MacResource {
byte attr;
int32 dataOffset;
byte name[255];
+ MacResource() : id(0), nameOffset(0), attr(0), dataOffset(0) {
+ name[0] = 0;
+ }
+};
+
+class MacResourceArray : public Common::Array<MacResource> {
};
struct MacResType {
@@ -59,27 +65,17 @@ struct MacResType {
int16 items;
int16 maxItemId;
int16 offset;
- MacResource *resources;
+ MacResourceArray resources;
+ MacResType() : id(0), items(0), maxItemId(0), offset(0) {
+ }
};
-#define ID_MIDI MKID_BE('Midi')
-
-uint32 Resource_RSC::convertResourceId(uint32 resourceId) {
-
- if (_vm->isMacResources()) {
- if (resourceId > 1537) {
- return resourceId - 2;
- } else {
- if (resourceId == 1535 || resourceId == 1536) {
- error("Wrong resource number %d for Mac ITE", resourceId);
- }
- }
- }
+class MacResTypeArray : public Common::Array<MacResType> {
+};
- return resourceId;
-}
+#define ID_MIDI MKID_BE('Midi')
-bool Resource_RSC::loadMacContext(ResourceContext *context) {
+bool ResourceContext_RSC::loadMac() {
int32 macDataSize, macDataSizePad;
int32 macResSize, macResSizePad;
int32 macResOffset;
@@ -90,123 +86,127 @@ bool Resource_RSC::loadMacContext(ResourceContext *context) {
uint32 macDataOffset;
MacResMap macResMap;
- MacResType *macResTypes;
+ MacResTypeArray macResTypes;
- MacResType *macResType;
- MacResource *macResource;
- int i, j;
byte macNameLen;
bool notSagaContext = false;
- if (context->fileSize < RSC_MIN_FILESIZE + MAC_BINARY_HEADER_SIZE) {
+ if (_fileSize < RSC_MIN_FILESIZE + MAC_BINARY_HEADER_SIZE) {
return false;
}
- if (context->file->readByte() != 0) {
+ if (_file.readByte() != 0) {
return false;
}
- context->file->readByte(); //MAX Name Len
- context->file->seek(74);
- if (context->file->readByte() != 0) {
+ _file.readByte(); //MAX Name Len
+ _file.seek(74);
+ if (_file.readByte() != 0) {
return false;
}
- context->file->seek(82);
- if (context->file->readByte() != 0) {
+ _file.seek(82);
+ if (_file.readByte() != 0) {
return false;
}
- macDataSize = context->file->readSint32BE();
- macResSize = context->file->readSint32BE();
+ macDataSize = _file.readSint32BE();
+ macResSize = _file.readSint32BE();
macDataSizePad = (((macDataSize + 127) >> 7) << 7);
macResSizePad = (((macResSize + 127) >> 7) << 7);
macResOffset = MAC_BINARY_HEADER_SIZE + macDataSizePad;
- context->file->seek(macResOffset);
+ _file.seek(macResOffset);
- macDataOffset = context->file->readUint32BE() + macResOffset;
- macMapOffset = context->file->readUint32BE() + macResOffset;
- macDataLength = context->file->readUint32BE();
- macMapLength = context->file->readUint32BE();
+ macDataOffset = _file.readUint32BE() + macResOffset;
+ macMapOffset = _file.readUint32BE() + macResOffset;
+ macDataLength = _file.readUint32BE();
+ macMapLength = _file.readUint32BE();
- if (macDataOffset >= (uint)context->fileSize || macMapOffset >= (uint)context->fileSize ||
- macDataLength + macMapLength > (uint)context->fileSize) {
+ if (macDataOffset >= (uint)_fileSize || macMapOffset >= (uint)_fileSize ||
+ macDataLength + macMapLength > (uint)_fileSize) {
return false;
}
- context->file->seek(macMapOffset + 22);
+ _file.seek(macMapOffset + 22);
- macResMap.resAttr = context->file->readUint16BE();
- macResMap.typeOffset = context->file->readUint16BE();
- macResMap.nameOffset = context->file->readUint16BE();
- macResMap.numTypes = context->file->readUint16BE();
+ macResMap.resAttr = _file.readUint16BE();
+ macResMap.typeOffset = _file.readUint16BE();
+ macResMap.nameOffset = _file.readUint16BE();
+ macResMap.numTypes = _file.readUint16BE();
macResMap.numTypes++;
- context->file->seek(macMapOffset + macResMap.typeOffset + 2);
+ _file.seek(macMapOffset + macResMap.typeOffset + 2);
- macResTypes = (MacResType *)calloc(macResMap.numTypes, sizeof(*macResTypes));
+ macResTypes.resize(macResMap.numTypes);
- for (i = macResMap.numTypes, macResType = macResTypes; i > 0; i--, macResType++) {
- macResType->id = context->file->readUint32BE();
- macResType->items = context->file->readUint16BE();
- macResType->offset = context->file->readUint16BE();
- macResType->items++;
- macResType->resources = (MacResource*)calloc(macResType->items, sizeof(*macResType->resources));
+ for (MacResTypeArray::iterator k = macResTypes.begin(); k != macResTypes.end(); ++k) {
+ k->id = _file.readUint32BE();
+ k->items = _file.readUint16BE();
+ k->offset = _file.readUint16BE();
+ k->items++;
+ k->resources.resize(k->items);
}
- for (i = macResMap.numTypes, macResType = macResTypes; i > 0; i--, macResType++) {
- context->file->seek(macResType->offset + macMapOffset + macResMap.typeOffset);
+ for (MacResTypeArray::iterator k = macResTypes.begin(); k != macResTypes.end(); ++k) {
+ _file.seek(k->offset + macMapOffset + macResMap.typeOffset);
- for (j = macResType->items, macResource = macResType->resources; j > 0; j--, macResource++) {
- macResource->id = context->file->readUint16BE();
- macResource->nameOffset = context->file->readUint16BE();
- macResource->dataOffset = context->file->readUint32BE();
- macResSize = context->file->readUint32BE();
+ for (MacResourceArray::iterator j = k->resources.begin(); j != k->resources.end(); ++j) {
+ j->id = _file.readUint16BE();
+ j->nameOffset = _file.readUint16BE();
+ j->dataOffset = _file.readUint32BE();
+ macResSize = _file.readUint32BE();
- macResource->attr = macResource->dataOffset >> 24;
- macResource->dataOffset &= 0xFFFFFF;
- if (macResource->id > macResType->maxItemId) {
- macResType->maxItemId = macResource->id;
+ j->attr = j->dataOffset >> 24;
+ j->dataOffset &= 0xFFFFFF;
+ if (j->id > k->maxItemId) {
+ k->maxItemId = j->id;
}
}
- for (j = macResType->items, macResource = macResType->resources; j > 0; j--, macResource++) {
- if (macResource->nameOffset != -1) {
- context->file->seek(macResource->nameOffset + macMapOffset + macResMap.nameOffset);
- macNameLen = context->file->readByte();
- context->file->read(macResource->name, macNameLen);
+ for (MacResourceArray::iterator j = k->resources.begin(); j != k->resources.end(); ++j) {
+ if (j->nameOffset != -1) {
+ _file.seek(j->nameOffset + macMapOffset + macResMap.nameOffset);
+ macNameLen = _file.readByte();
+ _file.read(j->name, macNameLen);
}
}
}
-//
- for (i = macResMap.numTypes, macResType = macResTypes; i > 0; i--, macResType++) {
+ //
+ for (MacResTypeArray::iterator k = macResTypes.begin(); k != macResTypes.end(); ++k) {
//getting offsets & sizes of midi
- if (((context->fileType & GAME_MUSICFILE_GM) > 0) && (macResType->id == ID_MIDI)) {
-
- context->count = macResType->maxItemId + 1;
- context->table = (ResourceData *)calloc(context->count, sizeof(*context->table));
- for (j = macResType->items, macResource = macResType->resources; j > 0; j--, macResource++) {
- context->file->seek(macDataOffset + macResource->dataOffset);
- context->table[macResource->id].size = context->file->readUint32BE();
- context->table[macResource->id].offset = context->file->pos();
+ if (((_fileType & GAME_MUSICFILE_GM) > 0) && (k->id == ID_MIDI)) {
+
+ _table.resize(k->maxItemId + 1);
+ for (MacResourceArray::iterator j = k->resources.begin(); j != k->resources.end(); ++j) {
+ _file.seek(macDataOffset + j->dataOffset);
+ _table[j->id].size = _file.readUint32BE();
+ _table[j->id].offset = _file.pos();
}
notSagaContext = true;
break;
}
}
-//free
- for (i = 0; i < macResMap.numTypes; i++) {
- free(macResTypes[i].resources);
- }
- free(macResTypes);
-
- if ((!notSagaContext) && (!loadResContext(context, MAC_BINARY_HEADER_SIZE, macDataSize))) {
+ if ((!notSagaContext) && (!loadRes(MAC_BINARY_HEADER_SIZE, macDataSize))) {
return false;
}
return true;
}
+uint32 Resource_RSC::convertResourceId(uint32 resourceId) {
+
+ if (_vm->isMacResources()) {
+ if (resourceId > 1537) {
+ return resourceId - 2;
+ } else {
+ if (resourceId == 1535 || resourceId == 1536) {
+ error("Wrong resource number %d for Mac ITE", resourceId);
+ }
+ }
+ }
+
+ return resourceId;
+}
} // End of namespace Saga