int SV_LoadState_Hr_v13(Str const *path, SaveInfo *info) { saveheader_t const *hdr; DENG_ASSERT(path != 0 && info != 0); if(!SV_OpenFile_Hr_v13(Str_Text(path))) return 1; svReader = SV_NewReader_Hr_v13(); // Read the header again. /// @todo Seek past the header straight to the game state. { SaveInfo *tmp = SaveInfo_New(); SaveInfo_Read_Hr_v13(tmp, svReader); SaveInfo_Delete(tmp); } hdr = SaveInfo_Header(info); gameSkill = hdr->skill; gameEpisode = hdr->episode; gameMap = hdr->map; gameMapEntryPoint = 0; // We don't want to see a briefing if we're loading a save game. briefDisabled = true; // Load a base map. G_NewGame(gameSkill, gameEpisode, gameMap, gameMapEntryPoint); /// @todo Necessary? G_SetGameAction(GA_NONE); // Recreate map state. mapTime = hdr->mapTime; P_v13_UnArchivePlayers(); P_v13_UnArchiveWorld(); P_v13_UnArchiveThinkers(); P_v13_UnArchiveSpecials(); if(Reader_ReadByte(svReader) != SAVE_GAME_TERMINATOR) { Reader_Delete(svReader); svReader = NULL; SV_CloseFile_Hr_v13(); Con_Error("Bad savegame"); // Missing savegame termination marker. exit(1); // Unreachable. } Reader_Delete(svReader); svReader = NULL; SV_CloseFile_Hr_v13(); return 0; // Success! }
boolean SV_RecogniseState_Hr_v13(Str const *path, SaveInfo *info) { DENG_ASSERT(path != 0 && info != 0); if(!SV_ExistingFile(path)) return false; if(SV_OpenFile_Hr_v13(Str_Text(path))) { Reader *svReader = SV_NewReader_Hr_v13(); boolean result = false; /// @todo Use the 'version' string as the "magic" identifier. /*char vcheck[VERSIONSIZE]; memset(vcheck, 0, sizeof(vcheck)); Reader_Read(svReader, vcheck, sizeof(vcheck)); if(strncmp(vcheck, "version ", 8))*/ { SaveInfo_Read_Hr_v13(info, svReader); result = (SaveInfo_Header(info)->version == V13_SAVE_VERSION); } Reader_Delete(svReader); svReader = NULL; SV_CloseFile_Hr_v13(); return result; } return false; }
void SV_LoadGameClient(uint /*sessionId*/) { throw de::Error("SV_LoadGameClient", "Not currently implemented"); #if 0 #if !__JHEXEN__ // unsupported in libhexen player_t *cpl = players + CONSOLEPLAYER; mobj_t *mo = cpl->plr->mo; if(!IS_CLIENT || !mo) return; de::game::GameStateFolder *session = new de::game::GameStateFolder(saveNameForClientSessionId(sessionId)); de::game::GameStateMetadata *metadata = new de::game::GameStateMetadata; //G_ReadLegacySessionMetadata(metadata, reader); metadata->set("sessionId", sessionId); session->replaceMetadata(metadata); de::Path path = de::String("/savegame") / "client" / session->path(); if(!SV_OpenFileForRead(path)) { delete session; App_Log(DE2_RES_WARNING, "SV_LoadGameClient: Failed opening \"%s\" for reading", path.toString().toLatin1().constData()); return; } if((*metadata)["magic"].value().asNumber() != MY_CLIENT_SAVE_MAGIC) { SV_CloseFile(); delete session; App_Log(DE2_RES_ERROR, "Client save file format not recognized"); return; } Reader1 *reader = SV_NewReader(); int const saveVersion = (*metadata)["version"].value().asNumber(); Uri *mapUri = Uri_NewWithPath2((*metadata)["mapUri"].value().asText().toUtf8().constData(), RC_NULL); GameRules *rules = 0; if(metadata->hasSubrecord("gameRules")) { rules = GameRules::fromRecord(metadata->subrecord("gameRules")); } // Do we need to change the map? if(gfw_Session()->mapUri() != *reinterpret_cast<de::Uri *>(mapUri)) { gfw_Session()->begin(*mapUri, 0/*default*/, *rules); } else if(rules) { gfw_Session()->rules() = *rules; } delete rules; rules = 0; Uri_Delete(mapUri); mapUri = 0; mapTime = (*metadata)["mapTime"].value().asNumber(); P_MobjUnlink(mo); mo->origin[VX] = FIX2FLT(Reader_ReadInt32(reader)); mo->origin[VY] = FIX2FLT(Reader_ReadInt32(reader)); mo->origin[VZ] = FIX2FLT(Reader_ReadInt32(reader)); P_MobjLink(mo); mo->floorZ = FIX2FLT(Reader_ReadInt32(reader)); mo->ceilingZ = FIX2FLT(Reader_ReadInt32(reader)); mo->angle = Reader_ReadInt32(reader); /* $unifiedangles */ cpl->plr->lookDir = Reader_ReadFloat(reader); /* $unifiedangles */ #if __JHEXEN__ if(saveVersion >= 4) #else if(saveVersion >= 5) #endif { SV_AssertSegment(ASEG_PLAYER_HEADER); } playerheader_t plrHdr; plrHdr.read(reader, saveVersion); cpl->read(reader, plrHdr); MapStateReader(*session).read(Str_Text(Uri_Resolved(mapUri))); SV_CloseFile(); Reader_Delete(reader); delete session; #else DENG2_UNUSED(sessionId); #endif #endif }