diff options
author | Colin Snover | 2017-09-22 23:59:34 -0500 |
---|---|---|
committer | Colin Snover | 2017-09-23 20:37:51 -0500 |
commit | b3c27c2159a1e6d5d775d76a98dd5f4ca4315616 (patch) | |
tree | 2a1f493d687b0023195fa3729289380875e92ef4 | |
parent | 0ceab96e9193c94e21c91e595da1d05a792b3946 (diff) | |
download | scummvm-rg350-b3c27c2159a1e6d5d775d76a98dd5f4ca4315616.tar.gz scummvm-rg350-b3c27c2159a1e6d5d775d76a98dd5f4ca4315616.tar.bz2 scummvm-rg350-b3c27c2159a1e6d5d775d76a98dd5f4ca4315616.zip |
SCI: Clean-ups to file handling code
Preparations for adding support for RAMA's custom save game format.
-rw-r--r-- | engines/sci/engine/file.cpp | 153 | ||||
-rw-r--r-- | engines/sci/engine/file.h | 74 | ||||
-rw-r--r-- | engines/sci/engine/kfile.cpp | 73 | ||||
-rw-r--r-- | engines/sci/engine/kgraphics.cpp | 2 |
4 files changed, 158 insertions, 144 deletions
diff --git a/engines/sci/engine/file.cpp b/engines/sci/engine/file.cpp index 7e218bc81c..f3c04dd48c 100644 --- a/engines/sci/engine/file.cpp +++ b/engines/sci/engine/file.cpp @@ -34,28 +34,7 @@ namespace Sci { #ifdef ENABLE_SCI32 -/** - * A MemoryWriteStreamDynamic with additional read functionality. - * The read and write functions share a single stream position. - */ -class MemoryDynamicRWStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream { -protected: - bool _eos; -public: - MemoryDynamicRWStream(DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) : MemoryWriteStreamDynamic(disposeMemory), _eos(false) { } - - uint32 read(void *dataPtr, uint32 dataSize); - - bool eos() const { return _eos; } - int32 pos() const { return _pos; } - int32 size() const { return _size; } - void clearErr() { _eos = false; Common::MemoryWriteStreamDynamic::clearErr(); } - bool seek(int32 offs, int whence = SEEK_SET) { return Common::MemoryWriteStreamDynamic::seek(offs, whence); } - -}; - -uint32 MemoryDynamicRWStream::read(void *dataPtr, uint32 dataSize) -{ +uint32 MemoryDynamicRWStream::read(void *dataPtr, uint32 dataSize) { // Read at most as many bytes as are still available... if (dataSize > _size - _pos) { dataSize = _size - _pos; @@ -69,40 +48,18 @@ uint32 MemoryDynamicRWStream::read(void *dataPtr, uint32 dataSize) return dataSize; } -/** - * A MemoryDynamicRWStream intended to re-write a file. - * It reads the contents of `inFile` in the constructor, and writes back - * the changes to `fileName` in the destructor (and when calling commit() ). - */ -class SaveFileRewriteStream : public MemoryDynamicRWStream { -public: - SaveFileRewriteStream(Common::String fileName, - Common::SeekableReadStream *inFile, - kFileOpenMode mode, bool compress); - virtual ~SaveFileRewriteStream(); - - virtual uint32 write(const void *dataPtr, uint32 dataSize) { _changed = true; return MemoryDynamicRWStream::write(dataPtr, dataSize); } - - void commit(); //< Save back to disk - -protected: - Common::String _fileName; - bool _compress; - bool _changed; -}; - -SaveFileRewriteStream::SaveFileRewriteStream(Common::String fileName, +SaveFileRewriteStream::SaveFileRewriteStream(const Common::String &fileName, Common::SeekableReadStream *inFile, 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; + bool compress) : + MemoryDynamicRWStream(DisposeAfterUse::YES), + _fileName(fileName), + _compress(compress) { + const bool truncate = (mode == kFileOpenModeCreate); + const bool seekToEnd = (mode == kFileOpenModeOpenOrCreate); if (!truncate && inFile) { - unsigned int s = inFile->size(); + const uint s = inFile->size(); ensureCapacity(s); inFile->read(_data, s); if (seekToEnd) { @@ -119,16 +76,14 @@ SaveFileRewriteStream::~SaveFileRewriteStream() { } void SaveFileRewriteStream::commit() { - // Write contents of buffer back to file - - if (_changed) { - Common::WriteStream *outFile = g_sci->getSaveFileManager()->openForSaving(_fileName, _compress); - outFile->write(_data, _size); - delete outFile; - _changed = false; + if (!_changed) { + return; } -} + Common::ScopedPtr<Common::WriteStream> outFile(g_sci->getSaveFileManager()->openForSaving(_fileName, _compress)); + outFile->write(_data, _size); + _changed = false; +} #endif uint findFreeFileHandle(EngineState *s) { @@ -217,8 +172,19 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo } #ifdef ENABLE_SCI32 - if ((g_sci->getGameId() == GID_PHANTASMAGORIA && (filename == "phantsg.dir" || filename == "chase.dat" || filename == "tmp.dat")) || - (g_sci->getGameId() == GID_PQSWAT && filename == "swat.dat")) { + bool isRewritableFile; + switch (g_sci->getGameId()) { + case GID_PHANTASMAGORIA: + isRewritableFile = (filename == "phantsg.dir" || filename == "chase.dat" || filename == "tmp.dat"); + break; + case GID_PQSWAT: + isRewritableFile = (filename == "swat.dat"); + break; + default: + isRewritableFile = false; + } + + if (isRewritableFile) { debugC(kDebugLevelFile, " -> file_open opening %s for rewriting", wrappedName.c_str()); inFile = saveFileMan->openForLoading(wrappedName); @@ -227,8 +193,8 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo 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()); + if (mode == kFileOpenModeOpenOrFail && !inFile) { + debugC(kDebugLevelFile, " -> file_open(kFileOpenModeOpenOrFail): failed to open file '%s'", englishName.c_str()); return SIGNAL_REG; } @@ -241,7 +207,7 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo outFile = stream; } else #endif - if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { + if (mode == kFileOpenModeOpenOrFail) { // Try to open file, abort if not possible inFile = saveFileMan->openForLoading(wrappedName); // If no matching savestate exists: fall back to reading from a regular @@ -250,19 +216,19 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo inFile = SearchMan.createReadStreamForMember(englishName); if (!inFile) - debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_OPEN_OR_FAIL): failed to open file '%s'", englishName.c_str()); - } else if (mode == _K_FILE_MODE_CREATE) { + debugC(kDebugLevelFile, " -> file_open(kFileOpenModeOpenOrFail): failed to open file '%s'", englishName.c_str()); + } else if (mode == kFileOpenModeCreate) { // Create the file, destroying any content it might have had outFile = saveFileMan->openForSaving(wrappedName, isCompressed); if (!outFile) - debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); - } else if (mode == _K_FILE_MODE_OPEN_OR_CREATE) { + debugC(kDebugLevelFile, " -> file_open(kFileOpenModeCreate): failed to create file '%s'", englishName.c_str()); + } else if (mode == kFileOpenModeOpenOrCreate) { // Try to open file, create it if it doesn't exist outFile = saveFileMan->openForSaving(wrappedName, isCompressed); if (!outFile) - debugC(kDebugLevelFile, " -> file_open(_K_FILE_MODE_CREATE): failed to create file '%s'", englishName.c_str()); + debugC(kDebugLevelFile, " -> file_open(kFileOpenModeCreate): failed to create file '%s'", englishName.c_str()); - // QfG1 opens the character export file with _K_FILE_MODE_CREATE first, + // QfG1 opens the character export file with kFileOpenModeCreate first, // closes it immediately and opens it again with this here. Perhaps // other games use this for read access as well. I guess changing this // whole code into using virtual files and writing them after close @@ -287,7 +253,7 @@ reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mo } FileHandle *getFileFromHandle(EngineState *s, uint handle) { - if ((handle == 0) || ((handle >= VIRTUALFILE_HANDLE_START) && (handle <= VIRTUALFILE_HANDLE_END))) { + if ((handle == 0) || ((handle >= kVirtualFileHandleStart) && (handle <= kVirtualFileHandleEnd))) { error("Attempt to use invalid file handle (%d)", handle); return 0; } @@ -333,38 +299,34 @@ static bool _savegame_sort_byDate(const SavegameDesc &l, const SavegameDesc &r) return (l.time > r.time); } -bool fillSavegameDesc(const Common::String &filename, SavegameDesc *desc) { +bool fillSavegameDesc(const Common::String &filename, SavegameDesc &desc) { Common::SaveFileManager *saveFileMan = g_sci->getSaveFileManager(); - Common::SeekableReadStream *in; - if ((in = saveFileMan->openForLoading(filename)) == nullptr) { + Common::ScopedPtr<Common::SeekableReadStream> in(saveFileMan->openForLoading(filename)); + if (!in) { return false; } SavegameMetadata meta; - if (!get_savegame_metadata(in, &meta) || meta.name.empty()) { - // invalid - delete in; + if (!get_savegame_metadata(in.get(), &meta) || meta.name.empty()) { return false; } - delete in; const int id = strtol(filename.end() - 3, NULL, 10); - desc->id = id; - desc->date = meta.saveDate; + desc.id = id; // We need to fix date in here, because we save DDMMYYYY instead of // YYYYMMDD, so sorting wouldn't work - desc->date = ((desc->date & 0xFFFF) << 16) | ((desc->date & 0xFF0000) >> 8) | ((desc->date & 0xFF000000) >> 24); - desc->time = meta.saveTime; - desc->version = meta.version; - desc->gameVersion = meta.gameVersion; - desc->script0Size = meta.script0Size; - desc->gameObjectOffset = meta.gameObjectOffset; + desc.date = ((meta.saveDate & 0xFFFF) << 16) | ((meta.saveDate & 0xFF0000) >> 8) | ((meta.saveDate & 0xFF000000) >> 24); + desc.time = meta.saveTime; + desc.version = meta.version; + desc.gameVersion = meta.gameVersion; + desc.script0Size = meta.script0Size; + desc.gameObjectOffset = meta.gameObjectOffset; #ifdef ENABLE_SCI32 if (g_sci->getGameId() == GID_SHIVERS) { - desc->lowScore = meta.lowScore; - desc->highScore = meta.highScore; + desc.lowScore = meta.lowScore; + desc.highScore = meta.highScore; } else if (g_sci->getGameId() == GID_MOTHERGOOSEHIRES) { - desc->avatarId = meta.avatarId; + desc.avatarId = meta.avatarId; } #endif @@ -372,10 +334,10 @@ bool fillSavegameDesc(const Common::String &filename, SavegameDesc *desc) { meta.name.deleteLastChar(); // At least Phant2 requires use of strncpy, since it creates save game - // names of exactly SCI_MAX_SAVENAME_LENGTH - strncpy(desc->name, meta.name.c_str(), SCI_MAX_SAVENAME_LENGTH); + // names of exactly kMaxSaveNameLength + strncpy(desc.name, meta.name.c_str(), kMaxSaveNameLength); - return desc; + return true; } // Create an array containing all found savedgames, sorted by creation date @@ -394,8 +356,9 @@ void listSavegames(Common::Array<SavegameDesc> &saves) { #endif SavegameDesc desc; - fillSavegameDesc(filename, &desc); - saves.push_back(desc); + if (fillSavegameDesc(filename, desc)) { + saves.push_back(desc); + } } // Sort the list by creation date of the saves diff --git a/engines/sci/engine/file.h b/engines/sci/engine/file.h index 1657dd3c7c..28a3c5801b 100644 --- a/engines/sci/engine/file.h +++ b/engines/sci/engine/file.h @@ -23,20 +23,21 @@ #ifndef SCI_ENGINE_FILE_H #define SCI_ENGINE_FILE_H +#include "common/memstream.h" #include "common/str-array.h" #include "common/stream.h" namespace Sci { enum kFileOpenMode { - _K_FILE_MODE_OPEN_OR_CREATE = 0, - _K_FILE_MODE_OPEN_OR_FAIL = 1, - _K_FILE_MODE_CREATE = 2 + kFileOpenModeOpenOrCreate = 0, + kFileOpenModeOpenOrFail = 1, + kFileOpenModeCreate = 2 }; enum { - SCI_MAX_SAVENAME_LENGTH = 36, ///< Maximum length of a savegame name (including optional terminator character). - MAX_SAVEGAME_NR = 20 ///< Maximum number of savegames + kMaxSaveNameLength = 36, ///< Maximum length of a savegame name (including optional terminator character). + kMaxNumSaveGames = 20 ///< Maximum number of savegames }; #ifdef ENABLE_SCI32 @@ -51,10 +52,12 @@ enum { }; #endif -#define VIRTUALFILE_HANDLE_START 32000 -#define VIRTUALFILE_HANDLE_SCI32SAVE 32100 -#define VIRTUALFILE_HANDLE_SCIAUDIO 32300 -#define VIRTUALFILE_HANDLE_END 32300 +enum { + kVirtualFileHandleStart = 32000, + kVirtualFileHandleSci32Save = 32100, + kVirtualFileHandleSciAudio = 32300, + kVirtualFileHandleEnd = 32300 +}; struct SavegameDesc { int16 id; @@ -62,7 +65,7 @@ struct SavegameDesc { int date; int time; int version; - char name[SCI_MAX_SAVENAME_LENGTH]; + char name[kMaxSaveNameLength]; Common::String gameVersion; uint32 script0Size; uint32 gameObjectOffset; @@ -112,7 +115,58 @@ private: void addAsVirtualFiles(Common::String title, Common::String fileMask); }; +#ifdef ENABLE_SCI32 +/** + * A MemoryWriteStreamDynamic with additional read functionality. + * The read and write functions share a single stream position. + */ +class MemoryDynamicRWStream : public Common::MemoryWriteStreamDynamic, public Common::SeekableReadStream { +public: + MemoryDynamicRWStream(DisposeAfterUse::Flag disposeMemory = DisposeAfterUse::NO) : MemoryWriteStreamDynamic(disposeMemory), _eos(false) { } + + uint32 read(void *dataPtr, uint32 dataSize); + + bool eos() const { return _eos; } + int32 pos() const { return _pos; } + int32 size() const { return _size; } + void clearErr() { _eos = false; Common::MemoryWriteStreamDynamic::clearErr(); } + bool seek(int32 offs, int whence = SEEK_SET) { return Common::MemoryWriteStreamDynamic::seek(offs, whence); } + +protected: + bool _eos; +}; + +/** + * A MemoryDynamicRWStream intended to re-write a file. + * It reads the contents of `inFile` in the constructor, and writes back + * the changes to `fileName` in the destructor (and when calling commit() ). + */ +class SaveFileRewriteStream : public MemoryDynamicRWStream { +public: + SaveFileRewriteStream(const Common::String &fileName, + Common::SeekableReadStream *inFile, + kFileOpenMode mode, bool compress); + virtual ~SaveFileRewriteStream(); + + virtual uint32 write(const void *dataPtr, uint32 dataSize) { _changed = true; return MemoryDynamicRWStream::write(dataPtr, dataSize); } + + void commit(); //< Save back to disk + +protected: + Common::String _fileName; + bool _compress; + bool _changed; +}; + +#endif + uint findFreeFileHandle(EngineState *s); +reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mode, bool unwrapFilename); +FileHandle *getFileFromHandle(EngineState *s, uint handle); +int fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle); +void listSavegames(Common::Array<SavegameDesc> &saves); +int findSavegame(Common::Array<SavegameDesc> &saves, int16 savegameId); +bool fillSavegameDesc(const Common::String &filename, SavegameDesc &desc); } // End of namespace Sci diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index 3b8420849a..b5aac43d10 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -48,13 +48,6 @@ namespace Sci { -extern reg_t file_open(EngineState *s, const Common::String &filename, kFileOpenMode mode, bool unwrapFilename); -extern FileHandle *getFileFromHandle(EngineState *s, uint handle); -extern int fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle); -extern void listSavegames(Common::Array<SavegameDesc> &saves); -extern int findSavegame(Common::Array<SavegameDesc> &saves, int16 savegameId); -extern bool fillSavegameDesc(const Common::String &filename, SavegameDesc *desc); - /** * Writes the cwd to the supplied address and returns the address in acc. */ @@ -319,11 +312,11 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { if (g_sci->getGameId() == GID_SHIVERS && name.hasSuffix(".SG")) { // Shivers stores the name and score of save games in separate %d.SG // files, which are used by the save/load screen - if (mode == _K_FILE_MODE_OPEN_OR_CREATE || mode == _K_FILE_MODE_CREATE) { + if (mode == kFileOpenModeOpenOrCreate || mode == kFileOpenModeCreate) { // Suppress creation of the SG file, since it is not necessary debugC(kDebugLevelFile, "Not creating unused file %s", name.c_str()); return SIGNAL_REG; - } else if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { + } else if (mode == kFileOpenModeOpenOrFail) { // Create a virtual file containing the save game description // and current score progress, as the game scripts expect. int saveNo; @@ -331,7 +324,9 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { saveNo += kSaveIdShift; SavegameDesc save; - fillSavegameDesc(g_sci->getSavegameName(saveNo), &save); + if (!fillSavegameDesc(g_sci->getSavegameName(saveNo), save)) { + return SIGNAL_REG; + } Common::String score; if (!save.highScore) { @@ -340,9 +335,9 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { score = Common::String::format("%u%03u", save.highScore, save.lowScore); } - const uint nameLength = Common::strnlen(save.name, SCI_MAX_SAVENAME_LENGTH); + const uint nameLength = Common::strnlen(save.name, kMaxSaveNameLength); const uint size = nameLength + /* \r\n */ 2 + score.size(); - char *buffer = (char *)malloc(size); + byte *buffer = (byte *)malloc(size); memcpy(buffer, save.name, nameLength); buffer[nameLength] = '\r'; buffer[nameLength + 1] = '\n'; @@ -350,7 +345,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { const uint handle = findFreeFileHandle(s); - s->_fileHandles[handle]._in = new Common::MemoryReadStream((byte *)buffer, size, DisposeAfterUse::YES); + s->_fileHandles[handle]._in = new Common::MemoryReadStream(buffer, size, DisposeAfterUse::YES); s->_fileHandles[handle]._out = nullptr; s->_fileHandles[handle]._name = ""; @@ -359,11 +354,11 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { } else if (g_sci->getGameId() == GID_MOTHERGOOSEHIRES && name.hasSuffix(".DTA")) { // MGDX stores the name and avatar ID in separate %d.DTA files, which // are used by the save/load screen - if (mode == _K_FILE_MODE_OPEN_OR_CREATE || mode == _K_FILE_MODE_CREATE) { + if (mode == kFileOpenModeOpenOrCreate || mode == kFileOpenModeCreate) { // Suppress creation of the DTA file, since it is not necessary debugC(kDebugLevelFile, "Not creating unused file %s", name.c_str()); return SIGNAL_REG; - } else if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { + } else if (mode == kFileOpenModeOpenOrFail) { // Create a virtual file containing the save game description // and avatar ID, as the game scripts expect. int saveNo; @@ -380,10 +375,12 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { saveNo += kSaveIdShift; SavegameDesc save; - fillSavegameDesc(g_sci->getSavegameName(saveNo), &save); + if (!fillSavegameDesc(g_sci->getSavegameName(saveNo), save)) { + return SIGNAL_REG; + } const Common::String avatarId = Common::String::format("%02d", save.avatarId); - const uint nameLength = Common::strnlen(save.name, SCI_MAX_SAVENAME_LENGTH); + const uint nameLength = Common::strnlen(save.name, kMaxSaveNameLength); const uint size = nameLength + /* \r\n */ 2 + avatarId.size() + 1; char *buffer = (char *)malloc(size); memcpy(buffer, save.name, nameLength); @@ -404,21 +401,21 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { // catalogue, but since we do not create catalogues for most SCI32 // games, ignore the write if (name == "temp.tmp") { - return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE); + return make_reg(0, kVirtualFileHandleSci32Save); } // KQ7 tries to read out game information from catalogues directly // instead of using the standard kSaveGetFiles function if (name == "kq7cdsg.cat") { - if (mode == _K_FILE_MODE_OPEN_OR_CREATE || mode == _K_FILE_MODE_CREATE) { + if (mode == kFileOpenModeOpenOrCreate || mode == kFileOpenModeCreate) { // Suppress creation of the catalogue file, since it is not necessary debugC(kDebugLevelFile, "Not creating unused file %s", name.c_str()); return SIGNAL_REG; - } else if (mode == _K_FILE_MODE_OPEN_OR_FAIL) { + } else if (mode == kFileOpenModeOpenOrFail) { Common::Array<SavegameDesc> saves; listSavegames(saves); - const uint recordSize = sizeof(int16) + SCI_MAX_SAVENAME_LENGTH; + const uint recordSize = sizeof(int16) + kMaxSaveNameLength; const uint numSaves = MIN<uint>(saves.size(), 10); const uint size = numSaves * recordSize + /* terminator */ 2; byte *const buffer = (byte *)malloc(size); @@ -426,7 +423,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { byte *out = buffer; for (uint i = 0; i < numSaves; ++i) { WRITE_UINT16(out, saves[i].id - kSaveIdShift); - strncpy((char *)out + sizeof(int16), saves[i].name, SCI_MAX_SAVENAME_LENGTH); + strncpy((char *)out + sizeof(int16), saves[i].name, kMaxSaveNameLength); out += recordSize; } WRITE_UINT16(out, 0xFFFF); @@ -453,7 +450,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { // See kMakeSaveCatName if (name == "fake.cat") { - return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE); + return make_reg(0, kVirtualFileHandleSci32Save); } if (isSaveCatalogue(name)) { @@ -461,7 +458,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { if (exists) { // Dummy handle is used to represent the catalogue and ignore any // direct game script writes - return make_reg(0, VIRTUALFILE_HANDLE_SCI32SAVE); + return make_reg(0, kVirtualFileHandleSci32Save); } else { return SIGNAL_REG; } @@ -472,7 +469,7 @@ reg_t kFileIOOpen(EngineState *s, int argc, reg_t *argv) { 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); + return make_reg(0, kVirtualFileHandleSciAudio); } // QFG import rooms get a virtual filelisting instead of an actual one @@ -495,7 +492,7 @@ reg_t kFileIOClose(EngineState *s, int argc, reg_t *argv) { uint16 handle = argv[0].toUint16(); - if (handle >= VIRTUALFILE_HANDLE_START) { + if (handle >= kVirtualFileHandleStart) { // it's a virtual handle? ignore it return getSciVersion() >= SCI_VERSION_2 ? TRUE_REG : SIGNAL_REG; } @@ -539,7 +536,7 @@ reg_t kFileIOWriteRaw(EngineState *s, int argc, reg_t *argv) { uint16 size = argv[2].toUint16(); #ifdef ENABLE_SCI32 - if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) { + if (handle == kVirtualFileHandleSci32Save) { return make_reg(0, size); } #endif @@ -673,7 +670,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 == VIRTUALFILE_HANDLE_SCIAUDIO) { + if (handle == kVirtualFileHandleSciAudio) { Common::List<ExecStack>::const_iterator iter = s->_executionStack.reverse_begin(); iter--; // sciAudio iter--; // sciAudio child @@ -872,7 +869,7 @@ reg_t kFileIOWriteWord(EngineState *s, int argc, reg_t *argv) { uint16 handle = argv[0].toUint16(); #ifdef ENABLE_SCI32 - if (handle == VIRTUALFILE_HANDLE_SCI32SAVE) { + if (handle == kVirtualFileHandleSci32Save) { return s->r_acc; } #endif @@ -1174,7 +1171,7 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { Common::Array<SavegameDesc> saves; listSavegames(saves); - uint totalSaves = MIN<uint>(saves.size(), MAX_SAVEGAME_NR); + uint totalSaves = MIN<uint>(saves.size(), kMaxNumSaveGames); Common::String game_id = s->_segMan->getString(argv[0]); @@ -1187,14 +1184,14 @@ reg_t kGetSaveFiles(EngineState *s, int argc, reg_t *argv) { totalSaves = 0; } - const uint bufSize = (totalSaves * SCI_MAX_SAVENAME_LENGTH) + 1; + const uint bufSize = (totalSaves * kMaxSaveNameLength) + 1; char *saveNames = new char[bufSize]; char *saveNamePtr = saveNames; for (uint i = 0; i < totalSaves; i++) { *slot++ = make_reg(0, saves[i].id + SAVEGAMEID_OFFICIALRANGE_START); // Store the virtual savegame ID (see above) strcpy(saveNamePtr, saves[i].name); - saveNamePtr += SCI_MAX_SAVENAME_LENGTH; + saveNamePtr += kMaxSaveNameLength; } *saveNamePtr = 0; // Terminate list @@ -1321,7 +1318,7 @@ reg_t kCheckSaveGame32(EngineState *s, int argc, reg_t *argv) { } SavegameDesc save; - if (!fillSavegameDesc(g_sci->getSavegameName(saveNo), &save)) { + if (!fillSavegameDesc(g_sci->getSavegameName(saveNo), save)) { return NULL_REG; } @@ -1369,19 +1366,19 @@ reg_t kGetSaveFiles32(EngineState *s, int argc, reg_t *argv) { // Normally SSCI limits to 20 games per directory, but ScummVM allows more // than that with games that use the standard save-load dialogue - descriptions.resize(SCI_MAX_SAVENAME_LENGTH * saves.size() + 1, true); + descriptions.resize(kMaxSaveNameLength * saves.size() + 1, true); saveIds.resize(saves.size() + 1, true); for (uint i = 0; i < saves.size(); ++i) { const SavegameDesc &save = saves[i]; - char *target = &descriptions.charAt(SCI_MAX_SAVENAME_LENGTH * i); + char *target = &descriptions.charAt(kMaxSaveNameLength * i); // At least Phant2 requires use of strncpy, since it creates save game - // names of exactly SCI_MAX_SAVENAME_LENGTH - strncpy(target, save.name, SCI_MAX_SAVENAME_LENGTH); + // names of exactly kMaxSaveNameLength + strncpy(target, save.name, kMaxSaveNameLength); saveIds.setFromInt16(i, save.id - kSaveIdShift); } - descriptions.charAt(SCI_MAX_SAVENAME_LENGTH * saves.size()) = '\0'; + descriptions.charAt(kMaxSaveNameLength * saves.size()) = '\0'; saveIds.setFromInt16(saves.size(), 0); return make_reg(0, saves.size()); diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 28e054bea9..e5336b37bc 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -932,7 +932,7 @@ void _k_GenericDrawControl(EngineState *s, reg_t controlObject, bool hilite) { } } - debugC(kDebugLevelGraphics, "drawing list control %04x:%04x to %d,%d, diff %d", PRINT_REG(controlObject), x, y, SCI_MAX_SAVENAME_LENGTH); + debugC(kDebugLevelGraphics, "drawing list control %04x:%04x to %d,%d", PRINT_REG(controlObject), x, y); g_sci->_gfxControls16->kernelDrawList(rect, controlObject, maxChars, listCount, listStrings, fontId, style, upperPos, cursorPos, isAlias, hilite); delete[] listStrings; return; |