bool save_game( void) { pause_game(); show_cursor(); /* Translate the name, and display the dialog */ FileSpecifier SaveFile; get_current_saved_game_name(SaveFile); char GameName[256]; SaveFile.GetName(GameName); char Prompt[256]; // Must allow the sound to play in the background bool success = SaveFile.WriteDialogAsync( _typecode_savegame, getcstr(Prompt, strPROMPTS, _save_game_prompt), GameName); if (success) success = save_game_file(SaveFile); hide_cursor(); resume_game(); return success; }
// Analogous to 'save_game()', but does not present any dialog to the user, and reports the results // using screen_printf(). If inOverwriteRecent is set, it will save over the most recently saved // or restored game (if possible). If inOverwriteRecent is not set, or if there is no recent game // to save over, it will pick a new, nonconflicting filename and save to it. // Returns whether save was successful. bool save_game_full_auto(bool inOverwriteRecent) { bool createNewFile = !inOverwriteRecent; FileSpecifier theRecentSavedGame; get_current_saved_game_name(theRecentSavedGame); char theSavedGameName[256]; // XXX // If we're supposed to overwrite, change our minds if we seem to have no 'existing file'. if(!createNewFile) { theRecentSavedGame.GetName(theSavedGameName); if(strcmp(theSavedGameName, TS_GetCString(strFILENAMES, filenameDEFAULT_SAVE_GAME)) == 0) createNewFile = true; } // Make up a filename (currently based on level name) if(createNewFile) { if(strncpy_filename_friendly(theSavedGameName, static_world->level_name, kMaxFilenameChars) <= 0) strcpy(theSavedGameName, "Automatic Save"); DirectorySpecifier theDirectory; theRecentSavedGame.ToDirectory(theDirectory); theRecentSavedGame.FromDirectory(theDirectory); #if defined(mac) || defined(SDL_RFORK_HACK) // Note: SetName() currently ignores the 'type' argument, so I feel // little compulsion to try to figure it out. theRecentSavedGame.SetName(theSavedGameName,NONE); #else theRecentSavedGame.AddPart(theSavedGameName); #endif } FileSpecifier theOutputFile; if(createNewFile) make_nonconflicting_filename_variant(theRecentSavedGame, theOutputFile, kMaxFilenameChars); else theOutputFile = theRecentSavedGame; bool successfulSave = save_game_file(theOutputFile); theOutputFile.GetName(theSavedGameName); if(successfulSave) { screen_printf("%s saved game '%s'", createNewFile ? "Created new" : "Replaced existing", theSavedGameName); // play a sound? } else { screen_printf("Unable to save game as '%s'", theSavedGameName); // play a sound? } return successfulSave; }
bool create_quick_save(void) { QuickSave save; time(&(save.save_time)); char fmt_time[256]; tm *time_info = localtime(&(save.save_time)); strftime(fmt_time, 256, "%x %R", time_info); save.formatted_time = fmt_time; save.level_name = mac_roman_to_utf8(static_world->level_name); save.players = dynamic_world->player_count; save.ticks = dynamic_world->tick_count; char fmt_ticks[256]; if (save.ticks < 60*TICKS_PER_MINUTE) sprintf(fmt_ticks, "%d:%02d", save.ticks/TICKS_PER_MINUTE, (save.ticks/TICKS_PER_SECOND) % 60); else sprintf(fmt_ticks, "%d:%02d:%02d", save.ticks/(60*TICKS_PER_MINUTE), (save.ticks/TICKS_PER_MINUTE) % 60, (save.ticks/TICKS_PER_SECOND) % 60); save.formatted_ticks = fmt_ticks; DirectorySpecifier quicksave_dir; quicksave_dir.SetToQuickSavesDir(); std::ostringstream oss; oss << save.save_time; std::string base = oss.str(); save.save_file.FromDirectory(quicksave_dir); save.save_file.AddPart(base + ".sgaA"); std::string metadata = build_save_metadata(save); std::ostringstream image_stream; bool success = build_map_preview(image_stream); success = save_game_file(save.save_file, metadata, image_stream.str()); if (success) QuickSaves::instance()->delete_surplus_saves(environment_preferences->maximum_quick_saves); return success; }