aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/resource.cpp72
-rw-r--r--engines/sci/resource.h1
-rw-r--r--engines/sci/resource_audio.cpp19
-rw-r--r--engines/sci/resource_intern.h6
4 files changed, 38 insertions, 60 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index df33ec6b89..a57ae04847 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -1134,20 +1134,12 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource
return;
}
- // Prepare destination, if neccessary
- if (_resMap.contains(resId) == false) {
- newrsc = new Resource;
- _resMap.setVal(resId, newrsc);
- } else
- newrsc = _resMap.getVal(resId);
-
// Overwrite everything, because we're patching
- newrsc->_id = resId;
- newrsc->_status = kResStatusNoMalloc;
- newrsc->_source = source;
- newrsc->size = fsize - patchDataOffset - 2;
+ newrsc = updateResource(resId, source, fsize - patchDataOffset - 2);
newrsc->_headerSize = patchDataOffset;
newrsc->_fileOffset = 0;
+
+
debugC(1, kDebugLevelResMan, "Patching %s - OK", source->getLocationName().c_str());
}
@@ -1285,7 +1277,6 @@ void ResourceManager::readResourcePatches(ResourceSource *source) {
int ResourceManager::readResourceMapSCI0(ResourceSource *map) {
Common::SeekableReadStream *fileStream = 0;
- Resource *res;
ResourceType type;
uint16 number, id;
uint32 offset;
@@ -1323,9 +1314,8 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) {
ResourceId resId = ResourceId(type, number);
// adding a new resource
if (_resMap.contains(resId) == false) {
- res = new Resource;
- res->_source = findVolume(map, offset >> bShift);
- if (!res->_source) {
+ ResourceSource *source = findVolume(map, offset >> bShift);
+ if (!source) {
warning("Could not get volume for resource %d, VolumeID %d", id, offset >> bShift);
if (_mapVersion != _volVersion) {
warning("Retrying with the detected volume version instead");
@@ -1333,12 +1323,11 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) {
_mapVersion = _volVersion;
bMask = (_mapVersion == kResVersionSci1Middle) ? 0xF0 : 0xFC;
bShift = (_mapVersion == kResVersionSci1Middle) ? 28 : 26;
- res->_source = findVolume(map, offset >> bShift);
+ source = findVolume(map, offset >> bShift);
}
}
- res->_fileOffset = offset & (((~bMask) << 24) | 0xFFFFFF);
- res->_id = resId;
- _resMap.setVal(resId, res);
+
+ addResource(resId, source, offset & (((~bMask) << 24) | 0xFFFFFF));
}
} while (!fileStream->eos());
@@ -1348,7 +1337,6 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) {
int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
Common::SeekableReadStream *fileStream = 0;
- Resource *res;
if (map->_resourceFile) {
fileStream = map->_resourceFile->createReadStream();
@@ -1409,16 +1397,11 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) {
resId = ResourceId((ResourceType)type, number);
// adding new resource only if it does not exist
if (_resMap.contains(resId) == false) {
- res = new Resource;
- _resMap.setVal(resId, res);
- res->_id = resId;
-
// NOTE: We add the map's volume number here to the specified volume number
// for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers
// need to be used in concurrence with the volume specified in the map to get
// the actual resource file.
- res->_source = findVolume(map, volume_nr + map->_volumeNumber);
- res->_fileOffset = off;
+ addResource(resId, findVolume(map, volume_nr + map->_volumeNumber), off);
}
}
}
@@ -1494,21 +1477,8 @@ void MacResourceForkResourceSource::scanSource() {
ResourceId resId = ResourceId(type, idArray[j]);
- Resource *newrsc = NULL;
-
- // Prepare destination, if neccessary. Resource forks may contain patches.
- if (!resMan->_resMap.contains(resId)) {
- newrsc = new Resource;
- resMan->_resMap.setVal(resId, newrsc);
- } else
- newrsc = resMan->_resMap.getVal(resId);
-
- // Overwrite everything
- newrsc->_id = resId;
- newrsc->_status = kResStatusNoMalloc;
- newrsc->_source = this;
- newrsc->size = fileSize;
- newrsc->_headerSize = 0;
+ // Overwrite Resource instance. Resource forks may contain patches.
+ resMan->updateResource(resId, this, fileSize);
}
}
}
@@ -1525,6 +1495,26 @@ void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32
}
}
+Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, uint32 size) {
+ // Update a patched resource, whether it exists or not
+ Resource *res = 0;
+
+ if (_resMap.contains(resId)) {
+ res = _resMap.getVal(resId);
+ } else {
+ res = new Resource;
+ _resMap.setVal(resId, res);
+ }
+
+ res->_id = resId;
+ res->_status = kResStatusNoMalloc;
+ res->_source = src;
+ res->_headerSize = 0;
+ res->size = size;
+
+ return res;
+}
+
int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file,
uint32 &szPacked, ResourceCompression &compression) {
// SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes
diff --git a/engines/sci/resource.h b/engines/sci/resource.h
index db8a1c2a47..09d87eb9e3 100644
--- a/engines/sci/resource.h
+++ b/engines/sci/resource.h
@@ -395,6 +395,7 @@ protected:
int decompress(Resource *res, Common::SeekableReadStream *file);
int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression);
void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0);
+ Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size);
void removeAudioResource(ResourceId resId);
/**--- Resource map decoding functions ---*/
diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp
index 4df2f6515b..26ea96fb6c 100644
--- a/engines/sci/resource_audio.cpp
+++ b/engines/sci/resource_audio.cpp
@@ -170,24 +170,11 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) {
void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) {
ResourceSource *resSrc = new WaveResourceSource(name);
+ Common::File file;
+ file.open(name);
- Resource *newRes = 0;
-
- if (_resMap.contains(resourceId)) {
- newRes = _resMap.getVal(resourceId);
- } else {
- newRes = new Resource;
- _resMap.setVal(resourceId, newRes);
- }
-
- Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name);
- newRes->size = stream->size();
- delete stream;
+ updateResource(resourceId, resSrc, name.size());
- newRes->_id = resourceId;
- newRes->_status = kResStatusNoMalloc;
- newRes->_source = resSrc;
- newRes->_headerSize = 0;
debugC(1, kDebugLevelResMan, "Patching %s - OK", name.c_str());
}
diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h
index 209f3720b1..042c5428d8 100644
--- a/engines/sci/resource_intern.h
+++ b/engines/sci/resource_intern.h
@@ -170,6 +170,9 @@ public:
virtual void loadResource(Resource *res);
};
+/**
+ * Reads SCI1.1+ resources from a Mac resource fork.
+ */
class MacResourceForkResourceSource : public ResourceSource {
protected:
Common::MacResManager *_macResMan;
@@ -178,9 +181,6 @@ public:
MacResourceForkResourceSource(const Common::String &name, int volNum);
~MacResourceForkResourceSource();
- /**
- * Reads the SCI1.1+ resource file from a Mac resource fork.
- */
virtual void scanSource();
virtual void loadResource(Resource *res);