+void Host_Savegame_to (const char *name)
+{
+ qfile_t *f;
+ int i, lightstyles = 64;
+ char comment[SAVEGAME_COMMENT_LENGTH+1];
+ qboolean isserver;
+
+ // first we have to figure out if this can be saved in 64 lightstyles
+ // (for Quake compatibility)
+ for (i=64 ; i<MAX_LIGHTSTYLES ; i++)
+ if (sv.lightstyles[i][0])
+ lightstyles = i+1;
+
+ isserver = !strcmp(PRVM_NAME, "server");
+
+ Con_Printf("Saving game to %s...\n", name);
+ f = FS_OpenRealFile(name, "wb", false);
+ if (!f)
+ {
+ Con_Print("ERROR: couldn't open.\n");
+ return;
+ }
+
+ FS_Printf(f, "%i\n", SAVEGAME_VERSION);
+
+ memset(comment, 0, sizeof(comment));
+ if(isserver)
+ dpsnprintf(comment, sizeof(comment), "%-21.21s kills:%3i/%3i", PRVM_GetString(prog->edicts->fields.server->message), (int)prog->globals.server->killed_monsters, (int)prog->globals.server->total_monsters);
+ else
+ dpsnprintf(comment, sizeof(comment), "(crash dump of %s progs)", PRVM_NAME);
+ // convert space to _ to make stdio happy
+ // LordHavoc: convert control characters to _ as well
+ for (i=0 ; i<SAVEGAME_COMMENT_LENGTH ; i++)
+ if (ISWHITESPACEORCONTROL(comment[i]))
+ comment[i] = '_';
+ comment[SAVEGAME_COMMENT_LENGTH] = '\0';
+
+ FS_Printf(f, "%s\n", comment);
+ if(isserver)
+ {
+ for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
+ FS_Printf(f, "%f\n", svs.clients[0].spawn_parms[i]);
+ FS_Printf(f, "%d\n", current_skill);
+ FS_Printf(f, "%s\n", sv.name);
+ FS_Printf(f, "%f\n",sv.time);
+ }
+ else
+ {
+ for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
+ FS_Printf(f, "(dummy)\n");
+ FS_Printf(f, "%d\n", 0);
+ FS_Printf(f, "%s\n", "(dummy)");
+ FS_Printf(f, "%f\n", realtime);
+ }
+
+ // write the light styles
+ for (i=0 ; i<lightstyles ; i++)
+ {
+ if (isserver && sv.lightstyles[i][0])
+ FS_Printf(f, "%s\n", sv.lightstyles[i]);
+ else
+ FS_Print(f,"m\n");
+ }
+
+ PRVM_ED_WriteGlobals (f);
+ for (i=0 ; i<prog->num_edicts ; i++)
+ {
+ FS_Printf(f,"// edict %d\n", i);
+ //Con_Printf("edict %d...\n", i);
+ PRVM_ED_Write (f, PRVM_EDICT_NUM(i));
+ }
+
+#if 1
+ FS_Printf(f,"/*\n");
+ FS_Printf(f,"// DarkPlaces extended savegame\n");
+ // darkplaces extension - extra lightstyles, support for color lightstyles
+ for (i=0 ; i<MAX_LIGHTSTYLES ; i++)
+ if (isserver && sv.lightstyles[i][0])
+ FS_Printf(f, "sv.lightstyles %i %s\n", i, sv.lightstyles[i]);
+
+ // darkplaces extension - model precaches
+ for (i=1 ; i<MAX_MODELS ; i++)
+ if (sv.model_precache[i][0])
+ FS_Printf(f,"sv.model_precache %i %s\n", i, sv.model_precache[i]);
+
+ // darkplaces extension - sound precaches
+ for (i=1 ; i<MAX_SOUNDS ; i++)
+ if (sv.sound_precache[i][0])
+ FS_Printf(f,"sv.sound_precache %i %s\n", i, sv.sound_precache[i]);
+ FS_Printf(f,"*/\n");
+#endif
+
+ FS_Close (f);
+ Con_Print("done.\n");
+}
+