Beispiel #1
0
bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header) {
	header.thumbnail = NULL;

	uint oldPos = in->pos();

	in->seek(-4, SEEK_END);

	int headerOffset = in->readUint32LE();

	// Sanity check
	if (headerOffset >= in->pos() || headerOffset == 0) {
		in->seek(oldPos, SEEK_SET); // Rewind the file
		fillDummyHeader(header);
		return false;
	}

	in->seek(headerOffset, SEEK_SET);

	in->read(header.id, 6);

	// Validate the header Id
	if (strcmp(header.id, "SVMCR")) {
		in->seek(oldPos, SEEK_SET); // Rewind the file
		fillDummyHeader(header);
		return false;
	}

	header.version = in->readByte();
	if (header.version != FULLPIPE_SAVEGAME_VERSION) {
		in->seek(oldPos, SEEK_SET); // Rewind the file
		fillDummyHeader(header);
		return false;
	}

	header.date = in->readUint32LE();
	header.time = in->readUint16LE();
	header.playtime = in->readUint32LE();

	// Generate savename
	SaveStateDescriptor desc;

	parseSavegameHeader(header, desc);
	header.saveName = Common::String::format("%s %s", desc.getSaveDate().c_str(), desc.getSaveTime().c_str());

	// Get the thumbnail
	header.thumbnail = Graphics::loadThumbnail(*in);

	in->seek(oldPos, SEEK_SET); // Rewind the file

	if (!header.thumbnail)
		return false;

	return true;
}