aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hoops2012-11-14 11:11:55 -0500
committerEugene Sandulenko2016-08-03 23:40:36 +0200
commit50c52ab3fb74f2994e02dbcac5337dfffbefbafd (patch)
tree401a53da2d26552e652d2dcb1011372e7a13abfb
parent8c252aa830296fa138a892baf6fee121807c0797 (diff)
downloadscummvm-rg350-50c52ab3fb74f2994e02dbcac5337dfffbefbafd.tar.gz
scummvm-rg350-50c52ab3fb74f2994e02dbcac5337dfffbefbafd.tar.bz2
scummvm-rg350-50c52ab3fb74f2994e02dbcac5337dfffbefbafd.zip
DIRECTOR: Fix RIFX files inside of EXE's
-rw-r--r--engines/director/resource.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index da664a4f0e..d348d12e39 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -251,6 +251,8 @@ bool RIFFArchive::openStream(Common::SeekableReadStream *stream) {
bool RIFXArchive::openStream(Common::SeekableReadStream *stream) {
close();
+ uint32 startPos = stream->pos();
+
uint32 tag = stream->readUint32BE();
bool isBigEndian;
@@ -261,11 +263,12 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream) {
else
return false;
- Common::SeekableSubReadStreamEndian subStream(stream, 4, stream->size(), isBigEndian, DisposeAfterUse::NO);
+ Common::SeekableSubReadStreamEndian subStream(stream, startPos + 4, stream->size(), isBigEndian, DisposeAfterUse::NO);
subStream.readUint32(); // size
- if (subStream.readUint32() != MKTAG('M', 'V', '9', '3'))
+ uint32 type = subStream.readUint32();
+ if (type != MKTAG('M', 'V', '9', '3') && type != MKTAG('A', 'P', 'P', 'L'))
return false;
if (subStream.readUint32() != MKTAG('i', 'm', 'a', 'p'))
@@ -273,7 +276,7 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream) {
subStream.readUint32(); // imap length
subStream.readUint32(); // unknown
- uint32 mmapOffset = subStream.readUint32() - 4;
+ uint32 mmapOffset = subStream.readUint32() - startPos - 4;
subStream.seek(mmapOffset);
@@ -294,6 +297,8 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream) {
uint32 offset = subStream.readUint32();
subStream.skip(8); // always 0?
+ debug(0, "Found RIFX resource %d: '%s', %d @ 0x%08x", i, tag2str(tag), size, offset);
+
ResourceMap &resMap = _types[tag];
Resource &res = resMap[i]; // FIXME: What is the ID? Is this setup even viable?
res.offset = offset;