struct monst * restmonchn(int fd) { struct monst *mtmp, *mtmp2; struct monst *first = 0; int xl; struct permonst *monbegin; long differ; mread(fd, (char *)&monbegin, sizeof(monbegin)); differ = (char *)(&mons[0]) - (char *)(monbegin); while(1) { mread(fd, (char *) &xl, sizeof(xl)); if(xl == -1) break; mtmp = newmonst(xl); if(!first) first = mtmp; else mtmp2->nmon = mtmp; mread(fd, (char *) mtmp, (unsigned) xl + sizeof(struct monst)); if(!mtmp->m_id) mtmp->m_id = flags.ident++; mtmp->data = (struct permonst *) ((char *) mtmp->data + differ); if(mtmp->minvent) mtmp->minvent = restobjchn(fd); mtmp2 = mtmp; } if(first && mtmp2->nmon){ impossible("Restmonchn: error reading monchn."); mtmp2->nmon = 0; } return(first); }
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; }
struct monst * restmonchn(int fd) { struct monst *mtmp, *mtmp2 = NULL; struct monst *first = 0; int xl; struct permonst *monbegin; long differ; mread(fd, &monbegin, sizeof(monbegin)); differ = (const char *) (&mons[0]) - (const char *) (monbegin); #ifdef lint /* suppress "used before set" warning from lint */ mtmp2 = 0; #endif /* lint */ while (1) { mread(fd, &xl, sizeof(xl)); if (xl == -1) break; mtmp = newmonst(xl); if (!first) first = mtmp; else mtmp2->nmon = mtmp; mread(fd, mtmp, (unsigned) xl + sizeof(struct monst)); if (!mtmp->m_id) mtmp->m_id = flags.ident++; mtmp->data = (const struct permonst *) ((const char *) mtmp->data + differ); if (mtmp->minvent) mtmp->minvent = restobjchn(fd); mtmp2 = mtmp; } if (first && mtmp2->nmon) { impossible("Restmonchn: error reading monchn."); mtmp2->nmon = 0; } return (first); }
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); }
void getlev(int fd, int pid, xchar lev) { struct gold *gold; struct trap *trap; #ifndef NOWORM struct wseg *wtmp; #endif /* NOWORM */ int tmp; long omoves; int hpid; xchar dlvl; /* First some sanity checks */ mread(fd, &hpid, sizeof(hpid)); mread(fd, &dlvl, sizeof(dlvl)); if ((pid && pid != hpid) || (lev && dlvl != lev)) { pline("Strange, this map is not as I remember it."); pline("Somebody is trying some trickery here ..."); pline("This game is void ..."); done("tricked"); } fgold = 0; ftrap = 0; mread(fd, levl, sizeof(levl)); mread(fd, &omoves, sizeof(omoves)); mread(fd, &xupstair, sizeof(xupstair)); mread(fd, &yupstair, sizeof(yupstair)); mread(fd, &xdnstair, sizeof(xdnstair)); mread(fd, &ydnstair, sizeof(ydnstair)); fmon = restmonchn(fd); /* regenerate animals while on another level */ { long tmoves = (moves > omoves) ? moves - omoves : 0; struct monst *mtmp, *mtmp2; for (mtmp = fmon; mtmp; mtmp = mtmp2) { long newhp; /* tmoves may be very large */ mtmp2 = mtmp->nmon; if (strchr(genocided, mtmp->data->mlet)) { mondead(mtmp); continue; } if (mtmp->mtame && tmoves > 250) { mtmp->mtame = 0; mtmp->mpeaceful = 0; } newhp = mtmp->mhp + (strchr(MREGEN, mtmp->data->mlet) ? tmoves : tmoves / 20); if (newhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax; else mtmp->mhp = newhp; } } setgd(); gold = newgold(); mread(fd, gold, sizeof(struct gold)); while (gold->gx) { gold->ngold = fgold; fgold = gold; gold = newgold(); mread(fd, gold, sizeof(struct gold)); } free(gold); trap = newtrap(); mread(fd, trap, sizeof(struct trap)); while (trap->tx) { trap->ntrap = ftrap; ftrap = trap; trap = newtrap(); mread(fd, trap, sizeof(struct trap)); } free(trap); fobj = restobjchn(fd); billobjs = restobjchn(fd); rest_engravings(fd); #ifndef QUEST mread(fd, rooms, sizeof(rooms)); mread(fd, doors, sizeof(doors)); #endif /* QUEST */ #ifndef NOWORM mread(fd, wsegs, sizeof(wsegs)); for (tmp = 1; tmp < 32; tmp++) if (wsegs[tmp]) { wheads[tmp] = wsegs[tmp] = wtmp = newseg(); while (1) { mread(fd, wtmp, sizeof(struct wseg)); if (!wtmp->nseg) break; wheads[tmp]->nseg = wtmp = newseg(); wheads[tmp] = wtmp; } } mread(fd, wgrowtime, sizeof(wgrowtime)); #endif /* NOWORM */ }