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; }
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; }