예제 #1
0
UFlareSaveGame* UFlareSaveGameSystem::LoadGame(const FString SaveName)
{
	FLOGV("UFlareSaveGameSystem::LoadGame SaveName=%s", *SaveName);

	UFlareSaveGame *SaveGame = NULL;

	// Read the saveto a string
	FString SaveString;
	if(FFileHelper::LoadFileToString(SaveString, *GetSaveGamePath(SaveName)))
	{
		// Deserialize a JSON object from the string
		TSharedPtr< FJsonObject > Object;
		TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(SaveString);
		if(FJsonSerializer::Deserialize(Reader, Object) && Object.IsValid())
		{
			UFlareSaveReaderV1* SaveReader = NewObject<UFlareSaveReaderV1>(this, UFlareSaveReaderV1::StaticClass());
			SaveGame = SaveReader->LoadGame(Object);
		}
		else
		{
			FLOGV("Fail to deserialize save '%s'", *GetSaveGamePath(SaveName));
		}
	}
	else
	{
		FLOGV("Fail to read save '%s'", *GetSaveGamePath(SaveName));
	}

	return SaveGame;
}
예제 #2
0
UFlareSaveGame* UFlareSaveGameSystem::LoadGame(const FString SaveName)
{
	FLOGV("UFlareSaveGameSystem::LoadGame SaveName=%s", *SaveName);

	UFlareSaveGame *SaveGame = NULL;

	// Read the saveto a string
	FString SaveString;
	bool SaveStringLoaded = false;

	TArray<uint8> Data;

	auto LoadCompressedFileToString = [&](FString& Result, const TCHAR* Filename)
	{
		TArray<uint8> DataCompressed;
		if(!FFileHelper::LoadFileToArray(DataCompressed, Filename))
		{
			FLOGV("Fail to read save '%s'", Filename);
			return false;
		}

		int b4 = DataCompressed[DataCompressed.Num()- 4];
		int b3 = DataCompressed[DataCompressed.Num()- 3];
		int b2 = DataCompressed[DataCompressed.Num()- 2];
		int b1 = DataCompressed[DataCompressed.Num()- 1];
		int UncompressedSize = (b1 << 24) | (b2 << 16) + (b3 << 8) + b4;

		Data.SetNum(UncompressedSize + 1);

		if(!FCompression::UncompressMemory((ECompressionFlags)(COMPRESS_ZLIB), Data.GetData(), UncompressedSize, DataCompressed.GetData(), DataCompressed.Num(), false, 31))
		{
			FLOGV("Fail to uncompress save '%s' with compressed size %d and uncompressed size %d", Filename, DataCompressed.Num(), UncompressedSize);
			return false;
		}

		Data[UncompressedSize] = 0; // end string

		Result = UTF8_TO_TCHAR(Data.GetData());

		return true;
	};

	if(LoadCompressedFileToString(SaveString, *GetSaveGamePath(SaveName, true)))
	{
		FLOGV("Save '%s' read", *GetSaveGamePath(SaveName, true));
		SaveStringLoaded  = true;
	}
	else if(FFileHelper::LoadFileToString(SaveString, *GetSaveGamePath(SaveName, false)))
	{
		FLOGV("Save '%s' read", *GetSaveGamePath(SaveName, false));
		SaveStringLoaded = true;
	}

	if(SaveStringLoaded)
	{
		// Deserialize a JSON object from the string
		TSharedPtr< FJsonObject > Object;
		TSharedRef< TJsonReader<> > Reader = TJsonReaderFactory<>::Create(SaveString);
		if(FJsonSerializer::Deserialize(Reader, Object) && Object.IsValid())
		{
			UFlareSaveReaderV1* SaveReader = NewObject<UFlareSaveReaderV1>(this, UFlareSaveReaderV1::StaticClass());
			SaveGame = SaveReader->LoadGame(Object);
		}
		else
		{
			FLOGV("Fail to deserialize save '%s' (len: %d)", *GetSaveGamePath(SaveName, false), SaveString.Len());
		}
	}
	else
	{
		FLOGV("Fail to read save '%s' or '%s'", *GetSaveGamePath(SaveName, true), *GetSaveGamePath(SaveName, false));

	}

	return SaveGame;
}