aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/resource.cpp152
-rw-r--r--engines/sci/resource.h8
2 files changed, 62 insertions, 98 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index b7d70db04a..5edf1b7145 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -131,56 +131,45 @@ void Resource::unalloc() {
ResourceSource *ResourceManager::addExternalMap(const char *file_name) {
ResourceSource *newsrc = new ResourceSource();
- // Add the new source to the SLL of sources
- newsrc->next = _sources;
- _sources = newsrc;
-
newsrc->source_type = kSourceExtMap;
newsrc->location_name = file_name;
newsrc->scanned = false;
newsrc->associated_map = NULL;
+ _sources.push_back(newsrc);
return newsrc;
}
ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const char *filename, int number) {
ResourceSource *newsrc = new ResourceSource();
- // Add the new source to the SLL of sources
- newsrc->next = _sources;
- _sources = newsrc;
-
newsrc->source_type = type;
newsrc->scanned = false;
newsrc->location_name = filename;
newsrc->volume_number = number;
newsrc->associated_map = map;
+ _sources.push_back(newsrc);
return newsrc;
}
ResourceSource *ResourceManager::addPatchDir(const char *dirname) {
ResourceSource *newsrc = new ResourceSource();
- // Add the new source to the SLL of sources
- newsrc->next = _sources;
- _sources = newsrc;
-
newsrc->source_type = kSourceDirectory;
newsrc->scanned = false;
newsrc->location_name = dirname;
+ _sources.push_back(newsrc);
return 0;
}
ResourceSource *ResourceManager::getVolume(ResourceSource *map, int volume_nr) {
- ResourceSource *seeker = _sources;
-
- while (seeker) {
- if ((seeker->source_type == kSourceVolume || seeker->source_type == kSourceAudioVolume)
- && seeker->associated_map == map && seeker->volume_number == volume_nr)
- return seeker;
- seeker = seeker->next;
+ for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) {
+ ResourceSource *src = *it;
+ if ((src->source_type == kSourceVolume || src->source_type == kSourceAudioVolume)
+ && src->associated_map == map && src->volume_number == volume_nr)
+ return src;
}
return NULL;
@@ -228,21 +217,11 @@ bool ResourceManager::loadFromPatchFile(Resource *res) {
return loadPatch(res, file);
}
-bool ResourceManager::loadFromAudioVolume(Resource *res) {
- Common::File file;
- const char *filename = res->source->location_name.c_str();
- if (file.open(filename) == false) {
- warning("Failed to open audio volume %s", filename);
- res->unalloc();
- return false;
- }
-
- file.seek(res->file_offset, SEEK_SET);
-
+bool ResourceManager::loadFromAudioVolume(Resource *res, Common::File &file) {
ResourceType type = (ResourceType)(file.readByte() & 0x7f);
if (((res->id.type == kResourceTypeAudio || res->id.type == kResourceTypeAudio36) && (type != kResourceTypeAudio))
|| ((res->id.type == kResourceTypeSync || res->id.type == kResourceTypeSync36) && (type != kResourceTypeSync))) {
- warning("Resource type mismatch loading %s from %s", res->id.toString().c_str(), filename);
+ warning("Resource type mismatch loading %s from %s", res->id.toString().c_str(), file.getName());
res->unalloc();
return false;
}
@@ -302,10 +281,7 @@ void ResourceManager::loadResource(Resource *res) {
if (res->source->source_type == kSourcePatch && loadFromPatchFile(res))
return;
- if (res->source->source_type == kSourceAudioVolume) {
- loadFromAudioVolume(res);
- return;
- }
+
// Either loading from volume or patch loading failed
file = getVolumeFile(res->source->location_name.c_str());
if (!file) {
@@ -314,13 +290,17 @@ void ResourceManager::loadResource(Resource *res) {
return;
}
file->seek(res->file_offset, SEEK_SET);
- int error = decompress(res, file);
- if (error) {
- warning("Error %d occured while reading %s from resource file: %s",
- error, res->id.toString().c_str(), sci_error_types[error]);
- res->unalloc();
- }
+ if (res->source->source_type == kSourceAudioVolume) {
+ loadFromAudioVolume(res, *file);
+ } else {
+ int error = decompress(res, file);
+ if (error) {
+ warning("Error %d occured while reading %s from resource file: %s",
+ error, res->id.toString().c_str(), sci_error_types[error]);
+ res->unalloc();
+ }
+ }
}
Resource *ResourceManager::testResource(ResourceId id) {
@@ -417,7 +397,6 @@ int ResourceManager::addAppropriateSources() {
addSource(map, kSourceVolume, name.c_str(), number);
}
addPatchDir(".");
- // TODO: add RESOURCE.AUD and RESOURCE.SFX for SCI1.1 games
if (Common::File::exists("MESSAGE.MAP"))
addSource(addExternalMap("MESSAGE.MAP"), kSourceVolume, "RESOURCE.MSG", 0);
return 1;
@@ -441,52 +420,37 @@ int ResourceManager::addInternalSources() {
return 1;
}
-int ResourceManager::scanNewSources(ResourceSource *source) {
- if (!source)
- return SCI_ERROR_NO_RESOURCE_FILES_FOUND;
-
- int resource_error = 0;
- if (source->next)
- scanNewSources(source->next);
+void ResourceManager::scanNewSources() {
+ for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) {
+ ResourceSource *source = *it;
- if (!source->scanned) {
- source->scanned = true;
- switch (source->source_type) {
- case kSourceDirectory:
- readResourcePatches(source);
- break;
- case kSourceExtMap:
- if (_mapVersion < SCI_VERSION_1)
- resource_error = readResourceMapSCI0(source);
- else
- resource_error = readResourceMapSCI1(source);
-
- if (resource_error == SCI_ERROR_RESMAP_NOT_FOUND) {
- // FIXME: Try reading w/o resource.map
- resource_error = SCI_ERROR_NO_RESOURCE_FILES_FOUND;
- }
-
- if (resource_error == SCI_ERROR_NO_RESOURCE_FILES_FOUND) {
- // Initialize empty resource manager
- _resMap.clear();
- resource_error = 0;
+ if (!source->scanned) {
+ source->scanned = true;
+ switch (source->source_type) {
+ case kSourceDirectory:
+ readResourcePatches(source);
+ break;
+ case kSourceExtMap:
+ if (_mapVersion < SCI_VERSION_1)
+ readResourceMapSCI0(source);
+ else
+ readResourceMapSCI1(source);
+ break;
+ case kSourceIntMap:
+ readMap(source);
+ break;
+ default:
+ break;
}
- break;
- case kSourceIntMap:
- resource_error = readMap(source);
- break;
- default:
- break;
}
}
- return resource_error;
}
-void ResourceManager::freeResourceSources(ResourceSource *rss) {
- if (rss) {
- freeResourceSources(rss->next);
- delete rss;
- }
+void ResourceManager::freeResourceSources() {
+ for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it)
+ delete *it;
+
+ _sources.clear();
}
ResourceManager::ResourceManager(int version, int maxMemory) {
@@ -495,7 +459,6 @@ ResourceManager::ResourceManager(int version, int maxMemory) {
_memoryLRU = 0;
_LRU.clear();
_resMap.clear();
- _sources = NULL;
_sciVersion = version;
addAppropriateSources();
@@ -510,9 +473,9 @@ ResourceManager::ResourceManager(int version, int maxMemory) {
debug("Using resource map version %d %s", _mapVersion, sci_version_types[_mapVersion]);
debug("Using volume version %d %s", _volVersion, sci_version_types[_volVersion]);
- scanNewSources(_sources);
+ scanNewSources();
addInternalSources();
- scanNewSources(_sources);
+ scanNewSources();
if (version == SCI_VERSION_AUTODETECT)
switch (_mapVersion) {
@@ -591,7 +554,7 @@ ResourceManager::~ResourceManager() {
delete itr->_value;
itr ++;
}
- freeResourceSources(_sources);
+ freeResourceSources();
_resMap.empty();
Common::List<Common::File *>::iterator it = _volumeFiles.begin();
@@ -738,14 +701,15 @@ void ResourceManager::unlockResource(Resource *res) {
int ResourceManager::detectMapVersion() {
Common::File file;
byte buff[6];
- ResourceSource *rsrc = _sources;
- // looking for extarnal map among sources
- while (rsrc) {
+ ResourceSource *rsrc;
+
+ for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) {
+ rsrc = *it;
+
if (rsrc->source_type == kSourceExtMap) {
file.open(rsrc->location_name);
break;
}
- rsrc = rsrc->next;
}
if (file.isOpen() == false) {
warning("Failed to open resource map file");
@@ -799,14 +763,14 @@ int ResourceManager::detectMapVersion() {
int ResourceManager::detectVolVersion() {
Common::File file;
- ResourceSource *rsrc = _sources;
- // looking for a volume among sources
- while (rsrc) {
+ ResourceSource *rsrc;
+ for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) {
+ rsrc = *it;
+
if (rsrc->source_type == kSourceVolume) {
file.open(rsrc->location_name);
break;
}
- rsrc = rsrc->next;
}
if (file.isOpen() == false) {
warning("Failed to open volume file");
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index 172817912e..fc3f37f25c 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -272,7 +272,7 @@ public:
protected:
int _maxMemory; //!< Config option: Maximum total byte number allocated
- ResourceSource *_sources;
+ Common::List<ResourceSource *> _sources;
int _memoryLocked; //!< Amount of resource bytes in locked memory
int _memoryLRU; //!< Amount of resource bytes under LRU control
Common::List<Resource *> _LRU; //!< Last Resource Used list
@@ -316,16 +316,16 @@ protected:
* used during startup. May be NULL.
* @return One of SCI_ERROR_*.
*/
- int scanNewSources(ResourceSource *source);
+ void scanNewSources();
int addAppropriateSources();
int addInternalSources();
- void freeResourceSources(ResourceSource *rss);
+ void freeResourceSources();
Common::File *getVolumeFile(const char *filename);
void loadResource(Resource *res);
bool loadPatch(Resource *res, Common::File &file);
bool loadFromPatchFile(Resource *res);
- bool loadFromAudioVolume(Resource *res);
+ bool loadFromAudioVolume(Resource *res, Common::File &file);
void freeOldResources(int last_invulnerable);
int decompress(Resource *res, Common::File *file);
int readResourceInfo(Resource *res, Common::File *file, uint32&szPacked, ResourceCompression &compression);