diff options
| author | uruk | 2014-06-29 20:36:54 +0200 | 
|---|---|---|
| committer | uruk | 2014-06-29 20:36:54 +0200 | 
| commit | 38a59bee3e85f82672ce88befb2e428d243416db (patch) | |
| tree | 65f58ffa4242544eaa3c499391aac26c350daa24 /engines/cge2/saveload.cpp | |
| parent | 160212c8e3219b28968ad653a0d730223b338a38 (diff) | |
| download | scummvm-rg350-38a59bee3e85f82672ce88befb2e428d243416db.tar.gz scummvm-rg350-38a59bee3e85f82672ce88befb2e428d243416db.tar.bz2 scummvm-rg350-38a59bee3e85f82672ce88befb2e428d243416db.zip  | |
CGE2: Add skeleton for save/load system.
Also rename loadGame() to loadHeroes().
Diffstat (limited to 'engines/cge2/saveload.cpp')
| -rw-r--r-- | engines/cge2/saveload.cpp | 197 | 
1 files changed, 197 insertions, 0 deletions
diff --git a/engines/cge2/saveload.cpp b/engines/cge2/saveload.cpp new file mode 100644 index 0000000000..ac059e5d8f --- /dev/null +++ b/engines/cge2/saveload.cpp @@ -0,0 +1,197 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/* + * This code is based on original Sfinx source code + * Copyright (c) 1994-1997 Janus B. Wisniewski and L.K. Avalon + */ + +#include "cge2/detection.h" +#include "common/config-manager.h" +#include "common/savefile.h" +#include "common/system.h" +#include "graphics/thumbnail.h" +#include "graphics/surface.h" +#include "graphics/palette.h" +#include "graphics/scaler.h" +#include "cge2/events.h" +#include "cge2/snail.h" +#include "cge2/hero.h" + +namespace CGE2 { + +struct SavegameHeader { +	uint8 version; +	Common::String saveName; +	Graphics::Surface *thumbnail; +	int saveYear, saveMonth, saveDay; +	int saveHour, saveMinutes; +}; + +int CGE2MetaEngine::getMaximumSaveSlot() const { +	return 99; +} + +SaveStateList CGE2MetaEngine::listSaves(const char *target) const { +	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); +	Common::StringArray filenames; +	Common::String pattern = target; +	pattern += ".???"; + +	filenames = saveFileMan->listSavefiles(pattern); +	sort(filenames.begin(), filenames.end());   // Sort (hopefully ensuring we are sorted numerically..) + +	SaveStateList saveList; +	for (Common::StringArray::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { +		// Obtain the last 3 digits of the filename, since they correspond to the save slot +		int slotNum = atoi(filename->c_str() + filename->size() - 3); + +		if (slotNum >= 0 && slotNum <= 99) { + +			Common::InSaveFile *file = saveFileMan->openForLoading(*filename); +			if (file) { +				CGE2::SavegameHeader header; + +				// Check to see if it's a ScummVM savegame or not +				char buffer[kSavegameStrSize + 1]; +				file->read(buffer, kSavegameStrSize + 1); + +				if (!strncmp(buffer, kSavegameStr, kSavegameStrSize + 1)) { +					// Valid savegame +					if (CGE2::CGE2Engine::readSavegameHeader(file, header)) { +						saveList.push_back(SaveStateDescriptor(slotNum, header.saveName)); +						if (header.thumbnail) { +							header.thumbnail->free(); +							delete header.thumbnail; +						} +					} +				} else { +					// Must be an original format savegame +					saveList.push_back(SaveStateDescriptor(slotNum, "Unknown")); +				} + +				delete file; +			} +		} +	} + +	return saveList; +} + +SaveStateDescriptor CGE2MetaEngine::querySaveMetaInfos(const char *target, int slot) const { +	Common::String fileName = Common::String::format("%s.%03d", target, slot); +	Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName); + +	if (f) { +		CGE2::SavegameHeader header; + +		// Check to see if it's a ScummVM savegame or not +		char buffer[kSavegameStrSize + 1]; +		f->read(buffer, kSavegameStrSize + 1); + +		bool hasHeader = !strncmp(buffer, kSavegameStr, kSavegameStrSize + 1) && +			CGE2::CGE2Engine::readSavegameHeader(f, header); +		delete f; + +		if (!hasHeader) { +			// Original savegame perhaps? +			SaveStateDescriptor desc(slot, "Unknown"); +			return desc; +		} else { +			// Create the return descriptor +			SaveStateDescriptor desc(slot, header.saveName); +			desc.setThumbnail(header.thumbnail); +			desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); +			desc.setSaveTime(header.saveHour, header.saveMinutes); + +			// Slot 0 is used for the 'automatic save on exit' save in Soltys, thus +			// we prevent it from being deleted or overwritten by accident. +			desc.setDeletableFlag(slot != 0); +			desc.setWriteProtectedFlag(slot == 0); + +			return desc; +		} +	} + +	return SaveStateDescriptor(); +} + +bool CGE2Engine::readSavegameHeader(Common::InSaveFile *in, SavegameHeader &header) { +	header.thumbnail = nullptr; + +	// Get the savegame version +	header.version = in->readByte(); +	if (header.version > kSavegameVersion) +		return false; + +	// Read in the string +	header.saveName.clear(); +	char ch; +	while ((ch = (char)in->readByte()) != '\0') +		header.saveName += ch; + +	// Get the thumbnail +	header.thumbnail = Graphics::loadThumbnail(*in); +	if (!header.thumbnail) +		return false; + +	// Read in save date/time +	header.saveYear = in->readSint16LE(); +	header.saveMonth = in->readSint16LE(); +	header.saveDay = in->readSint16LE(); +	header.saveHour = in->readSint16LE(); +	header.saveMinutes = in->readSint16LE(); + +	return true; +} + +void CGE2MetaEngine::removeSaveState(const char *target, int slot) const { +	Common::String fileName = Common::String::format("%s.%03d", target, slot); +	g_system->getSavefileManager()->removeSavefile(fileName); +} + +bool CGE2Engine::canSaveGameStateCurrently() { +	bool isHeroVisible = false; +	for (int i = 0; i < 2; i++) { +		isHeroVisible = !_heroTab[i]->_ptr->_flags._hide; +		if (isHeroVisible) +			break; +	} +	return (_startupMode == 0) && _mouse->_active && +		_commandHandler->idle() && isHeroVisible; +} + +bool CGE2Engine::canLoadGameStateCurrently() { +	return (_startupMode == 0) && _mouse->_active; +} + +Common::Error CGE2Engine::saveGameState(int slot, const Common::String &desc) { +	warning("STUB: CGE2Engine::saveGameState()"); +	return Common::kNoError; +} + +Common::Error CGE2Engine::loadGameState(int slot) { +	warning("STUB: CGE2Engine::loadGameState()"); +	return Common::kNoError; +} + +} // End of namespace CGE2  | 
