/* returns 1 if save successful */ static int dosave0(int hu) { int fd, ofd; int tmp; /* not ! */ (void) signal(SIGHUP, SIG_IGN); (void) signal(SIGINT, SIG_IGN); if ((fd = creat(SAVEF, FMASK)) < 0) { if (!hu) pline("Cannot open save file. (Continue or Quit)"); (void) unlink(SAVEF); /* ab@unido */ return (0); } if (flags.moonphase == FULL_MOON) /* ut-sally!fletcher */ u.uluck--; /* and unido!ab */ savelev(fd, dlevel); saveobjchn(fd, invent); saveobjchn(fd, fcobj); savemonchn(fd, fallen_down); tmp = getuid(); bwrite(fd, &tmp, sizeof tmp); bwrite(fd, &flags, sizeof(struct flag)); bwrite(fd, &dlevel, sizeof dlevel); bwrite(fd, &maxdlevel, sizeof maxdlevel); bwrite(fd, &moves, sizeof moves); bwrite(fd, &u, sizeof(struct you)); if (u.ustuck) bwrite(fd, &(u.ustuck->m_id), sizeof u.ustuck->m_id); bwrite(fd, pl_character, sizeof pl_character); bwrite(fd, genocided, sizeof genocided); bwrite(fd, fut_geno, sizeof fut_geno); savenames(fd); for (tmp = 1; tmp <= maxdlevel; tmp++) { if (tmp == dlevel || !level_exists[tmp]) continue; glo(tmp); if ((ofd = open(lock, O_RDONLY)) < 0) { if (!hu) pline("Error while saving: cannot read %s.", lock); (void) close(fd); (void) unlink(SAVEF); if (!hu) done("tricked"); return (0); } getlev(ofd, hackpid, tmp); (void) close(ofd); bwrite(fd, &tmp, sizeof tmp); /* level number */ savelev(fd, tmp); /* actual level */ (void) unlink(lock); } (void) close(fd); glo(dlevel); (void) unlink(lock); /* get rid of current level --jgm */ glo(0); (void) unlink(lock); return (1); }
// returns 1 if save successful bool dosave0 (bool failok) { // Create the saved game directory first, if absent const char* homedir = getenv ("HOME"); if (!homedir) return false; char savefile [PATH_MAX]; snprintf (ArrayBlock(savefile), _PATH_SAVED_GAMES, homedir); if (0 != access (savefile, R_OK)) mkpath (savefile, S_IRWXU); snprintf (ArrayBlock(savefile), HACK_SAVEFILE, homedir); int fd = creat (savefile, S_IRUSR| S_IWUSR); if (fd < 0) { if (failok) pline("Cannot save game: %s (Continue or Quit)", strerror(errno)); return false; } bwrite (fd, &_u, sizeof(struct you)); saveobjchn (fd, invent); saveobjchn (fd, fcobj); savemonchn (fd, fallen_down); bwrite (fd, &_wflags, sizeof(struct worldflag)); bwrite (fd, pl_character, sizeof pl_character); savenames (fd); savegenocided (fd); for (unsigned i = 0; i < _u.maxdlevel; ++i) savelev (fd, &_levels[i]); close (fd); return true; }
void savelev(int fd) { #ifndef NOWORM struct wseg *wtmp; struct wseg *wtmp2; int tmp; #endif if(fd < 0) { panic("Save on bad file!"); } bwrite(fd, (char *)levl, sizeof(levl)); bwrite(fd, (char *)&moves, sizeof(long)); bwrite(fd, (char *)&xupstair, sizeof(xupstair)); bwrite(fd, (char *)&yupstair, sizeof(yupstair)); bwrite(fd, (char *)&xdnstair, sizeof(xdnstair)); bwrite(fd, (char *)&ydnstair, sizeof(ydnstair)); savemonchn(fd, fmon); savegenchn(fd, fgold); savegenchn(fd, ftrap); saveobjchn(fd, fobj); saveobjchn(fd, billobjs); billobjs = 0; save_engravings(fd); #ifndef QUEST bwrite(fd, (char *)rooms, sizeof(rooms)); bwrite(fd, (char *)doors, sizeof(doors)); #endif ftrap = 0; fgold = 0; fobj = 0; /*--------------------------------------------------------*/ #ifndef NOWORM extern struct wseg *wsegs[32]; extern long wgrowtime[32]; bwrite(fd, (char *)wsegs, sizeof(wsegs)); for(tmp = 1; tmp < 32; ++tmp) { for(wtmp = wsegs[tmp]; wtmp != 0; wtmp = wtmp2) { wtmp2 = wtmp->nseg; bwrite(fd, (char *)wtmp, sizeof(struct wseg)); } wsegs[tmp] = 0; } bwrite(fd, (char *)wgrowtime, sizeof(wgrowtime)); #endif /*--------------------------------------------------------*/ }
void savelev(int fd, xchar lev) { #ifndef NOWORM struct wseg *wtmp, *wtmp2; int tmp; #endif /* NOWORM */ if (fd < 0) panic("Save on bad file!"); /* impossible */ if (lev >= 0 && lev <= MAXLEVEL) level_exists[lev] = TRUE; bwrite(fd, &hackpid, sizeof(hackpid)); bwrite(fd, &lev, sizeof(lev)); bwrite(fd, levl, sizeof(levl)); bwrite(fd, &moves, sizeof(long)); bwrite(fd, &xupstair, sizeof(xupstair)); bwrite(fd, &yupstair, sizeof(yupstair)); bwrite(fd, &xdnstair, sizeof(xdnstair)); bwrite(fd, &ydnstair, sizeof(ydnstair)); savemonchn(fd, fmon); savegoldchn(fd, fgold); savetrapchn(fd, ftrap); saveobjchn(fd, fobj); saveobjchn(fd, billobjs); billobjs = 0; save_engravings(fd); #ifndef QUEST bwrite(fd, rooms, sizeof(rooms)); bwrite(fd, doors, sizeof(doors)); #endif /* QUEST */ fgold = 0; ftrap = 0; fmon = 0; fobj = 0; #ifndef NOWORM bwrite(fd, wsegs, sizeof(wsegs)); for (tmp = 1; tmp < 32; tmp++) { for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2) { wtmp2 = wtmp->nseg; bwrite(fd, wtmp, sizeof(struct wseg)); } wsegs[tmp] = 0; } bwrite(fd, wgrowtime, sizeof(wgrowtime)); #endif /* NOWORM */ }
static void savegamestate(struct memfile *mf) { unsigned book_id; mtag(mf, 0, MTAG_GAMESTATE); mfmagic_set(mf, STATE_MAGIC); /* must come before migrating_objs and migrating_mons are freed */ save_timers(mf, level, RANGE_GLOBAL); save_light_sources(mf, level, RANGE_GLOBAL); saveobjchn(mf, invent); savemonchn(mf, migrating_mons); save_mvitals(mf); save_quest_status(mf); save_spellbook(mf); save_artifacts(mf); save_oracles(mf); mwrite(mf, pl_character, sizeof pl_character); mwrite(mf, pl_fruit, sizeof pl_fruit); mwrite32(mf, current_fruit); savefruitchn(mf); savenames(mf); save_waterlevel(mf); mwrite32(mf, lastinvnr); save_mt_state(mf); save_track(mf); save_food(mf); save_steal(mf); save_dig_status(mf); book_id = book ? book->o_id : 0; mwrite32(mf, book_id); mwrite32(mf, stetho_last_used_move); mwrite32(mf, stetho_last_used_movement); mwrite32(mf, multi); save_rndmonst_state(mf); save_history(mf); }
void savelev() { extern char *tfile; int fd; fd = creat(tfile, FMASK); if(fd < 0) { panic("Cannot create %s\n", tfile); } bwrite(fd, (char *)levl, sizeof(levl)); bwrite(fd, (char *)nul, sizeof(long)); bwrite(fd, (char *)&xupstair, sizeof(xupstair)); bwrite(fd, (char *)&yupstair, sizeof(yupstair)); bwrite(fd, (char *)&xdnstair, sizeof(xdnstair)); bwrite(fd, (char *)&ydnstair, sizeof(ydnstair)); savemonchn(fd, fmon); savegenchn(fd, fgold); savegenchn(fd, ftrap); saveobjchn(fd, fobj); saveobjchn(fd, (struct obj *)0); bwrite(fd, (char *)nul, sizeof(unsigned)); #ifndef QUEST bwrite(fd, (char *)rooms, sizeof(rooms)); bwrite(fd, (char *)doors, sizeof(doors)); #endif ftrap = 0; fgold = 0; fobj = 0; }
void savelev(struct memfile *mf, xchar levnum) { int x, y; unsigned int lflags; struct level *lev = levels[levnum]; if (iflags.purge_monsters) { /* purge any dead monsters (necessary if we're starting * a panic save rather than a normal one, or sometimes * when changing levels without taking time -- e.g. * create statue trap then immediately level teleport) */ dmonsfree(lev); } mfmagic_set(mf, LEVEL_MAGIC); mwrite8(mf, lev->z.dnum); mwrite8(mf, lev->z.dlevel); mwrite(mf, lev->levname, sizeof(lev->levname)); for (x = 0; x < COLNO; x++) for (y = 0; y < ROWNO; y++) save_location(mf, &lev->locations[x][y]); mwrite32(mf, lev->lastmoves); mwrite(mf, &lev->upstair, sizeof(stairway)); mwrite(mf, &lev->dnstair, sizeof(stairway)); mwrite(mf, &lev->upladder, sizeof(stairway)); mwrite(mf, &lev->dnladder, sizeof(stairway)); mwrite(mf, &lev->sstairs, sizeof(stairway)); mwrite(mf, &lev->updest, sizeof(dest_area)); mwrite(mf, &lev->dndest, sizeof(dest_area)); mwrite8(mf, lev->flags.nfountains); mwrite8(mf, lev->flags.nsinks); lflags = (lev->flags.has_shop << 31) | (lev->flags.has_vault << 30) | (lev->flags.has_zoo << 29) | (lev->flags.has_court << 28) | (lev->flags.has_morgue << 27) | (lev->flags.has_beehive << 26) | (lev->flags.has_barracks << 25) | (lev->flags.has_temple << 24) | (lev->flags.has_swamp << 23) | (lev->flags.noteleport << 22) | (lev->flags.hardfloor << 21) | (lev->flags.nommap << 20) | (lev->flags.hero_memory << 19) | (lev->flags.shortsighted << 18) | (lev->flags.graveyard << 17) | (lev->flags.is_maze_lev << 16) | (lev->flags.is_cavernous_lev << 15) | (lev->flags.arboreal << 14) | (lev->flags.forgotten << 13); mwrite32(mf, lflags); mwrite(mf, lev->doors, sizeof(lev->doors)); save_rooms(mf, lev); /* no dynamic memory to reclaim */ /* must be saved before mons, objs, and buried objs */ save_timers(mf, lev, RANGE_LEVEL); save_light_sources(mf, lev, RANGE_LEVEL); savemonchn(mf, lev->monlist); save_worm(mf, lev); /* save worm information */ savetrapchn(mf, lev->lev_traps); saveobjchn(mf, lev->objlist); saveobjchn(mf, lev->buriedobjlist); saveobjchn(mf, lev->billobjs); save_engravings(mf, lev); savedamage(mf, lev); save_regions(mf, lev); }