diff options
author | Filippos Karapetis | 2014-10-18 15:33:07 +0300 |
---|---|---|
committer | Filippos Karapetis | 2014-10-18 16:03:49 +0300 |
commit | 4736c490e1d3182f58db8a51b400f96b9559dad8 (patch) | |
tree | 85f90c0616cd3ce8b37868ca294267854e033644 /engines/sci | |
parent | fe3ed8ded270510a6233a2ca2376befeceeed0e4 (diff) | |
download | scummvm-rg350-4736c490e1d3182f58db8a51b400f96b9559dad8.tar.gz scummvm-rg350-4736c490e1d3182f58db8a51b400f96b9559dad8.tar.bz2 scummvm-rg350-4736c490e1d3182f58db8a51b400f96b9559dad8.zip |
SCI: Separate the rest of the detection-only functions
This should fix bug #6717 - "SCI fallback detection assert failure"
Diffstat (limited to 'engines/sci')
-rw-r--r-- | engines/sci/detection.cpp | 4 | ||||
-rw-r--r-- | engines/sci/resource.cpp | 45 | ||||
-rw-r--r-- | engines/sci/resource.h | 7 | ||||
-rw-r--r-- | engines/sci/sci.h | 6 |
4 files changed, 48 insertions, 14 deletions
diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 7176a18b46..85ff1c0062 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -568,13 +568,13 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, ResourceManager resMan; resMan.addAppropriateSourcesForDetection(fslist); - resMan.init(true); + resMan.initForDetection(); // TODO: Add error handling. #ifndef ENABLE_SCI32 // Is SCI32 compiled in? If not, and this is a SCI32 game, // stop here - if (getSciVersion() >= SCI_VERSION_2) + if (getSciVersionForDetection() >= SCI_VERSION_2) return 0; #endif diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index f690f03cac..d155792853 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -55,6 +55,11 @@ SciVersion getSciVersion() { return s_sciVersion; } +SciVersion getSciVersionForDetection() { + assert(!g_sci); + return s_sciVersion; +} + const char *getSciVersionDesc(SciVersion version) { switch (version) { case SCI_VERSION_NONE: @@ -855,7 +860,7 @@ void ResourceManager::freeResourceSources() { ResourceManager::ResourceManager() { } -void ResourceManager::init(bool initFromFallbackDetector) { +void ResourceManager::init() { _memoryLocked = 0; _memoryLRU = 0; _LRU.clear(); @@ -894,18 +899,17 @@ void ResourceManager::init(bool initFromFallbackDetector) { scanNewSources(); - if (!initFromFallbackDetector) { - if (!addAudioSources()) { - // FIXME: This error message is not always correct. - // OTOH, it is nice to be able to detect missing files/sources - // So we should definitely fix addAudioSources so this error - // only pops up when necessary. Disabling for now. - //error("Somehow I can't seem to find the sound files I need (RESOURCE.AUD/RESOURCE.SFX), aborting"); - } - addScriptChunkSources(); - scanNewSources(); + if (!addAudioSources()) { + // FIXME: This error message is not always correct. + // OTOH, it is nice to be able to detect missing files/sources + // So we should definitely fix addAudioSources so this error + // only pops up when necessary. Disabling for now. + //error("Somehow I can't seem to find the sound files I need (RESOURCE.AUD/RESOURCE.SFX), aborting"); } + addScriptChunkSources(); + scanNewSources(); + detectSciVersion(); debugC(1, kDebugLevelResMan, "resMan: Detected %s", getSciVersionDesc(getSciVersion())); @@ -940,6 +944,22 @@ void ResourceManager::init(bool initFromFallbackDetector) { } } +void ResourceManager::initForDetection() { + assert(!g_sci); + + _memoryLocked = 0; + _memoryLRU = 0; + _LRU.clear(); + _resMap.clear(); + _audioMapSCI1 = NULL; + + _mapVersion = detectMapVersion(); + _volVersion = detectVolVersion(); + + scanNewSources(); + detectSciVersion(); +} + ResourceManager::~ResourceManager() { // freeing resources ResourceMap::iterator itr = _resMap.begin(); @@ -1642,6 +1662,9 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { do { type = fileStream->readByte() & 0x1F; resMap[type].wOffset = fileStream->readUint16LE(); + if (fileStream->eos()) + return SCI_ERROR_RESMAP_NOT_FOUND; + resMap[prevtype].wSize = (resMap[type].wOffset - resMap[prevtype].wOffset) / nEntrySize; prevtype = type; diff --git a/engines/sci/resource.h b/engines/sci/resource.h index 8260ddb27e..62f3c584ac 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -312,7 +312,12 @@ public: /** * Initializes the resource manager. */ - void init(bool initFromFallbackDetector = false); + void init(); + + /** + * Similar to the function above, only called from the fallback detector + */ + void initForDetection(); /** * Adds all of the resource files for a game diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 48bc4819d2..2377386c72 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -429,6 +429,12 @@ extern SciEngine *g_sci; SciVersion getSciVersion(); /** + * Same as above, but this version doesn't assert on unknown SCI versions. + * Only used by the fallback detector + */ +SciVersion getSciVersionForDetection(); + +/** * Convenience function converting an SCI version into a human-readable string. */ const char *getSciVersionDesc(SciVersion version); |