Пример #1
0
/*
==============
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);
}
Пример #2
0
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;
}