diff options
Diffstat (limited to 'engines/gargoyle/files.cpp')
-rw-r--r-- | engines/gargoyle/files.cpp | 79 |
1 files changed, 71 insertions, 8 deletions
diff --git a/engines/gargoyle/files.cpp b/engines/gargoyle/files.cpp index c3f1367c66..e14a315f09 100644 --- a/engines/gargoyle/files.cpp +++ b/engines/gargoyle/files.cpp @@ -21,12 +21,15 @@ */ #include "gargoyle/files.h" +#include "gargoyle/gargoyle.h" #include "gui/saveload.h" +#include "common/file.h" +#include "common/savefile.h" #include "common/translation.h" namespace Gargoyle { -frefid_t Files::prompt(glui32 usage, FileMode fmode, glui32 rock) { +frefid_t Files::createByPrompt(glui32 usage, FileMode fmode, glui32 rock) { switch (usage & fileusage_TypeMask) { case fileusage_SavedGame: { if (fmode == filemode_Write) { @@ -64,34 +67,94 @@ frefid_t Files::prompt(glui32 usage, FileMode fmode, glui32 rock) { } frefid_t Files::createRef(int slot, const Common::String &desc, glui32 usage, glui32 rock) { - _fileReferences.push_back(FileReference()); - frefid_t fref = &_fileReferences.back(); - + frefid_t fref = new FileReference(); fref->_slotNumber = slot; fref->_description = desc; fref->_textMode = ((usage & fileusage_TextMode) != 0); fref->_fileType = (FileUsage)(usage & fileusage_TypeMask); + + _fileReferences.push_back(FileRefArray::value_type(fref)); return fref; } frefid_t Files::createRef(const Common::String &filename, glui32 usage, glui32 rock) { - _fileReferences.push_back(FileReference()); - frefid_t fref = &_fileReferences.back(); - + frefid_t fref = new FileReference(); fref->_filename = filename; fref->_textMode = ((usage & fileusage_TextMode) != 0); fref->_fileType = (FileUsage)(usage & fileusage_TypeMask); + + _fileReferences.push_back(FileRefArray::value_type(fref)); return fref; } +frefid_t Files::createTemp(glui32 usage, glui32 rock) { + return createRef(Common::String::format("%s.tmp", g_vm->getTargetName().c_str()), + usage, rock); +} + +frefid_t Files::createFromRef(frefid_t fref, glui32 usage, glui32 rock) { + return createRef(fref->_filename, usage, rock); +} + void Files::deleteRef(frefid_t fref) { for (uint idx = 0; idx < _fileReferences.size(); ++idx) { - if (&_fileReferences[idx] == fref) { + if (_fileReferences[idx].get() == fref) { _fileReferences.remove_at(idx); return; } } } +frefid_t Files::iterate(frefid_t fref, glui32 *rock) { + // Find reference following the specified one + int index = -1; + for (uint idx = 0; idx < _fileReferences.size(); ++idx) { + if (fref == nullptr || _fileReferences[idx].get() == fref) { + if (idx < (_fileReferences.size() - 1)) + index = idx + 1; + break; + } + } + + if (index != -1) { + if (rock) + *rock = _fileReferences[index].get()->_rock; + return _fileReferences[index].get(); + } + + if (rock) + *rock = 0; + return nullptr; +} + +/*--------------------------------------------------------------------------*/ + +const Common::String FileReference::getSaveName() const { + assert(_slotNumber != -1); + return Common::String::format("%s.%.3d", g_vm->getTargetName().c_str(), _slotNumber); +} + +bool FileReference::exists() const { + Common::String filename; + + if (_slotNumber == -1) { + if (Common::File::exists(_filename)) + return true; + filename = _filename; + } else { + filename = getSaveName(); + } + + // Check for a savegame (or other file in the save folder) with that name + Common::InSaveFile *inSave = g_system->getSavefileManager()->openForLoading(filename); + bool result = inSave != nullptr; + delete inSave; + return result; +} + +void FileReference::deleteFile() { + Common::String filename = (_slotNumber == -1) ? _filename : getSaveName(); + g_system->getSavefileManager()->removeSavefile(filename); +} } // End of namespace Gargoyle |