Beispiel #1
0
/* 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);
}
Beispiel #2
0
// 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;
}
Beispiel #3
0
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
/*--------------------------------------------------------*/
}
Beispiel #4
0
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 */
}
Beispiel #5
0
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);
}
Beispiel #6
0
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;
}
Beispiel #7
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);
}