/** * Try to load a savefile */ static bool try_load(ang_file *f, const struct blockinfo *loaders) { struct blockheader b; errr err; if (!check_header(f)) { note("Savefile is corrupted -- incorrect file header."); return FALSE; } /* Get the next block header */ while ((err = next_blockheader(f, &b)) == 0) { loader_t loader = find_loader(&b, loaders); if (!loader) { note("Savefile block can't be read."); note("Maybe try and load the savefile in an earlier version of Angband."); return FALSE; } if (!load_block(f, &b, loader)) { note(format("Savefile corrupted - Couldn't load block %s", b.name)); return FALSE; } } if (err == -1) { note("Savefile is corrupted -- block header mangled."); return FALSE; } return TRUE; }
/** * Try to get the 'description' block from a savefile. Fail gracefully. */ const char *savefile_get_description(const char *path) { struct blockheader b; ang_file *f = file_open(path, MODE_READ, FTYPE_TEXT); if (!f) return NULL; /* Blank the description */ savefile_desc[0] = 0; if (!check_header(f)) { my_strcpy(savefile_desc, "Invalid savefile", sizeof savefile_desc); } else { while (!next_blockheader(f, &b)) { if (!streq(b.name, "description")) { skip_block(f, &b); continue; } load_block(f, &b, get_desc); break; } } file_close(f); return savefile_desc; }
/* Try to load a savefile */ static bool try_load(ang_file *f, const struct blockinfo *loaders) { struct blockheader b; errr err; if (!check_header(f)) { note("Savefile is corrupted -- incorrect file header."); return FALSE; } /* Get the next block header */ while ((err = next_blockheader(f, &b)) == 0) { loader_t loader = find_loader(&b, loaders); if (!loader) { note("Savefile block can't be read."); note("Maybe try and load the savefile in an earlier version of Angband."); return FALSE; } if (!load_block(f, &b, loader)) { note(format("Savefile corrupted - Couldn't load block %s", b.name)); return FALSE; } } if (err == -1) { note("Savefile is corrupted -- block header mangled."); return FALSE; } /* XXX Reset cause of death */ if (p_ptr->chp >= 0) my_strcpy(p_ptr->died_from, "(alive and well)", sizeof(p_ptr->died_from)); return TRUE; }