-/* NetHack 3.7 save.c $NHDT-Date: 1606919257 2020/12/02 14:27:37 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.163 $ */
+/* NetHack 3.7 save.c $NHDT-Date: 1606949327 2020/12/02 22:48:47 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.164 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2009. */
/* NetHack may be freely redistributed. See license for details. */
#endif
static void FDECL(savelevchn, (NHFILE *));
-static void FDECL(savedamage, (NHFILE *));
-/* static void FDECL(saveobj, (NHFILE *,struct obj *)); */
-/* static void FDECL(savemon, (NHFILE *,struct monst *)); */
-/* static void FDECL(savelevl, (NHFILE *, BOOLEAN_P)); */
-static void FDECL(saveobj, (NHFILE *,struct obj *));
-static void FDECL(savemon, (NHFILE *,struct monst *));
static void FDECL(savelevl, (NHFILE *,BOOLEAN_P));
+static void FDECL(savedamage, (NHFILE *));
static void FDECL(save_stairs, (NHFILE *));
+static void FDECL(saveobj, (NHFILE *,struct obj *));
static void FDECL(saveobjchn, (NHFILE *,struct obj **));
+static void FDECL(savemon, (NHFILE *,struct monst *));
static void FDECL(savemonchn, (NHFILE *,struct monst *));
static void FDECL(savetrapchn, (NHFILE *,struct trap *));
static void FDECL(savegamestate, (NHFILE *));
getlev(onhfp, g.hackpid, ltmp);
close_nhfile(onhfp);
if (nhfp->structlevel)
- bwrite(nhfp->fd, (genericptr_t) <mp, sizeof ltmp); /* level number*/
+ bwrite(nhfp->fd, (genericptr_t) <mp, sizeof ltmp); /* lvl no. */
savelev(nhfp, ltmp); /* actual level*/
delete_levelfile(ltmp);
}
unsigned long uid;
struct obj *bc_objs = (struct obj *)0;
- if (!g.program_state.saving)
- impossible("savegamestate called when not saving or changing levels?");
-
+ g.program_state.saving++; /* caller should/did already set this... */
uid = (unsigned long) getuid();
if (nhfp->structlevel) {
bwrite(nhfp->fd, (genericptr_t) &uid, sizeof uid);
save_msghistory(nhfp);
if (nhfp->structlevel)
bflush(nhfp->fd);
+ g.program_state.saving--;
+ return;
}
+/* potentially called from goto_level(do.c) as well as savestateinlock() */
boolean
tricked_fileremoved(nhfp, whynot)
NHFILE *nhfp;
* readable by an external utility
*/
nhfp = open_levelfile(0, whynot);
- if (tricked_fileremoved(nhfp, whynot))
+ if (tricked_fileremoved(nhfp, whynot)) {
+ g.program_state.saving--;
return;
+ }
if (nhfp->structlevel)
(void) read(nhfp->fd, (genericptr_t) &hpid, sizeof hpid);
}
g.program_state.saving--;
g.havestate = flags.ins_chkpt;
+ return;
}
#endif
bflush(nhfp->fd);
}
g.program_state.saving--;
+ return;
}
static void
if (nhfp->structlevel) {
bwrite(nhfp->fd, (genericptr_t) levl, sizeof levl);
}
+ return;
}
/* used when saving a level and also when saving dungeon overview data */
g.level.damagelist = 0;
}
+static void
+save_stairs(nhfp)
+NHFILE *nhfp;
+{
+ stairway *stway = g.stairs;
+ int buflen = (int) sizeof *stway;
+
+ while (stway) {
+ if (perform_bwrite(nhfp)) {
+ if (nhfp->structlevel) {
+ bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
+ bwrite(nhfp->fd, (genericptr_t) stway, sizeof *stway);
+ }
+ }
+ stway = stway->next;
+ }
+ if (perform_bwrite(nhfp)) {
+ if (nhfp->structlevel) {
+ buflen = -1;
+ bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
+ }
+ }
+}
+
+/* save one object;
+ caveat: this is only for perform_bwrite(); caller handles release_data() */
static void
saveobj(nhfp, otmp)
NHFILE *nhfp;
}
/* omid used to be indirect via a pointer in oextra but has
become part of oextra itself; 0 means not applicable and
- gets saved/restored whenever any other oxtra components do */
+ gets saved/restored whenever any other oextra components do */
if (nhfp->structlevel)
bwrite(nhfp->fd, (genericptr_t) &OMID(otmp), sizeof OMID(otmp));
}
}
-static void
-save_stairs(nhfp)
-NHFILE *nhfp;
-{
- stairway *stway = g.stairs;
- int buflen = (int) sizeof (stairway);
- int len = 0;
-
- while (stway) {
- if (perform_bwrite(nhfp)) {
- if (nhfp->structlevel) {
- len += sizeof(buflen);
- bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
- len += sizeof(stairway);
- bwrite(nhfp->fd, (genericptr_t) stway, sizeof(stairway));
- }
- }
- stway = stway->next;
- }
- if (perform_bwrite(nhfp)) {
- if (nhfp->structlevel) {
- buflen = -1;
- len += sizeof(buflen);
- bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
- }
- }
-}
-
+/* save an object chain; sets head of list to Null when done;
+ handles release_data() for each object in the list */
static void
saveobjchn(nhfp, obj_p)
NHFILE *nhfp;