|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 3696 (0xe70) Types: TextFile Names: »save.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Wanderer/save.c.orig«
#include "wand_head.h" extern char screen[NOOFROWS][ROWLEN+1]; extern int saved_game; struct saved_game { short num; short score; short bell; short maxmoves; short num_monsters; }; struct save_vars zz; void save_game(num, score, bell, maxmoves, start_of_list, tail_of_list) int num, *score, *bell, maxmoves; struct mon_rec *start_of_list, *tail_of_list; { char fname[128], *fp; FILE *fo; struct saved_game s; extern char *getenv(); struct mon_rec *mp; clear(); refresh(); echo(); CBOFF; endwin(); if ((char *)NULL == (fp = getenv("SAVENAME"))) { printf("Saving game.... Filename ? "); fflush(stdout); fp = fname; gets(fp); } if ((FILE *)NULL == (fo = fopen(fp, W_BIN))) { printf("Open error on '%s'n", fp); exit(1); } s.num = num; s.score = *score; s.bell = *bell; s.maxmoves = maxmoves; s.num_monsters = 0; mp = start_of_list; /* first entry is dummy */ while (mp != tail_of_list) { mp = mp->next; s.num_monsters++; /* count them monsters */ } if ( (1 != fwrite((char *)&s, sizeof(s), 1, fo)) || (1 != fwrite((char *)screen, sizeof(screen), 1, fo)) || (1 != fwrite((char *)&zz, sizeof(zz), 1, fo)) ) { printf("Write error on '%s'n", fname); fclose(fo); unlink(fname); exit(1); } mp = start_of_list; while (mp != tail_of_list) { /* save them monsters */ mp = mp->next; if (1 != fwrite((char *)mp, sizeof(struct mon_rec), 1, fo)) { printf("Write error on '%s'n", fname); fclose(fo); unlink(fname); exit(1); } } fclose(fo); exit(0); } void restore_game(num, score, bell, maxmoves, start_of_list, tail_of_list) int *num, *score, *bell, *maxmoves; struct mon_rec *start_of_list, **tail_of_list; { FILE *fi; struct saved_game s; struct mon_rec *mp, *tmp, tmp_monst; char fname[128], *fp; FILE *fo; extern char *getenv(); if ((char *)NULL == (fp = getenv("SAVENAME"))) { move((LINES-1),0); addstr("Restore Filename ? "); refresh(); echo(); CBOFF; fp = fname; gets(fp); CBON; noecho(); } clear(); refresh(); if ((FILE *)NULL == (fi = fopen(fp, R_BIN))) { endwin(); printf("Open error on '%s'n", fp); exit(1); } if ( (1 != fread((char *)&s, sizeof(s), 1, fi)) || (1 != fread((char *)screen, sizeof(screen), 1, fi)) || (1 != fread((char *)&zz, sizeof(zz), 1, fi)) ) { endwin(); printf("Read error on '%s'n", fp); fclose(fi); exit(1); } *num = s.num; *score = s.score; *bell = s.bell; *maxmoves = s.maxmoves; /* free any monsters already on chain, to start clean */ mp = start_of_list->next; while ((mp != NULL) && (mp != start_of_list)) { /* free them monsters */ tmp = mp; mp = mp->next; free(tmp); } /* re-initialize the monster list */ /* *start_of_list = {0,0,0,0,0,NULL,NULL}; */ start_of_list->x = 0; start_of_list->y = 0; start_of_list->mx = 0; start_of_list->my = 0; start_of_list->under = 0; start_of_list->next = (struct mon_rec *)NULL; start_of_list->prev = (struct mon_rec *)NULL; *tail_of_list = start_of_list; while (s.num_monsters--) { /* use make_monster to allocate the monster structures */ /* to get all the linking right without even trying */ if ((struct mon_rec *)NULL == (mp = make_monster(0, 0))) { endwin(); printf("Monster alloc error on '%s'n", fp); fclose(fi); exit(1); } if (1 != fread((char *)&tmp_monst, sizeof(struct mon_rec), 1, fi)) { endwin(); printf("Monster read error on '%s'n", fp); fclose(fi); exit(1); } /* copy info without trashing links */ mp->x = tmp_monst.x; mp->y = tmp_monst.y; mp->mx = tmp_monst.mx; mp->my = tmp_monst.my; mp->under = tmp_monst.under; } fclose(fi); unlink(fp); saved_game = 1; }