// 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; }
/* 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); }
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); }
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"); }