aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorColin Snover2016-09-13 10:44:18 -0500
committerColin Snover2016-09-29 19:39:16 -0500
commita96dc1a7b879994ab5111ed223e9831ea81054b9 (patch)
tree77351ac6c6b93ce0d71a41e0d0570fdb98e746b5 /engines/sci
parent10f450917cc484242893322aeb966cec67d6fd68 (diff)
downloadscummvm-rg350-a96dc1a7b879994ab5111ed223e9831ea81054b9.tar.gz
scummvm-rg350-a96dc1a7b879994ab5111ed223e9831ea81054b9.tar.bz2
scummvm-rg350-a96dc1a7b879994ab5111ed223e9831ea81054b9.zip
SCI32: Correct return values for kFileIO operations
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/kfile.cpp38
1 files changed, 34 insertions, 4 deletions
diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp
index 41aa16b16f..7e5af79b23 100644
--- a/engines/sci/engine/kfile.cpp
+++ b/engines/sci/engine/kfile.cpp
@@ -238,6 +238,8 @@ reg_t kFileIO(EngineState *s, int argc, reg_t *argv) {
reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) {
Common::String name = s->_segMan->getString(argv[0]);
+ assert(name != "");
+
int mode = argv[1].toUint16();
bool unwrapFilename = true;
@@ -380,7 +382,7 @@ reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) {
if (handle >= VIRTUALFILE_HANDLE_START) {
// it's a virtual handle? ignore it
- return SIGNAL_REG;
+ return getSciVersion() >= SCI_VERSION_2 ? TRUE_REG : SIGNAL_REG;
}
FileHandle *f = getFileFromHandle(s, handle);
@@ -388,7 +390,7 @@ reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) {
f->close();
if (getSciVersion() <= SCI_VERSION_0_LATE)
return s->r_acc; // SCI0 semantics: no value returned
- return SIGNAL_REG;
+ return getSciVersion() >= SCI_VERSION_2 ? TRUE_REG : SIGNAL_REG;
}
if (getSciVersion() <= SCI_VERSION_0_LATE)
@@ -420,18 +422,37 @@ reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv) {
reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv) {
uint16 handle = argv[0].toUint16();
uint16 size = argv[2].toUint16();
+
+#ifdef ENABLE_SCI32
+ if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) {
+ return make_reg(0, size);
+ }
+#endif
+
char *buf = new char[size];
+ uint bytesWritten = 0;
bool success = false;
s->_segMan->memcpy((byte *)buf, argv[1], size);
debugC(kDebugLevelFile, "kFileIO(writeRaw): %d, %d", handle, size);
FileHandle *f = getFileFromHandle(s, handle);
if (f) {
- f->_out->write(buf, size);
- success = true;
+ bytesWritten = f->_out->write(buf, size);
+ success = !f->_out->err();
}
delete[] buf;
+
+#ifdef ENABLE_SCI32
+ if (getSciVersion() >= SCI_VERSION_2) {
+ if (!success) {
+ return make_reg(0, -1);
+ }
+
+ return make_reg(0, bytesWritten);
+ }
+#endif
+
if (success)
return NULL_REG;
return make_reg(0, 6); // DOS - invalid handle
@@ -461,6 +482,7 @@ reg_t kFileIOUnlink(EngineState *s, int argc, reg_t *argv) {
int savedir_nr = saves[slotNum].id;
name = g_sci->getSavegameName(savedir_nr);
result = saveFileMan->removeSavefile(name);
+#ifdef ENABLE_SCI32
} else if (getSciVersion() >= SCI_VERSION_2) {
// The file name may be already wrapped, so check both cases
result = saveFileMan->removeSavefile(name);
@@ -468,12 +490,20 @@ reg_t kFileIOUnlink(EngineState *s, int argc, reg_t *argv) {
const Common::String wrappedName = g_sci->wrapFilename(name);
result = saveFileMan->removeSavefile(wrappedName);
}
+#endif
} else {
const Common::String wrappedName = g_sci->wrapFilename(name);
result = saveFileMan->removeSavefile(wrappedName);
}
debugC(kDebugLevelFile, "kFileIO(unlink): %s", name.c_str());
+
+#ifdef ENABLE_SCI32
+ if (getSciVersion() >= SCI_VERSION_2) {
+ return make_reg(0, result);
+ }
+#endif
+
if (result)
return NULL_REG;
return make_reg(0, 2); // DOS - file not found error code