[Scummvm-git-logs] scummvm master -> dbe1ae48d56f27ece1e0a6475aa39185afc6cef9
djsrv
noreply at scummvm.org
Tue Aug 9 21:18:21 UTC 2022
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
766d74f8f6 DIRECTOR: Read KEY* resource before reading CAS* resource
8f9da662cc DIRECTOR: Implement _movieChunk to store indices of chunks having 1024 as parent
dbe1ae48d5 DIRECTOR: Use KEY* mappings instead of taking the first resource to load chunks
Commit: 766d74f8f6083639c6a3319ba14d242ccc66fbeb
https://github.com/scummvm/scummvm/commit/766d74f8f6083639c6a3319ba14d242ccc66fbeb
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00
Commit Message:
DIRECTOR: Read KEY* resource before reading CAS* resource
Changed paths:
engines/director/archive.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index fca32efa2bd..5c6be56e0d7 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -582,6 +582,16 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
}
}
+ // A KEY* must be present
+ if (!hasResource(MKTAG('K', 'E', 'Y', '*'), -1)) {
+ warning("No 'KEY*' resource present");
+ } else {
+ // Parse the KEY*
+ Common::SeekableReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
+ readKeyTable(*keyStream);
+ delete keyStream;
+ }
+
// Parse the CAS*, if present
if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
Common::SeekableReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
@@ -589,16 +599,6 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
delete casStream;
}
- // A KEY* must be present
- if (!hasResource(MKTAG('K', 'E', 'Y', '*'), -1)) {
- warning("No 'KEY*' resource present");
- return false;
- }
- // Parse the KEY*
- Common::SeekableReadStreamEndian *keyStream = getFirstResource(MKTAG('K', 'E', 'Y', '*'), true);
- readKeyTable(*keyStream);
- delete keyStream;
-
return true;
}
Commit: 8f9da662ccceb77dfc979ec32f5ab2ac9e15c6b1
https://github.com/scummvm/scummvm/commit/8f9da662ccceb77dfc979ec32f5ab2ac9e15c6b1
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00
Commit Message:
DIRECTOR: Implement _movieChunk to store indices of chunks having 1024 as parent
Changed paths:
engines/director/archive.cpp
engines/director/archive.h
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 5c6be56e0d7..0a4c61b8e19 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -594,7 +594,11 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
// Parse the CAS*, if present
if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
- Common::SeekableReadStreamEndian *casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+ Common::SeekableReadStreamEndian *casStream = nullptr;
+ if (_movieChunks.contains(MKTAG('C', 'A', 'S', '*')))
+ casStream = getResource(MKTAG('C', 'A', 'S', '*'), _movieChunks[MKTAG('C', 'A', 'S', '*')]);
+ else
+ casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
readCast(*casStream);
delete casStream;
}
@@ -855,6 +859,8 @@ void RIFXArchive::readKeyTable(Common::SeekableReadStreamEndian &keyStream) {
castResMap[parentIndex].children.push_back(_types[childTag][childIndex]);
} else if (castResMap.contains(childIndex)) { // sometimes parent and child index are reversed...
castResMap[childIndex].children.push_back(_types[childTag][parentIndex]);
+ } else if (parentIndex == 1024) {
+ _movieChunks.setVal(childTag, childIndex);
}
}
}
diff --git a/engines/director/archive.h b/engines/director/archive.h
index c77fa0c5b26..272c8488b1f 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -80,7 +80,9 @@ protected:
Common::SeekableReadStream *_stream;
typedef Common::HashMap<uint16, Resource> ResourceMap;
typedef Common::HashMap<uint32, ResourceMap> TypeMap;
+ typedef Common::HashMap<uint32, uint32> MovieMap;
TypeMap _types;
+ MovieMap _movieChunks;
Common::String _pathName;
};
Commit: dbe1ae48d56f27ece1e0a6475aa39185afc6cef9
https://github.com/scummvm/scummvm/commit/dbe1ae48d56f27ece1e0a6475aa39185afc6cef9
Author: Pragyansh Chaturvedi (pragyanshchaturvedi18 at gmail.com)
Date: 2022-08-09T16:18:15-05:00
Commit Message:
DIRECTOR: Use KEY* mappings instead of taking the first resource to load chunks
Changed paths:
engines/director/archive.cpp
engines/director/archive.h
engines/director/cast.cpp
engines/director/movie.cpp
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 0a4c61b8e19..40db6ffd854 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -171,6 +171,18 @@ Common::String Archive::getName(uint32 tag, uint16 id) const {
return resMap[id].name;
}
+Common::SeekableReadStreamEndian *Archive::getMovieResourceIfPresent(uint32 tag) {
+ if (g_director->getVersion() >= 400 && (_movieChunks.contains(tag) && hasResource(tag, _movieChunks[tag])))
+ return getResource(tag, _movieChunks[tag]);
+
+ if (hasResource(tag, -1)) {
+ warning("Archive::getMovieResourceIfPresent(): KEY* to reference tag %d not found, returning first occurence of this resource", tag);
+ return getFirstResource(tag);
+ }
+
+ return nullptr;
+}
+
Common::Array<uint32> Archive::getResourceTypeList() const {
Common::Array<uint32> typeList;
@@ -593,12 +605,7 @@ bool RIFXArchive::openStream(Common::SeekableReadStream *stream, uint32 startOff
}
// Parse the CAS*, if present
- if (hasResource(MKTAG('C', 'A', 'S', '*'), -1)) {
- Common::SeekableReadStreamEndian *casStream = nullptr;
- if (_movieChunks.contains(MKTAG('C', 'A', 'S', '*')))
- casStream = getResource(MKTAG('C', 'A', 'S', '*'), _movieChunks[MKTAG('C', 'A', 'S', '*')]);
- else
- casStream = getFirstResource(MKTAG('C', 'A', 'S', '*'));
+ if (Common::SeekableReadStreamEndian *casStream = getMovieResourceIfPresent(MKTAG('C', 'A', 'S', '*'))) {
readCast(*casStream);
delete casStream;
}
diff --git a/engines/director/archive.h b/engines/director/archive.h
index 272c8488b1f..464dab1069c 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -69,6 +69,7 @@ public:
uint32 getOffset(uint32 tag, uint16 id) const;
uint16 findResourceID(uint32 tag, const Common::String &resName, bool ignoreCase = false) const;
Common::String getName(uint32 tag, uint16 id) const;
+ Common::SeekableReadStreamEndian *getMovieResourceIfPresent(uint32 tag);
Common::Array<uint32> getResourceTypeList() const;
Common::Array<uint16> getResourceIDList(uint32 type) const;
@@ -80,9 +81,9 @@ protected:
Common::SeekableReadStream *_stream;
typedef Common::HashMap<uint16, Resource> ResourceMap;
typedef Common::HashMap<uint32, ResourceMap> TypeMap;
- typedef Common::HashMap<uint32, uint32> MovieMap;
+ typedef Common::HashMap<uint32, uint32> MovieChunkMap;
TypeMap _types;
- MovieMap _movieChunks;
+ MovieChunkMap _movieChunks;
Common::String _pathName;
};
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 4dcea4aed3b..9f80f59e848 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -238,7 +238,9 @@ bool Cast::loadConfig() {
return false;
}
- Common::SeekableReadStreamEndian *stream = _castArchive->getFirstResource(MKTAG('V', 'W', 'C', 'F'));
+ Common::SeekableReadStreamEndian *stream = nullptr;
+
+ stream = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'C', 'F'));
debugC(1, kDebugLoading, "****** Loading Config VWCF");
@@ -489,26 +491,26 @@ void Cast::loadCast() {
}
// Font Mapping
- if (_castArchive->hasResource(MKTAG('V', 'W', 'F', 'M'), -1)) {
- loadFontMap(*(r = _castArchive->getFirstResource(MKTAG('V', 'W', 'F', 'M'))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'F', 'M'))) {
+ loadFontMap(*r);
delete r;
}
// Cross-Platform Font Mapping
- if (_castArchive->hasResource(MKTAG('F', 'X', 'm', 'p'), -1)) {
- loadFXmp(*(r = _castArchive->getFirstResource(MKTAG('F', 'X', 'm', 'p'))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('F', 'X', 'm', 'p'))) {
+ loadFXmp(*r);
delete r;
}
// Font Mapping V4
- if (_castArchive->hasResource(MKTAG('F', 'm', 'a', 'p'), -1)) {
- loadFontMapV4(*(r = _castArchive->getFirstResource(MKTAG('F', 'm', 'a', 'p'))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('F', 'm', 'a', 'p'))) {
+ loadFontMapV4(*r);
delete r;
}
// Pattern Tiles
- if (_castArchive->hasResource(MKTAG('V', 'W', 'T', 'L'), -1)) {
- loadVWTL(*(r = _castArchive->getFirstResource(MKTAG('V', 'W', 'T', 'L'))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'T', 'L'))) {
+ loadVWTL(*r);
delete r;
}
@@ -525,8 +527,8 @@ void Cast::loadCast() {
}
// External sound files
- if (_castArchive->hasResource(MKTAG('S', 'T', 'R', ' '), -1)) {
- loadExternalSound(*(r = _castArchive->getFirstResource(MKTAG('S', 'T', 'R', ' '))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('S', 'T', 'R', ' '))) {
+ loadExternalSound(*r);
delete r;
}
@@ -558,14 +560,9 @@ void Cast::loadCast() {
// For D4+ we may request to force Lingo scripts and skip precompiled bytecode
if (_version >= kFileVer400 && !debugChannelSet(-1, kDebugNoBytecode)) {
// Try to load script context
- Common::Array<uint16> lctx = _castArchive->getResourceIDList(MKTAG('L','c','t','x'));
- if (lctx.size() > 0) {
- debugC(2, kDebugLoading, "****** Loading %d Lctx resources", lctx.size());
-
- for (Common::Array<uint16>::iterator iterator = lctx.begin(); iterator != lctx.end(); ++iterator) {
- loadLingoContext(*(r = _castArchive->getResource(MKTAG('L','c','t','x'), *iterator)));
- delete r;
- }
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('L', 'c', 't', 'x'))) {
+ loadLingoContext(*r);
+ delete r;
}
}
@@ -580,8 +577,8 @@ void Cast::loadCast() {
}
// Score Order List resources
- if (_castArchive->hasResource(MKTAG('S', 'o', 'r', 'd'), -1)) {
- loadSord(*(r = _castArchive->getFirstResource(MKTAG('S', 'o', 'r', 'd'))));
+ if (r = _castArchive->getMovieResourceIfPresent(MKTAG('S', 'o', 'r', 'd'))) {
+ loadSord(*r);
delete r;
}
diff --git a/engines/director/movie.cpp b/engines/director/movie.cpp
index 5f5d36b05da..240d7ebf490 100644
--- a/engines/director/movie.cpp
+++ b/engines/director/movie.cpp
@@ -111,9 +111,8 @@ void Movie::setArchive(Archive *archive) {
_cast->setArchive(archive);
// Frame Labels
- if (archive->hasResource(MKTAG('V', 'W', 'L', 'B'), -1)) {
- Common::SeekableReadStreamEndian *r;
- _score->loadLabels(*(r = archive->getFirstResource(MKTAG('V', 'W', 'L', 'B'))));
+ if (Common::SeekableReadStreamEndian *r = archive->getMovieResourceIfPresent(MKTAG('V', 'W', 'L', 'B'))) {
+ _score->loadLabels(*r);
delete r;
}
}
@@ -131,8 +130,8 @@ bool Movie::loadArchive() {
// Wait to handle _stageColor until palette is loaded in loadCast...
// File Info
- if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'I'), -1)) {
- loadFileInfo(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'F', 'I'))));
+ if (r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'F', 'I'))) {
+ loadFileInfo(*r);
delete r;
}
@@ -166,16 +165,17 @@ bool Movie::loadArchive() {
_window->setStageColor(_stageColor, true);
// Score
- if (!_movieArchive->hasResource(MKTAG('V', 'W', 'S', 'C'), -1)) {
+ if (!(r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'S', 'C')))) {
warning("Movie::loadArchive(): Wrong movie format. VWSC resource missing");
return false;
}
- _score->loadFrames(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'S', 'C'))), _version);
+
+ _score->loadFrames(*r, _version);
delete r;
// Action list
- if (_movieArchive->hasResource(MKTAG('V', 'W', 'A', 'C'), -1)) {
- _score->loadActions(*(r = _movieArchive->getFirstResource(MKTAG('V', 'W', 'A', 'C'))));
+ if (r = _movieArchive->getMovieResourceIfPresent(MKTAG('V', 'W', 'A', 'C'))) {
+ _score->loadActions(*r);
delete r;
}
More information about the Scummvm-git-logs
mailing list