diff options
author | Eugene Sandulenko | 2019-12-24 17:35:30 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2019-12-24 17:35:30 +0100 |
commit | e3f22265503a52331057172b05d27d35341b1a30 (patch) | |
tree | 41fc894a5e4f30634262e5c60fd6b459b78ab5f3 | |
parent | c47c9eaad49974a5dbb59b611dea53f44714d508 (diff) | |
download | scummvm-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.cpp | 4 | ||||
-rw-r--r-- | engines/director/archive.h | 1 | ||||
-rw-r--r-- | engines/director/lingo/lingo-events.cpp | 4 | ||||
-rw-r--r-- | engines/director/resource.cpp | 6 | ||||
-rw-r--r-- | engines/director/score.cpp | 30 | ||||
-rw-r--r-- | engines/director/score.h | 2 |
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; |