bool dorecover (void) { char savefile [PATH_MAX]; snprintf (ArrayBlock(savefile), HACK_SAVEFILE, getenv("HOME")); int fd = open (savefile, O_RDONLY); if (fd < 0) return false; mread (fd, &_u, sizeof(struct you)); if (_u.maxdlevel < 1 || _u.maxdlevel > MAXLEVEL) { close (fd); you_dtor(); return false; } invent = restobjchn (fd); for (struct obj* o = invent; o; o = o->nobj) if (o->owornmask) setworn (o, o->owornmask); fcobj = restobjchn (fd); fallen_down = restmonchn (fd); mread (fd, &_wflags, sizeof(struct worldflag)); mread (fd, pl_character, sizeof pl_character); restnames (fd); restgenocided (fd); for (unsigned i = 0; i < _u.maxdlevel; ++i) { level_dtor (&_levels[i]); getlev (fd, &_levels[i]); } if (_u.dlevel < 1 || _u.dlevel > _u.maxdlevel) _u.dlevel = _u.maxdlevel; _level = &_levels[_u.dlevel-1]; setsee(); // only to recompute seelx etc. - these weren't saved docrt(); close (fd); unlink (savefile); return true; }
int dorecover(int fd) { int nfd; int tmp; /* not a ! */ unsigned mid; /* idem */ struct obj *otmp; restoring = TRUE; getlev(fd, 0, 0); invent = restobjchn(fd); for (otmp = invent; otmp; otmp = otmp->nobj) if (otmp->owornmask) setworn(otmp, otmp->owornmask); fcobj = restobjchn(fd); fallen_down = restmonchn(fd); mread(fd, &tmp, sizeof tmp); if (tmp != (int) getuid()) { /* strange ... */ (void) close(fd); (void) unlink(SAVEF); puts("Saved game was not yours."); restoring = FALSE; return (0); } mread(fd, &flags, sizeof(struct flag)); mread(fd, &dlevel, sizeof dlevel); mread(fd, &maxdlevel, sizeof maxdlevel); mread(fd, &moves, sizeof moves); mread(fd, &u, sizeof(struct you)); if (u.ustuck) mread(fd, &mid, sizeof mid); mread(fd, pl_character, sizeof pl_character); mread(fd, genocided, sizeof genocided); mread(fd, fut_geno, sizeof fut_geno); restnames(fd); while (1) { if (read(fd, &tmp, sizeof tmp) != sizeof tmp) break; getlev(fd, 0, tmp); glo(tmp); if ((nfd = creat(lock, FMASK)) < 0) panic("Cannot open temp file %s!\n", lock); savelev(nfd, tmp); (void) close(nfd); } (void) lseek(fd, (off_t) 0, SEEK_SET); getlev(fd, 0, 0); (void) close(fd); (void) unlink(SAVEF); if (Punished) { for (otmp = fobj; otmp; otmp = otmp->nobj) if (otmp->olet == CHAIN_SYM) goto chainfnd; panic("Cannot find the iron chain?"); chainfnd: uchain = otmp; if (!uball) { for (otmp = fobj; otmp; otmp = otmp->nobj) if (otmp->olet == BALL_SYM && otmp->spe) goto ballfnd; panic("Cannot find the iron ball?"); ballfnd: uball = otmp; } } if (u.ustuck) { struct monst *mtmp; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) if (mtmp->m_id == mid) goto monfnd; panic("Cannot find the monster ustuck."); monfnd: u.ustuck = mtmp; } #ifndef QUEST setsee(); /* only to recompute seelx etc. - these * weren't saved */ #endif /* QUEST */ docrt(); restoring = FALSE; return (1); }