aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/file.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/file.cpp')
-rw-r--r--engines/sci/engine/file.cpp33
1 files changed, 26 insertions, 7 deletions
diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index d46d68d9df..75aa4fa2ca 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -78,7 +78,7 @@ class SaveFileRewriteStream : public MemoryDynamicRWStream {
public:
SaveFileRewriteStream(Common::String fileName,
Common::SeekableReadStream *inFile,
- bool truncate, bool compress);
+ kFileOpenMode mode, bool compress);
virtual ~SaveFileRewriteStream();
virtual uint32 write(const void *dataPtr, uint32 dataSize) { _changed = true; return MemoryDynamicRWStream::write(dataPtr, dataSize); }
@@ -93,15 +93,21 @@ protected:
SaveFileRewriteStream::SaveFileRewriteStream(Common::String fileName,
Common::SeekableReadStream *inFile,
- bool truncate,
+ kFileOpenMode mode,
bool compress)
: MemoryDynamicRWStream(DisposeAfterUse::YES),
_fileName(fileName), _compress(compress)
{
+ const bool truncate = mode == _K_FILE_MODE_CREATE;
+ const bool seekToEnd = mode == _K_FILE_MODE_OPEN_OR_CREATE;
+
if (!truncate && inFile) {
unsigned int s = inFile->size();
ensureCapacity(s);
inFile->read(_data, s);
+ if (seekToEnd) {
+ seek(0, SEEK_END);
+ }
_changed = false;
} else {
_changed = true;
@@ -162,7 +168,7 @@ uint findFreeFileHandle(EngineState *s) {
* for reading only.
*/
-reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool unwrapFilename) {
+reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mode, bool unwrapFilename) {
Common::String englishName = g_sci->getSciLanguageString(filename, K_LANG_ENGLISH);
englishName.toLowercase();
@@ -194,14 +200,22 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u
if (s->currentRoomNumber() == 52)
isCompressed = false;
break;
+#ifdef ENABLE_SCI32
+ // Phantasmagoria game scripts create their own save files, so they are
+ // interoperable with the original interpreter just by renaming them as long
+ // as they are not compressed. They are also never larger than a couple
+ // hundred bytes, so compression does not do much here anyway
+ case GID_PHANTASMAGORIA:
+ isCompressed = false;
+ break;
+#endif
default:
break;
}
#ifdef ENABLE_SCI32
- if (mode != _K_FILE_MODE_OPEN_OR_FAIL && (
- (g_sci->getGameId() == GID_PHANTASMAGORIA && (filename == "phantsg.dir" || filename == "chase.dat")) ||
- (g_sci->getGameId() == GID_PQSWAT && filename == "swat.dat"))) {
+ if ((g_sci->getGameId() == GID_PHANTASMAGORIA && (filename == "phantsg.dir" || filename == "chase.dat" || filename == "tmp.dat")) ||
+ (g_sci->getGameId() == GID_PQSWAT && filename == "swat.dat")) {
debugC(kDebugLevelFile, " -> file_open opening %s for rewriting", wrappedName.c_str());
inFile = saveFileMan->openForLoading(wrappedName);
@@ -210,8 +224,13 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u
if (!inFile)
inFile = SearchMan.createReadStreamForMember(englishName);
+ if (mode == _K_FILE_MODE_OPEN_OR_FAIL && !inFile) {
+ debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str());
+ return SIGNAL_REG;
+ }
+
SaveFileRewriteStream *stream;
- stream = new SaveFileRewriteStream(wrappedName, inFile, mode == _K_FILE_MODE_CREATE, isCompressed);
+ stream = new SaveFileRewriteStream(wrappedName, inFile, mode, isCompressed);
delete inFile;