[Scummvm-cvs-logs] scummvm master -> 9d5ee9cba0d1881296a14eb4385029afb3258c1f

m-kiewitz m_kiewitz at users.sourceforge.net
Sat Jan 2 21:48:55 CET 2016


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
9d5ee9cba0 SCI: fix sciAudio support on some platforms


Commit: 9d5ee9cba0d1881296a14eb4385029afb3258c1f
    https://github.com/scummvm/scummvm/commit/9d5ee9cba0d1881296a14eb4385029afb3258c1f
Author: Martin Kiewitz (m_kiewitz at users.sourceforge.net)
Date: 2016-01-02T21:50:35+01:00

Commit Message:
SCI: fix sciAudio support on some platforms

The old code expected sciAudio FOpen calls to fail, because they
contained a directory name. On AmigaOS those calls succeeded.
Because of that at least on AmigaOS, sciAudio support didn't
work at all.

We now detect sciAudio FOpen calls and return a proper virtual file
handle. This should fix it on all platforms.

Also moved the SCI32 virtual save file handle from 200 to 32100.

Changed paths:
    engines/sci/engine/file.cpp
    engines/sci/engine/file.h
    engines/sci/engine/kfile.cpp



diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp
index 623caec..49e6e17 100644
--- a/engines/sci/engine/file.cpp
+++ b/engines/sci/engine/file.cpp
@@ -129,7 +129,7 @@ reg_t file_open(EngineState *s, const Common::String &filename, int mode, bool u
 }
 
 FileHandle *getFileFromHandle(EngineState *s, uint handle) {
-	if (handle == 0 || handle == VIRTUALFILE_HANDLE) {
+	if (handle == 0 || handle >= VIRTUALFILE_HANDLE_START) {
 		error("Attempt to use invalid file handle (%d)", handle);
 		return 0;
 	}
diff --git a/engines/sci/engine/file.h b/engines/sci/engine/file.h
index 052eb73..f43958c 100644
--- a/engines/sci/engine/file.h
+++ b/engines/sci/engine/file.h
@@ -41,8 +41,10 @@ enum {
 	MAX_SAVEGAME_NR = 20 /**< Maximum number of savegames */
 };
 
-#define VIRTUALFILE_HANDLE 200
+#define VIRTUALFILE_HANDLE_START 32000
+#define VIRTUALFILE_HANDLE_SCI32SAVE 32100
 #define PHANTASMAGORIA_SAVEGAME_INDEX "phantsg.dir"
+#define VIRTUALFILE_HANDLE_SCIAUDIO 32300
 
 struct SavegameDesc {
 	int16 id;
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index 61ac76d..80bd683 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -258,16 +258,21 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
 	}
 	debugC(kDebugLevelFile, "kFileIO(open): %s, 0x%x", name.c_str(), mode);
 
+	if (name.hasPrefix("sciAudio\\")) {
+		// fan-made sciAudio extension, don't create those files and instead return a virtual handle
+		return make_reg(0, VIRTUALFILE_HANDLE_SCIAUDIO);
+	}
+
 #ifdef ENABLE_SCI32
 	if (name == PHANTASMAGORIA_SAVEGAME_INDEX) {
 		if (s->_virtualIndexFile) {
-			return make_reg(0, VIRTUALFILE_HANDLE);
+			return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
 		} else {
 			Common::String englishName = g_sci->getSciLanguageString(name, K_LANG_ENGLISH);
 			Common::String wrappedName = g_sci->wrapFilename(englishName);
 			if (!g_sci->getSaveFileManager()->listSavefiles(wrappedName).empty()) {
 				s->_virtualIndexFile = new VirtualIndexFile(wrappedName);
-				return make_reg(0, VIRTUALFILE_HANDLE);
+				return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
 			}
 		}
 	}
@@ -320,7 +325,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
 			s->_virtualIndexFile->write("\0", 1);
 			s->_virtualIndexFile->write("\0", 1);	// Spot description (empty)
 			s->_virtualIndexFile->seek(0, SEEK_SET);
-			return make_reg(0, VIRTUALFILE_HANDLE);
+			return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE);
 		}
 	}
 #endif
@@ -346,12 +351,17 @@ reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) {
 	uint16 handle = argv[0].toUint16();
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE) {
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
 		s->_virtualIndexFile->close();
 		return SIGNAL_REG;
 	}
 #endif
 
+	if (handle >= VIRTUALFILE_HANDLE_START) {
+		// it's a virtual handle? ignore it
+		return SIGNAL_REG;
+	}
+
 	FileHandle *f = getFileFromHandle(s, handle);
 	if (f) {
 		f->close();
@@ -373,7 +383,7 @@ reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv) {
 	debugC(kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size);
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE) {
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
 		bytesRead = s->_virtualIndexFile->read(buf, size);
 	} else {
 #endif
@@ -403,7 +413,7 @@ reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv) {
 	debugC(kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size);
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE) {
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
 		s->_virtualIndexFile->write(buf, size);
 		success = true;
 	} else {
@@ -480,7 +490,7 @@ reg_t kFileIOReadString(EngineState *s, int argc, reg_t *argv) {
 	uint32 bytesRead;
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE)
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE)
 		bytesRead = s->_virtualIndexFile->readLine(buf, maxsize);
 	else
 #endif
@@ -503,7 +513,7 @@ reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
 	// We skip creating these files, and instead handle the calls
 	// directly. Since the sciAudio calls are only creating text files,
 	// this is probably the most straightforward place to handle them.
-	if (handle == 0xFFFF && str.hasPrefix("(sciAudio")) {
+	if (handle == VIRTUALFILE_HANDLE_SCIAUDIO) {
 		Common::List<ExecStack>::const_iterator iter = s->_executionStack.reverse_begin();
 		iter--;	// sciAudio
 		iter--;	// sciAudio child
@@ -512,7 +522,7 @@ reg_t kFileIOWriteString(EngineState *s, int argc, reg_t *argv) {
 	}
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE) {
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
 		s->_virtualIndexFile->write(str.c_str(), str.size());
 		return NULL_REG;
 	}
@@ -539,7 +549,7 @@ reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv) {
 	debugC(kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence);
 
 #ifdef ENABLE_SCI32
-	if (handle == VIRTUALFILE_HANDLE)
+	if (handle == VIRTUALFILE_HANDLE_SCI32SAVE)
 		return make_reg(0, s->_virtualIndexFile->seek(offset, whence));
 #endif
 






More information about the Scummvm-git-logs mailing list