void SaveGamestate() { char name[256]; FILE *f; int i; char comment[SAVEGAME_COMMENT_LENGTH+1]; edict_t *ent; sprintf (name, "%s/%s.gip", com_gamedir, sv.name); Con_Printf ("Saving game to %s...\n", name); f = fopen (name, "w"); if (!f) { Con_Printf ("ERROR: couldn't open.\n"); return; } fprintf (f, "%i\n", SAVEGAME_VERSION); Host_SavegameComment (comment); fprintf (f, "%s\n", comment); // for (i=0 ; i<NUM_SPAWN_PARMS ; i++) // fprintf (f, "%f\n", svs.clients->spawn_parms[i]); fprintf (f, "%f\n", skill.value); fprintf (f, "%s\n", sv.name); fprintf (f, "%f\n", sv.time); // write the light styles for (i=0 ; i<MAX_LIGHTSTYLES ; i++) { if (sv.lightstyles[i]) fprintf (f, "%s\n", sv.lightstyles[i]); else fprintf (f,"m\n"); } for (i=svs.maxclients+1 ; i<sv.num_edicts ; i++) { ent = EDICT_NUM(i); if ((int)ent->v.flags & FL_ARCHIVE_OVERRIDE) continue; fprintf (f, "%i\n",i); ED_Write (f, ent); fflush (f); } fclose (f); Con_Printf ("done.\n"); }
void SV_SaveGame_f (void) { char fname[MAX_OSPATH], comment[SAVEGAME_COMMENT_LENGTH+1]; FILE *f; int i; if (Cmd_Argc() != 2) { Com_Printf ("Usage: %s <savefname> : save a game\n", Cmd_Argv(0)); return; } else if (strstr(Cmd_Argv(1), "..")) { Com_Printf ("Relative pathfnames are not allowed.\n"); return; } else if (sv.state != ss_active) { Com_Printf ("Not playing a local game.\n"); return; } else if (cl.intermission) { Com_Printf ("Can't save in intermission.\n"); return; } else if (deathmatch.value != 0 || coop.value != 0 || maxclients.value != 1) { Com_Printf ("Can't save multiplayer games.\n"); return; } for (i = 1; i < MAX_CLIENTS; i++) { if (svs.clients[i].state == cs_spawned) { Com_Printf ("Can't save multiplayer games.\n"); return; } } if (svs.clients[0].state != cs_spawned) { Com_Printf ("Can't save, client #0 not spawned.\n"); return; } else if (svs.clients[0].edict->v.health <= 0) { Com_Printf ("Can't save game with a dead player\n"); // in fact, we can, but does it make sense? return; } snprintf (fname, sizeof(fname), "%s/save/%s", com_gamedir, Cmd_Argv(1)); COM_DefaultExtension (fname, ".sav"); Com_Printf ("Saving game to %s...\n", fname); if (!(f = fopen (fname, "w"))) { FS_CreatePath (fname); if (!(f = fopen (fname, "w"))) { Com_Printf ("ERROR: couldn't open.\n"); return; } } fprintf (f, "%i\n", SAVEGAME_VERSION); SV_SavegameComment (comment); fprintf (f, "%s\n", comment); for (i = 0 ; i < NUM_SPAWN_PARMS; i++) fprintf (f, "%f\n", svs.clients->spawn_parms[i]); fprintf (f, "%d\n", current_skill); fprintf (f, "%s\n", sv.mapname); fprintf (f, "%f\n", sv.time); // write the light styles for (i = 0; i < MAX_LIGHTSTYLES; i++) { if (sv.lightstyles[i]) fprintf (f, "%s\n", sv.lightstyles[i]); else fprintf (f,"m\n"); } ED_WriteGlobals (f); for (i = 0; i < sv.num_edicts; i++) { ED_Write (f, EDICT_NUM(i)); fflush (f); } fclose (f); Com_Printf ("done.\n"); }
/* =============== Host_Savegame_f =============== */ void Host_Savegame_f (void) { char name[MAX_OSPATH]; FILE *f; int i; char comment[SAVEGAME_COMMENT_LENGTH+1]; if (cmd_source != src_command) return; if (!sv.active) { Con_Printf ("Not playing a local game.\n"); return; } if (cl.intermission) { Con_Printf ("Can't save in intermission.\n"); return; } if (svs.maxclients != 1) { Con_Printf ("Can't save multiplayer games.\n"); return; } if (Cmd_Argc() != 2) { Con_Printf ("save <savename> : save a game\n"); return; } if (strstr(Cmd_Argv(1), "..")) { Con_Printf ("Relative pathnames are not allowed.\n"); return; } for (i=0 ; i<svs.maxclients ; i++) { if (svs.clients[i].active && (svs.clients[i].edict->v.health <= 0) ) { Con_Printf ("Can't savegame with a dead player\n"); return; } } q_snprintf (name, sizeof(name), "%s/%s", com_gamedir, Cmd_Argv(1)); COM_AddExtension (name, ".sav", sizeof(name)); Con_Printf ("Saving game to %s...\n", name); f = fopen (name, "w"); if (!f) { Con_Printf ("ERROR: couldn't open.\n"); return; } fprintf (f, "%i\n", SAVEGAME_VERSION); Host_SavegameComment (comment); fprintf (f, "%s\n", comment); for (i = 0; i < NUM_SPAWN_PARMS; i++) fprintf (f, "%f\n", svs.clients->spawn_parms[i]); fprintf (f, "%d\n", current_skill); fprintf (f, "%s\n", sv.name); fprintf (f, "%f\n",sv.time); // write the light styles for (i = 0; i < MAX_LIGHTSTYLES; i++) { if (sv.lightstyles[i]) fprintf (f, "%s\n", sv.lightstyles[i]); else fprintf (f,"m\n"); } ED_WriteGlobals (f); for (i = 0; i < sv.num_edicts; i++) { ED_Write (f, EDICT_NUM(i)); fflush (f); } fclose (f); Con_Printf ("done.\n"); }
/* =============== Host_Savegame_f =============== */ void Host_Savegame_f (void) { char name[256]; vfsfile_t *f; int i; char comment[SAVEGAME_COMMENT_LENGTH+1]; char *temp; if (cmd_source != src_command) return; if (!sv.active) { Con_Printf ("Not playing a local game.\n"); return; } if (cl.intermission) { Con_Printf ("Can't save in intermission.\n"); return; } if (svs.maxclients != 1) { Con_Printf ("Can't save multiplayer games.\n"); return; } if (Cmd_Argc() != 2) { Con_Printf ("save <savename> : save a game\n"); return; } if (strstr(Cmd_Argv(1), "..")) { Con_Printf ("Relative pathnames are not allowed.\n"); return; } for (i=0 ; i<svs.maxclients ; i++) { if (svs.clients[i].active && (svs.clients[i].edict->v.health <= 0) ) { Con_Printf ("Can't savegame with a dead player\n"); return; } } // sprintf (name, "%s/%s", com_gamedir, Cmd_Argv(1)); strcpy(name, Cmd_Argv(1)); COM_DefaultExtension (name, ".sav"); Con_Printf ("Saving game to %s...\n", name); // f = fopen (name, "w"); f = FS_OpenVFS(name, "wb", FS_GAMEONLY); if (!f) { Con_Printf ("ERROR: couldn't open.\n"); return; } // fprintf (f, "%i\n", SAVEGAME_VERSION); temp = va("%i\n", SAVEGAME_VERSION); VFS_WRITE(f, temp, strlen(temp)); Host_SavegameComment (comment); // fprintf (f, "%s\n", comment); temp = va("%s\n", comment); VFS_WRITE(f, temp, strlen(temp)); for (i=0 ; i<NUM_SPAWN_PARMS ; i++) { // fprintf (f, "%f\n", svs.clients->spawn_parms[i]); temp = va("%f\n", svs.clients->spawn_parms[i]); VFS_WRITE(f, temp, strlen(temp)); } // fprintf (f, "%d\n", current_skill); temp = va("%d\n", current_skill); VFS_WRITE(f, temp, strlen(temp)); // fprintf (f, "%s\n", sv.name); temp = va("%s\n", sv.name); VFS_WRITE(f, temp, strlen(temp)); // fprintf (f, "%f\n",sv.time); temp = va("%f\n", sv.time); VFS_WRITE(f, temp, strlen(temp)); // write the light styles for (i=0 ; i<MAX_LIGHTSTYLES ; i++) { if (sv.lightstyles[i][0]) temp = va("%s\n", sv.lightstyles[i]); // fprintf (f, "%s\n", sv.lightstyles[i]); else temp = va("m\n"); // fprintf (f,"m\n"); VFS_WRITE(f, temp, strlen(temp)); } ED_WriteGlobals (f); for (i=0 ; i<sv.num_edicts ; i++) { ED_Write (f, EDICT_NUM(i)); // fflush (f); } // fclose (f); VFS_CLOSE(f); Con_Printf ("done.\n"); }
int SaveGamestate (qboolean ClientsOnly) { FILE *f; edict_t *ent; int i, error_state; int start, end; char comment[SAVEGAME_COMMENT_LENGTH+1]; if (ClientsOnly) { start = 1; end = svs.maxclients+1; FS_MakePath_BUF (FS_USERDIR, &error_state, savename, sizeof(savename), "clients.gip"); if (error_state) { Host_Error("%s: %d: string buffer overflow!", __thisfunc__, __LINE__); return -1; } } else { start = 1; end = sv.num_edicts; FS_MakePath_VABUF (FS_USERDIR, &error_state, savename, sizeof(savename), "%s.gip", sv.name); if (error_state) { Host_Error("%s: %d: string buffer overflow!", __thisfunc__, __LINE__); return -1; } } f = fopen (savename, "w"); if (!f) { error_state = -1; Con_Printf ("%s: Unable to open %s for writing!\n", __thisfunc__, savename); goto finish; } fprintf (f, "%i\n", SAVEGAME_VERSION); if (!ClientsOnly) { Host_SavegameComment (comment); fprintf (f, "%s\n", comment); // for (i = 0; i < NUM_SPAWN_PARMS; i++) // fprintf (f, "%f\n", svs.clients->spawn_parms[i]); fprintf (f, "%f\n", skill.value); fprintf (f, "%s\n", sv.name); fprintf (f, "%f\n", sv.time); // write the light styles for (i = 0; i < MAX_LIGHTSTYLES; i++) { if (sv.lightstyles[i]) fprintf (f, "%s\n", sv.lightstyles[i]); else fprintf (f, "m\n"); } SV_SaveEffects (f); fprintf (f, "-1\n"); ED_WriteGlobals (f); } host_client = svs.clients; // save the client states for (i = start; i < end; i++) { ent = EDICT_NUM(i); if ((int)ent->v.flags & FL_ARCHIVE_OVERRIDE) continue; if (ClientsOnly) { if (host_client->active) { fprintf (f, "%i\n", i); ED_Write (f, ent); fflush (f); } host_client++; } else { fprintf (f, "%i\n", i); ED_Write (f, ent); fflush (f); } } error_state = ferror(f); fclose (f); finish: if (error_state) Host_Error ("%s: The level could not be saved properly!", __thisfunc__); return error_state; }
/* =============== SV_SaveGame_f =============== */ void SV_SaveGame_f (void) { char name[256]; FILE *f; int i; char comment[SAVEGAME_COMMENT_LENGTH+1]; if (Cmd_Argc() != 2) { Com_Printf ("save <savename> : save a game\n"); return; } if (strstr(Cmd_Argv(1), "..")) { Com_Printf ("Relative pathnames are not allowed.\n"); return; } if (sv.state != ss_active) { Com_Printf ("Not playing a local game.\n"); return; } if (CL_IntermissionRunning()) { Com_Printf ("Can't save in intermission.\n"); return; } if (deathmatch.value != 0 || coop.value != 0 || maxclients.value != 1) { Com_Printf ("Can't save multiplayer games.\n"); return; } for (i = 1; i < MAX_CLIENTS; i++) { if (svs.clients[i].state == cs_spawned) { Com_Printf ("Can't save multiplayer games.\n"); return; } } if (svs.clients[0].state != cs_spawned) { Com_Printf ("Can't save, client #0 not spawned.\n"); return; } sprintf (name, "%s/save/%s", com_gamedir, Cmd_Argv(1)); COM_DefaultExtension (name, ".sav"); Com_Printf ("Saving game to %s...\n", name); COM_CreatePath (name); f = fopen (name, "w"); if (!f) { Com_Printf ("ERROR: couldn't open.\n"); return; } fprintf (f, "%i\n", SAVEGAME_VERSION); SV_SavegameComment (comment); fprintf (f, "%s\n", comment); for (i=0 ; i<NUM_SPAWN_PARMS ; i++) fprintf (f, "%f\n", svs.clients->spawn_parms[i]); fprintf (f, "%d\n", current_skill); fprintf (f, "%s\n", sv.mapname); fprintf (f, "%f\n",sv.time); // write the light styles for (i = 0; i < MAX_LIGHTSTYLES; i++) { if (sv.lightstyles[i]) fprintf (f, "%s\n", sv.lightstyles[i]); else fprintf (f,"m\n"); } ED_WriteGlobals (f); for (i=0 ; i<sv.num_edicts ; i++) { ED_Write (f, EDICT_NUM(i)); fflush (f); } fclose (f); Com_Printf ("done.\n"); }