Exemplo n.º 1
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;
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
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);
}
Exemplo n.º 4
0
main(short argc, char **argv)
{
	long i, j, endoffile;
	char wadfile[80];

	printf("Wad2Art!                                       Copyright 1995 by Ken Silverman\n");

	if (argc != 2)
	{
		printf("Command line parameters: Wad2Art [Doom IWAD file]\n");
		printf("   Creates TILES000.ART, PALETTE.DAT, and NAMES.H in current directory.\n");
		printf("   Ex: wad2art c:\\doom\\doom.wad\n");
		exit(0);
	}

	strcpy(wadfile,argv[1]);
	if (strchr(wadfile,'.') == 0) strcat(wadfile,".wad");
	if ((fil1 = open(wadfile,O_BINARY|O_RDWR,S_IREAD)) == -1)
		{ printf("Wad not found\n"); exit(0); }
	if ((fil2 = open("tiles000.art",O_BINARY|O_TRUNC|O_CREAT|O_WRONLY,S_IWRITE)) == -1)
		{ printf("Can't open art file\n"); exit(0); }

	frameplace = FP_OFF(screen);

	j = 0;
	for(i=0;i<256;i++) { ylookup[i] = j; j += 320; }

	printf("Loading wad header...\n");
	loadwadheader();
	setvmode(0x13);
	lseek(fil2,16+(numwads<<3),SEEK_SET);
	for(i=0;i<numwads;i++)
		{ tilesizx[i] = 0; tilesizy[i] = 0; picanm[i] = 0L; }

	printf("Saving names.h\n");
	savenames();
	printf("Converting palette\n");
	convpalette();

	printf("Saving tiles000.art\n");
	showart("L_START");
	showart("S_START");
	showart("P_START");
	showart("F_START");

	printf("Saving tiles000.art header\n");
	artversion = 1; localtilestart = 0; localtileend = numwads-1;

	endoffile = tell(fil2);
	lseek(fil2,0,SEEK_SET);
	write(fil2,&artversion,4);
	write(fil2,&numwads,4);
	write(fil2,&localtilestart,4);
	write(fil2,&localtileend,4);
	write(fil2,&tilesizx[0],numwads<<1);
	write(fil2,&tilesizy[0],numwads<<1);
	write(fil2,&picanm[0],numwads<<2);
	lseek(fil2,endoffile,SEEK_SET);

	close(fil2);
	close(fil1);

	setvmode(0x3);
	printf("Congratulations!  Your disk actually had enough space this time!\n");
}