/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.lev.c - version 1.0.3 */
extern struct monst
*restmonchn();
extern struct obj
*restobjchn();
extern struct obj
*billobjs
;
extern struct wseg
*wsegs
[32], *wheads
[32];
extern long wgrowtime
[32];
boolean level_exists
[MAXLEVEL
+1];
register struct wseg
*wtmp
, *wtmp2
;
if(fd
< 0) panic("Save on bad file!"); /* impossible */
if(lev
>= 0 && lev
<= MAXLEVEL
)
level_exists
[lev
] = TRUE
;
bwrite(fd
,(char *) &hackpid
,sizeof(hackpid
));
bwrite(fd
,(char *) &lev
,sizeof(lev
));
bwrite(fd
,(char *) levl
,sizeof(levl
));
bwrite(fd
,(char *) &moves
,sizeof(long));
bwrite(fd
,(char *) &xupstair
,sizeof(xupstair
));
bwrite(fd
,(char *) &yupstair
,sizeof(yupstair
));
bwrite(fd
,(char *) &xdnstair
,sizeof(xdnstair
));
bwrite(fd
,(char *) &ydnstair
,sizeof(ydnstair
));
saveobjchn(fd
, billobjs
);
bwrite(fd
,(char *) rooms
,sizeof(rooms
));
bwrite(fd
,(char *) doors
,sizeof(doors
));
bwrite(fd
,(char *) wsegs
,sizeof(wsegs
));
for(tmp
=1; tmp
<32; tmp
++){
for(wtmp
= wsegs
[tmp
]; wtmp
; wtmp
= wtmp2
){
bwrite(fd
,(char *) wtmp
,sizeof(struct wseg
));
bwrite(fd
,(char *) wgrowtime
,sizeof(wgrowtime
));
/* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
if(write(fd
, loc
, (int) num
) != num
)
panic("cannot write %u bytes to file #%d", num
, fd
);
register struct obj
*otmp
;
register struct obj
*otmp2
;
bwrite(fd
, (char *) &xl
, sizeof(int));
bwrite(fd
, (char *) otmp
, xl
+ sizeof(struct obj
));
bwrite(fd
, (char *) &minusone
, sizeof(int));
register struct monst
*mtmp
;
register struct monst
*mtmp2
;
struct permonst
*monbegin
= &mons
[0];
bwrite(fd
, (char *) &monbegin
, sizeof(monbegin
));
xl
= mtmp
->mxlth
+ mtmp
->mnamelth
;
bwrite(fd
, (char *) &xl
, sizeof(int));
bwrite(fd
, (char *) mtmp
, xl
+ sizeof(struct monst
));
if(mtmp
->minvent
) saveobjchn(fd
,mtmp
->minvent
);
bwrite(fd
, (char *) &minusone
, sizeof(int));
register struct gold
*gold
;
register struct gold
*gold2
;
bwrite(fd
, (char *) gold
, sizeof(struct gold
));
bwrite(fd
, nul
, sizeof(struct gold
));
register struct trap
*trap
;
register struct trap
*trap2
;
bwrite(fd
, (char *) trap
, sizeof(struct trap
));
bwrite(fd
, nul
, sizeof(struct trap
));
register struct gold
*gold
;
register struct trap
*trap
;
register struct wseg
*wtmp
;
/* First some sanity checks */
mread(fd
, (char *) &hpid
, sizeof(hpid
));
mread(fd
, (char *) &dlvl
, sizeof(dlvl
));
if((pid
&& pid
!= hpid
) || (lev
&& dlvl
!= lev
)) {
pline("Strange, this map is not as I remember it.");
pline("Somebody is trying some trickery here ...");
pline("This game is void ...");
mread(fd
, (char *) levl
, sizeof(levl
));
mread(fd
, (char *)&omoves
, sizeof(omoves
));
mread(fd
, (char *)&xupstair
, sizeof(xupstair
));
mread(fd
, (char *)&yupstair
, sizeof(yupstair
));
mread(fd
, (char *)&xdnstair
, sizeof(xdnstair
));
mread(fd
, (char *)&ydnstair
, sizeof(ydnstair
));
/* regenerate animals while on another level */
{ long tmoves
= (moves
> omoves
) ? moves
-omoves
: 0;
register struct monst
*mtmp
, *mtmp2
;
for(mtmp
= fmon
; mtmp
; mtmp
= mtmp2
) {
long newhp
; /* tmoves may be very large */
if(index(genocided
, mtmp
->data
->mlet
)) {
if(mtmp
->mtame
&& tmoves
> 250) {
(index(MREGEN
, mtmp
->data
->mlet
) ? tmoves
: tmoves
/20);
mtmp
->mhp
= mtmp
->mhpmax
;
mread(fd
, (char *)gold
, sizeof(struct gold
));
mread(fd
, (char *)gold
, sizeof(struct gold
));
mread(fd
, (char *)trap
, sizeof(struct trap
));
mread(fd
, (char *)trap
, sizeof(struct trap
));
billobjs
= restobjchn(fd
);
mread(fd
, (char *)rooms
, sizeof(rooms
));
mread(fd
, (char *)doors
, sizeof(doors
));
mread(fd
, (char *)wsegs
, sizeof(wsegs
));
for(tmp
= 1; tmp
< 32; tmp
++) if(wsegs
[tmp
]){
wheads
[tmp
] = wsegs
[tmp
] = wtmp
= newseg();
mread(fd
, (char *)wtmp
, sizeof(struct wseg
));
wheads
[tmp
]->nseg
= wtmp
= newseg();
mread(fd
, (char *)wgrowtime
, sizeof(wgrowtime
));
extern boolean restoring
;
rlen
= read(fd
, buf
, (int) len
);
pline("Read %d instead of %u bytes.\n", rlen
, len
);
error("Error restoring old game.");
panic("Error reading level file.");