|
|
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;
}