int state_save_all(int between_levels) { char filename[128], desc[DESC_LENGTH+1]; if ( Game_mode & GM_MULTI ) { #ifdef MULTI_SAVE if ( FindArg( "-multisave" ) ) multi_initiate_save_game(); else #endif HUD_init_message( "Can't save in a multiplayer game!" ); return 0; } mprintf(( 0, "CL=%d, NL=%d\n", Current_level_num, Next_level_num )); stop_time(); if (!state_get_save_file(filename,desc,0)) { start_time(); return 0; } return state_save_all_sub(filename, desc, between_levels); }
// ----------------------------------------------------------------------------------- // blind_save means don't prompt user for any info. int state_save_all(int between_levels, int secret_save, char *filename_override, int blind_save) { int rval, filenum = -1; char filename[128], desc[DESC_LENGTH+1]; Assert(between_levels == 0); //between levels save ripped out #ifdef NETWORK if ( Game_mode & GM_MULTI ) { multi_initiate_save_game(); return 0; } #endif if ((Current_level_num < 0) && (secret_save == 0)) { HUD_init_message( "Can't save in secret level!" ); return 0; } if (Final_boss_is_dead) //don't allow save while final boss is dying return 0; mprintf(( 0, "CL=%d, NL=%d\n", Current_level_num, Next_level_num )); // If this is a secret save and the control center has been destroyed, don't allow // return to the base level. if (secret_save && (Control_center_destroyed)) { mprintf((0, "Deleting secret.sgb so player can't return to base level.\n")); PHYSFS_delete(PLAYER_DIR "secret.sgb"); return 0; } stop_time(); if (secret_save == 1) { filename_override = filename; sprintf(filename_override, PLAYER_DIR "secret.sgb"); } else if (secret_save == 2) { filename_override = filename; sprintf(filename_override, PLAYER_DIR "secret.sgc"); } else { if (filename_override) { strcpy( filename, filename_override); sprintf(desc, "[autosave backup]"); } else if (!(filenum = state_get_save_file(filename, desc, 0, blind_save))) { start_time(); return 0; } } // MK, 1/1/96 // If not in multiplayer, do special secret level stuff. // If secret.sgc exists, then copy it to Nsecret.sgc (where N = filenum). // If it doesn't exist, then delete Nsecret.sgc if (!secret_save && !(Game_mode & GM_MULTI)) { int rval; char temp_fname[32], fc; if (filenum != -1) { if (filenum >= 10) fc = (filenum-10) + 'a'; else fc = '0' + filenum; sprintf(temp_fname, PLAYER_DIR "%csecret.sgc", fc); mprintf((0, "Trying to copy secret.sgc to %s.\n", temp_fname)); if (PHYSFS_exists(temp_fname)) { mprintf((0, "Deleting file %s\n", temp_fname)); if (!PHYSFS_delete(temp_fname)) Error("Cannot delete file <%s>: %s", temp_fname, PHYSFS_getLastError()); } if (PHYSFS_exists(PLAYER_DIR "secret.sgc")) { mprintf((0, "Copying secret.sgc to %s.\n", temp_fname)); rval = copy_file(PLAYER_DIR "secret.sgc", temp_fname); Assert(rval == 0); // Oops, error copying secret.sgc to temp_fname! } } } // Save file we're going to save over in last slot and call "[autosave backup]" if (!filename_override) { PHYSFS_file *tfp; tfp = PHYSFSX_openWriteBuffered(filename); if ( tfp ) { char newname[128]; sprintf( newname, PLAYER_DIR "%s.sg%x", Players[Player_num].callsign, NUM_SAVES ); PHYSFS_seek(tfp, DESC_OFFSET); PHYSFS_write(tfp, "[autosave backup]", sizeof(char) * DESC_LENGTH, 1); PHYSFS_close(tfp); PHYSFS_delete(newname); PHYSFSX_rename(filename, newname); } } rval = state_save_all_sub(filename, desc, between_levels); if (rval && !secret_save) HUD_init_message("Game saved."); return rval; }