/* ============== SV_Loadgame_f ============== */ static void SV_Loadgame_f (void) { char name[MAX_OSPATH]; char *dir; if (Cmd_Argc() != 2) { Com_Printf ("USAGE: loadgame <directory>\n"); return; } dir = Cmd_Argv(1); if (strstr(dir, "..") || strchr(dir, '/') || strchr(dir, '\\')) { Com_Printf ("Bad savedir.\n"); return; } // make sure the server.ssv file exists Com_sprintf (name, sizeof(name), "save/%s/server.ssv", Cmd_Argv(1)); if (FS_LoadFileEx( name, NULL, FS_TYPE_REAL|FS_PATH_GAME ) == -1 ) { Com_Printf ("No such savegame: %s\n", name); return; } Com_Printf ("Loading game...\n"); SV_CopySaveGame(Cmd_Argv(1), "current"); SV_ReadServerFile (); // go to the map sv.state = ss_dead; // don't save current level when changing SV_Map (false, svs.mapcmd, true); }
static char *LoadCache(void **list) { char buffer[MAX_OSPATH], *cache; int i; size_t len; uint8_t hash[16]; len = Q_concat(buffer, sizeof(buffer), m_demos.browse, "/" COM_DEMOCACHE_NAME, NULL); if (len >= sizeof(buffer)) { return NULL; } len = FS_LoadFileEx(buffer, (void **)&cache, FS_TYPE_REAL | FS_PATH_GAME, TAG_FILESYSTEM); if (!cache) { return NULL; } if (len < 33) { goto fail; } for (i = 0; i < 16; i++) { int c1 = Q_charhex(cache[i * 2 + 0]); int c2 = Q_charhex(cache[i * 2 + 1]); hash[i] = (c1 << 4) | c2; } if (cache[32] != '\\') { goto fail; } if (memcmp(hash, m_demos.hash, 16)) { goto fail; } Com_DPrintf("%s: loading from cache\n", __func__); return cache; fail: FS_FreeFile(cache); return NULL; }