#else
E void FDECL(mread, (int,genericptr_t,unsigned int));
#endif
+#ifndef GOLDOBJ
+E void FDECL(put_gold_back, (struct obj **,long *));
+#endif
/* ### rip.c ### */
long mtrapseen; /* bitmap of traps we've been trapped in */
long mlstmv; /* for catching up with lost time */
+ long mspare1;
#ifndef GOLDOBJ
- long mgold;
+#define mgold mspare1
#endif
struct obj *minvent;
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
-#define EDITLEVEL 0
+#define EDITLEVEL 1
#define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2003"
int ugangr; /* if the gods are angry at you */
int ugifts; /* number of artifacts bestowed */
int ublessed, ublesscnt; /* blessing/duration from #pray */
-#ifndef GOLDOBJ
- long ugold, ugold0;
-#else
long umoney0;
+ long uspare1;
+#ifndef GOLDOBJ
+#define ugold uspare1
+#define ugold0 umoney0
#endif
long uexp, urexp;
long ucleansed; /* to record moves when player was cleansed */
STATIC_DCL void FDECL(restlevelstate, (unsigned int, unsigned int));
STATIC_DCL int FDECL(restlevelfile, (int,XCHAR_P));
STATIC_DCL void FDECL(reset_oattached_mids, (BOOLEAN_P));
+STATIC_DCL struct obj *FDECL(gold_in, (struct obj *));
/*
* Save a mapping of IDs from ghost levels to the current level. This
/* restore monster back pointer */
for (obj = mtmp->minvent; obj; obj = obj->nobj)
obj->ocarry = mtmp;
+#ifndef GOLDOBJ
+ put_gold_back(&mtmp->minvent, &mtmp->mgold);
+#endif
}
if (mtmp->mw) {
struct obj *obj;
restore_timers(fd, RANGE_GLOBAL, FALSE, 0L);
restore_light_sources(fd);
invent = restobjchn(fd, FALSE, FALSE);
+#ifndef GOLDOBJ
+ put_gold_back(&invent, &u.ugold);
+#endif
migrating_objs = restobjchn(fd, FALSE, FALSE);
migrating_mons = restmonchn(fd, FALSE);
mread(fd, (genericptr_t) mvitals, sizeof(mvitals));
}
}
#endif /* ZEROCOMP */
+#ifndef GOLDOBJ
+/*
+ * Takes all of the gold objects out of the invent or
+ * mtmp->minvent chain and puts it into either
+ * u.ugold or mtmp->mgold.
+ */
+void
+put_gold_back(head_ptr, goldptr)
+struct obj **head_ptr;
+long *goldptr;
+{
+ struct obj *goldobj;
+ long gld = 0L;
+
+ while ((goldobj = gold_in(*head_ptr))) {
+ gld += goldobj->quan;
+ extract_nobj(goldobj, head_ptr);
+ dealloc_obj(goldobj);
+ }
+ if (gld) *goldptr += gld;
+}
+
+STATIC_OVL struct obj *
+gold_in(chn)
+struct obj *chn;
+{
+ struct obj *otmp;
+
+ for(otmp = chn; otmp; otmp = otmp->nobj)
+ if(otmp->otyp == GOLD_PIECE)
+ return(otmp);
+ return((struct obj *) 0);
+}
+#endif /*GOLDOBJ*/
/*restore.c*/
uid = getuid();
bwrite(fd, (genericptr_t) &uid, sizeof uid);
bwrite(fd, (genericptr_t) &flags, sizeof(struct flag));
+#ifndef GOLDOBJ
+ if (u.ugold) {
+ struct obj *goldobj = mksobj(GOLD_PIECE, FALSE, FALSE);
+ goldobj->quan = u.ugold;
+ goldobj->where = OBJ_INVENT;
+ u.ugold = 0L;
+ goldobj->nobj = invent;
+ invent = goldobj;
+ }
+#endif
bwrite(fd, (genericptr_t) &u, sizeof(struct you));
/* must come before migrating_objs and migrating_mons are freed */
save_light_sources(fd, mode, RANGE_GLOBAL);
saveobjchn(fd, invent, mode);
+#ifndef GOLDOBJ
+ if (!release_data(mode))
+ put_gold_back(&invent, &u.ugold);
+#endif
saveobjchn(fd, migrating_objs, mode);
savemonchn(fd, migrating_mons, mode);
if (release_data(mode)) {
mtmp->mnum = monsndx(mtmp->data);
xl = mtmp->mxlth + mtmp->mnamelth;
bwrite(fd, (genericptr_t) &xl, sizeof(int));
+#ifndef GOLDOBJ
+ if (mtmp->mgold) {
+ struct obj *goldobj = mksobj(GOLD_PIECE, FALSE, FALSE);
+ goldobj->quan = mtmp->mgold;
+ goldobj->ocarry = mtmp;
+ goldobj->where = OBJ_MINVENT;
+ mtmp->mgold = 0L;
+ goldobj->nobj = mtmp->minvent;
+ mtmp->minvent = goldobj;
+ }
+#endif
bwrite(fd, (genericptr_t) mtmp, xl + sizeof(struct monst));
}
if (mtmp->minvent)
saveobjchn(fd,mtmp->minvent,mode);
+#ifndef GOLDOBJ
+ if (!release_data(mode))
+ put_gold_back(&mtmp->minvent, &mtmp->mgold);
+#endif
if (release_data(mode))
dealloc_monst(mtmp);
mtmp = mtmp2;
/*
* Use this to explicitly mask out features during version checks.
*/
-#define IGNORED_FEATURES ( 0L )
+#define IGNORED_FEATURES ( 0L \
+ | (1L << 12) /* GOLDOBJ */ \
+ )
static void
make_version()