/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.save.c - version 1.0.3 */
extern char genocided
[60]; /* defined in Decl.c */
extern char fut_geno
[60]; /* idem */
extern char SAVEF
[], nul
[];
extern char pl_character
[PL_CSIZ
];
extern struct obj
*restobjchn();
extern struct monst
*restmonchn();
settty("Be seeing you ...\n");
/* returns 1 if save successful */
int tmp
; /* not register ! */
(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 */
if(flags
.moonphase
== FULL_MOON
) /* ut-sally!fletcher */
u
.uluck
--; /* and unido!ab */
savemonchn(fd
, fallen_down
);
bwrite(fd
, (char *) &tmp
, sizeof tmp
);
bwrite(fd
, (char *) &flags
, sizeof(struct flag
));
bwrite(fd
, (char *) &dlevel
, sizeof dlevel
);
bwrite(fd
, (char *) &maxdlevel
, sizeof maxdlevel
);
bwrite(fd
, (char *) &moves
, sizeof moves
);
bwrite(fd
, (char *) &u
, sizeof(struct you
));
bwrite(fd
, (char *) &(u
.ustuck
->m_id
), sizeof u
.ustuck
->m_id
);
bwrite(fd
, (char *) pl_character
, sizeof pl_character
);
bwrite(fd
, (char *) genocided
, sizeof genocided
);
bwrite(fd
, (char *) fut_geno
, sizeof fut_geno
);
for(tmp
= 1; tmp
<= maxdlevel
; tmp
++) {
extern boolean level_exists
[];
if(tmp
== dlevel
|| !level_exists
[tmp
]) continue;
if((ofd
= open(lock
, 0)) < 0) {
if(!hu
) pline("Error while saving: cannot read %s.", lock
);
getlev(ofd
, hackpid
, tmp
);
bwrite(fd
, (char *) &tmp
, sizeof tmp
); /* level number */
savelev(fd
,tmp
); /* actual level */
(void) unlink(lock
); /* get rid of current level --jgm */
int tmp
; /* not a register ! */
extern boolean restoring
;
for(otmp
= invent
; otmp
; otmp
= otmp
->nobj
)
setworn(otmp
, otmp
->owornmask
);
fallen_down
= restmonchn(fd
);
mread(fd
, (char *) &tmp
, sizeof tmp
);
if(tmp
!= getuid()) { /* strange ... */
puts("Saved game was not yours.");
mread(fd
, (char *) &flags
, sizeof(struct flag
));
mread(fd
, (char *) &dlevel
, sizeof dlevel
);
mread(fd
, (char *) &maxdlevel
, sizeof maxdlevel
);
mread(fd
, (char *) &moves
, sizeof moves
);
mread(fd
, (char *) &u
, sizeof(struct you
));
mread(fd
, (char *) &mid
, sizeof mid
);
mread(fd
, (char *) pl_character
, sizeof pl_character
);
mread(fd
, (char *) genocided
, sizeof genocided
);
mread(fd
, (char *) fut_geno
, sizeof fut_geno
);
if(read(fd
, (char *) &tmp
, sizeof tmp
) != sizeof tmp
)
if((nfd
= creat(lock
, FMASK
)) < 0)
panic("Cannot open temp file %s!\n", lock
);
for(otmp
= fobj
; otmp
; otmp
= otmp
->nobj
)
if(otmp
->olet
== CHAIN_SYM
) goto chainfnd
;
panic("Cannot find the iron chain?");
for(otmp
= fobj
; otmp
; otmp
= otmp
->nobj
)
if(otmp
->olet
== BALL_SYM
&& otmp
->spe
)
panic("Cannot find the iron ball?");
register struct monst
*mtmp
;
for(mtmp
= fmon
; mtmp
; mtmp
= mtmp
->nmon
)
if(mtmp
->m_id
== mid
) goto monfnd
;
panic("Cannot find the monster ustuck.");
setsee(); /* only to recompute seelx etc. - these weren't saved */
register struct obj
*otmp
, *otmp2
;
register struct obj
*first
= 0;
/* suppress "used before set" warning from lint */
mread(fd
, (char *) &xl
, sizeof(xl
));
mread(fd
, (char *) otmp
, (unsigned) xl
+ sizeof(struct obj
));
if(!otmp
->o_id
) otmp
->o_id
= flags
.ident
++;
if(first
&& otmp2
->nobj
){
impossible("Restobjchn: error reading objchn.");
register struct monst
*mtmp
, *mtmp2
;
register struct monst
*first
= 0;
struct permonst
*monbegin
;
mread(fd
, (char *)&monbegin
, sizeof(monbegin
));
differ
= (char *)(&mons
[0]) - (char *)(monbegin
);
/* suppress "used before set" warning from lint */
mread(fd
, (char *) &xl
, sizeof(xl
));
mread(fd
, (char *) mtmp
, (unsigned) xl
+ sizeof(struct monst
));
mtmp
->m_id
= flags
.ident
++;
mtmp
->data
= (struct permonst
*)
((char *) mtmp
->data
+ differ
);
mtmp
->minvent
= restobjchn(fd
);
if(first
&& mtmp2
->nmon
){
impossible("Restmonchn: error reading monchn.");