aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2019-12-24 17:35:30 +0100
committerEugene Sandulenko2019-12-24 17:35:30 +0100
commite3f22265503a52331057172b05d27d35341b1a30 (patch)
tree41fc894a5e4f30634262e5c60fd6b459b78ab5f3
parentc47c9eaad49974a5dbb59b611dea53f44714d508 (diff)
downloadscummvm-rg350-e3f22265503a52331057172b05d27d35341b1a30.tar.gz
scummvm-rg350-e3f22265503a52331057172b05d27d35341b1a30.tar.bz2
scummvm-rg350-e3f22265503a52331057172b05d27d35341b1a30.zip
DIRECTOR: Support for arbitrary cast resrouce offsets
-rw-r--r--engines/director/archive.cpp4
-rw-r--r--engines/director/archive.h1
-rw-r--r--engines/director/lingo/lingo-events.cpp4
-rw-r--r--engines/director/resource.cpp6
-rw-r--r--engines/director/score.cpp30
-rw-r--r--engines/director/score.h2
6 files changed, 29 insertions, 18 deletions
diff --git a/engines/director/archive.cpp b/engines/director/archive.cpp
index 80645e7f7b..9e00283a19 100644
--- a/engines/director/archive.cpp
+++ b/engines/director/archive.cpp
@@ -90,6 +90,10 @@ bool Archive::hasResource(uint32 tag, const Common::String &resName) const {
return false;
}
+Common::SeekableSubReadStreamEndian *Archive::getFirstResource(uint32 tag) {
+ return getResource(tag, getResourceIDList(tag)[0]);
+}
+
Common::SeekableSubReadStreamEndian *Archive::getResource(uint32 tag, uint16 id) {
if (!_types.contains(tag))
error("Archive does not contain '%s' %04x", tag2str(tag), id);
diff --git a/engines/director/archive.h b/engines/director/archive.h
index d1eeeefb5a..847eff5552 100644
--- a/engines/director/archive.h
+++ b/engines/director/archive.h
@@ -59,6 +59,7 @@ public:
bool hasResource(uint32 tag, int id) const;
bool hasResource(uint32 tag, const Common::String &resName) const;
virtual Common::SeekableSubReadStreamEndian *getResource(uint32 tag, uint16 id);
+ Common::SeekableSubReadStreamEndian *getFirstResource(uint32 tag);
virtual Resource getResourceDetail(uint32 tag, uint16 id);
uint32 getOffset(uint32 tag, uint16 id) const;
uint16 findResourceID(uint32 tag, const Common::String &resName) const;
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index 691cff0213..56f43fd714 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -176,8 +176,8 @@ void Lingo::processInputEvent(LEvent event) {
} else if (event == kEventMouseUp) {
// Frame script overrides sprite script
if (!currentFrame->_sprites[spriteId]->_scriptId) {
- processEvent(kEventNone, kSpriteScript, currentFrame->_sprites[spriteId]->_castId + 1024);
- processEvent(event, kSpriteScript, currentFrame->_sprites[spriteId]->_castId + 1024);
+ processEvent(kEventNone, kSpriteScript, currentFrame->_sprites[spriteId]->_castId + score->_castIDoffset);
+ processEvent(event, kSpriteScript, currentFrame->_sprites[spriteId]->_castId + score->_castIDoffset);
} else {
processEvent(kEventNone, kFrameScript, currentFrame->_sprites[spriteId]->_scriptId);
}
diff --git a/engines/director/resource.cpp b/engines/director/resource.cpp
index 4412d3f61b..b4b160597c 100644
--- a/engines/director/resource.cpp
+++ b/engines/director/resource.cpp
@@ -275,8 +275,10 @@ void DirectorEngine::loadSharedCastsFrom(Common::String filename) {
_sharedScore->loadConfig(*shardcst->getResource(MKTAG('V','W','C','F'), 1024));
- if (getVersion() < 4)
- _sharedScore->loadCastDataVWCR(*shardcst->getResource(MKTAG('V','W','C','R'), 1024));
+ if (getVersion() < 4) {
+ _sharedScore->_castIDoffset = shardcst->getResourceIDList(MKTAG('V', 'W', 'C', 'R'))[0];
+ _sharedScore->loadCastDataVWCR(*shardcst->getResource(MKTAG('V','W','C','R'), _sharedScore->_castIDoffset));
+ }
Common::Array<uint16> cast = shardcst->getResourceIDList(MKTAG('C','A','S','t'));
if (cast.size() > 0) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 95efba8dd8..8cb5513fdb 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -91,6 +91,8 @@ Score::Score(DirectorEngine *vm) {
_stopPlay = false;
_stageColor = 0;
+ _castIDoffset = 0;
+
_loadedBitmaps = new Common::HashMap<int, BitmapCast *>();
_loadedText = new Common::HashMap<int, TextCast *>();
_loadedButtons = new Common::HashMap<int, ButtonCast *>();
@@ -134,12 +136,12 @@ void Score::loadArchive() {
debug("Movie has fonts. Loading....");
}
- assert(_movieArchive->hasResource(MKTAG('V', 'W', 'S', 'C'), 1024));
- loadFrames(*_movieArchive->getResource(MKTAG('V', 'W', 'S', 'C'), 1024));
+ assert(_movieArchive->hasResource(MKTAG('V', 'W', 'S', 'C'), -1));
+ loadFrames(*_movieArchive->getFirstResource(MKTAG('V', 'W', 'S', 'C')));
if (_movieArchive->hasResource(MKTAG('V', 'W', 'C', 'F'), -1)) {
- loadConfig(*_movieArchive->getResource(MKTAG('V', 'W', 'C', 'F'), 1024));
+ loadConfig(*_movieArchive->getFirstResource(MKTAG('V', 'W', 'C', 'F')));
} else {
// TODO: Source this from somewhere!
_movieRect = Common::Rect(0, 0, 640, 480);
@@ -147,21 +149,21 @@ void Score::loadArchive() {
}
if (_movieArchive->hasResource(MKTAG('V', 'W', 'C', 'R'), -1)) {
- loadCastDataVWCR(*_movieArchive->getResource(MKTAG('V', 'W', 'C', 'R'), 1024));
+ _castIDoffset = _movieArchive->getResourceIDList(MKTAG('V', 'W', 'C', 'R'))[0];
+ loadCastDataVWCR(*_movieArchive->getResource(MKTAG('V', 'W', 'C', 'R'), _castIDoffset));
}
-
- if (_movieArchive->hasResource(MKTAG('V', 'W', 'A', 'C'), 1024)) {
- loadActions(*_movieArchive->getResource(MKTAG('V', 'W', 'A', 'C'), 1024));
+ if (_movieArchive->hasResource(MKTAG('V', 'W', 'A', 'C'), -1)) {
+ loadActions(*_movieArchive->getFirstResource(MKTAG('V', 'W', 'A', 'C')));
}
- if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'I'), 1024)) {
- loadFileInfo(*_movieArchive->getResource(MKTAG('V', 'W', 'F', 'I'), 1024));
+ if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'I'), -1)) {
+ loadFileInfo(*_movieArchive->getFirstResource(MKTAG('V', 'W', 'F', 'I')));
}
- if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'M'), 1024)) {
+ if (_movieArchive->hasResource(MKTAG('V', 'W', 'F', 'M'), -1)) {
_vm->_wm->_fontMan->clearFontMapping();
- loadFontMap(*_movieArchive->getResource(MKTAG('V', 'W', 'F', 'M'), 1024));
+ loadFontMap(*_movieArchive->getFirstResource(MKTAG('V', 'W', 'F', 'M')));
}
// Try to load script context
@@ -231,7 +233,7 @@ void Score::copyCastStxts() {
Common::HashMap<int, TextCast *>::iterator tc;
for (tc = _loadedText->begin(); tc != _loadedText->end(); ++tc) {
uint stxtid = (_vm->getVersion() < 4) ?
- tc->_key + 1024 :
+ tc->_key + _castIDoffset :
tc->_value->_children[0].index;
if (_loadedStxts->getVal(stxtid)) {
const Stxt *stxt = _loadedStxts->getVal(stxtid);
@@ -243,7 +245,7 @@ void Score::copyCastStxts() {
Common::HashMap<int, ButtonCast *>::iterator bc;
for (bc = _loadedButtons->begin(); bc != _loadedButtons->end(); ++bc) {
uint stxtid = (_vm->getVersion() < 4) ?
- bc->_key + 1024 :
+ bc->_key + _castIDoffset :
bc->_value->_children[0].index;
if (_loadedStxts->getVal(stxtid)) {
debugC(3, "Yes to STXT: %d", stxtid);
@@ -262,7 +264,7 @@ void Score::loadSpriteImages(bool isSharedCast) {
for (bc = _loadedBitmaps->begin(); bc != _loadedBitmaps->end(); ++bc) {
if (bc->_value) {
uint32 tag = bc->_value->_tag;
- uint16 imgId = bc->_key + 1024;
+ uint16 imgId = (uint16)(bc->_key + _castIDoffset);
BitmapCast *bitmapCast = bc->_value;
if (_vm->getVersion() >= 4 && bitmapCast->_children.size() > 0) {
diff --git a/engines/director/score.h b/engines/director/score.h
index 1025194d4e..087da9b7a9 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -149,6 +149,8 @@ public:
Common::HashMap<int, ScriptCast *> *_loadedScripts;
Common::HashMap<int, const Stxt *> *_loadedStxts;
+ uint16 _castIDoffset;
+
private:
uint16 _versionMinor;
uint16 _versionMajor;