aboutsummaryrefslogtreecommitdiff
path: root/engines/saga/resource_hrs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/saga/resource_hrs.cpp')
-rw-r--r--engines/saga/resource_hrs.cpp45
1 files changed, 36 insertions, 9 deletions
diff --git a/engines/saga/resource_hrs.cpp b/engines/saga/resource_hrs.cpp
index 09da9cf0bb..ba58830269 100644
--- a/engines/saga/resource_hrs.cpp
+++ b/engines/saga/resource_hrs.cpp
@@ -39,13 +39,35 @@
namespace Saga {
-void readElement(Common::File &file, Saga::ResourceData &element) {
- element.id = file.readUint32BE();
- element.offset = file.readUint32LE();
- element.size = file.readUint32LE();
+void ResourceContext_HRS::readCategory(ResourceData &element) {
+ element.id = _file.readUint32BE();
+ element.offset = _file.readUint32LE();
+ element.size = _file.readUint32LE();
+ element.category = 0;
+ debug(3, "Category: id %u, offset %u, size %u", element.id, (uint)element.offset, (uint)element.size);
+}
+
+void ResourceContext_HRS::readEntry(ResourceData &element) {
+ element.id = _file.readUint32BE();
+ element.offset = _file.readUint32LE();
+ element.size = _file.readUint32LE();
+ element.category = getCategory(_file.pos());
debug(3, "Entry: id %u, offset %u, size %u", element.id, (uint)element.offset, (uint)element.size);
}
+uint32 ResourceContext_HRS::getCategory(uint32 resourceOffset) {
+ for (int i = _categories.size() - 1; i >= 0; --i) {
+ if (resourceOffset >= _categories[i].offset)
+ return _categories[i].id;
+ }
+
+ error("Unknown category for offset %d", resourceOffset);
+}
+
+static bool categorySortHelper(const ResourceData &r1, const ResourceData &r2) {
+ return r1.offset < r2.offset;
+}
+
bool ResourceContext_HRS::loadResV2(uint32 contextSize) {
ResourceData origin;
uint32 firstEntryOffset;
@@ -56,7 +78,7 @@ bool ResourceContext_HRS::loadResV2(uint32 contextSize) {
debug(3, "Context %s =====", _fileName);
_file.seek(0, SEEK_SET);
- readElement(_file, origin);
+ readCategory(origin);
// Check if the file is valid
if (origin.id != MKTAG('H','R','E','S')) { // header
@@ -74,18 +96,23 @@ bool ResourceContext_HRS::loadResV2(uint32 contextSize) {
// Read categories
count = origin.size / resourceSize;
- debug(3, "Categories: %d =====", count);
+ debug(3, "File: %s, categories: %d =====", _file.getName(), count);
for (i = 0; i < count; i++) {
- readElement(_file, _categories[i]);
+ readCategory(_categories[i]);
+ //uint32 id = _categories[i].id;
+ //debug("%i: %c%c%c%c, offset: %d, size: %d", i, (id >> 24), (id >> 16) & 0xFF, (id >> 8) & 0xFF, id & 0xFF, _categories[i].offset, _categories[i].size);
}
+ Common::sort(_categories.begin(), _categories.end(), categorySortHelper);
+
_file.seek(firstEntryOffset, SEEK_SET);
// Read table entries
count = tableSize / resourceSize;
- debug(3, "Entries: %d =====", count);
+ debug(3, "File: %s, entries: %d =====", _file.getName(), count);
for (i = 0; i < count; i++) {
- readElement(_file, _table[i]);
+ readEntry(_table[i]);
+ //debug("%i: offset: %d, size: %d", i, _table[i].offset, _table[i].size);
}
return true;
}