From 2904f49767ee6dd5dad9f77388a1b898543365db Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sun, 1 Feb 2009 02:16:47 +0000 Subject: [PATCH] object save/restore (trunk only) Make the same simplification to save and restore of obj->oextra as was done yesterday for monst->mextra: no need for a set of all 0 sizes when the whole thing is null. Bumps EDITLEVEL again. --- include/patchlevel.h | 2 +- src/restore.c | 57 +++++++++++++++++++++++--------------------- src/save.c | 9 +------ 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/include/patchlevel.h b/include/patchlevel.h index ec4f58173..fdd9a2023 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -13,7 +13,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 42 +#define EDITLEVEL 43 #define COPYRIGHT_BANNER_A \ "NetHack, Copyright 1985-2009" diff --git a/src/restore.c b/src/restore.c index 748a77e11..a0e11ba52 100644 --- a/src/restore.c +++ b/src/restore.c @@ -229,56 +229,58 @@ boolean ghostly; free((genericptr_t)tmp_dam); } +/* restore one object */ STATIC_OVL void restobj(fd, otmp) int fd; struct obj *otmp; { int buflen; - + mread(fd, (genericptr_t) otmp, sizeof(struct obj)); - /* any saved pointers are mostly invalid */ - otmp->nobj = (struct obj *)0; - otmp->oextra = (struct oextra *)0; + /* next object pointers are invalid; otmp->cobj needs to be left + as is--being non-null is key to restoring container contents */ + otmp->nobj = otmp->nexthere = (struct obj *)0; + /* non-null oextra needs to be reconstructed */ + if (otmp->oextra) { + otmp->oextra = newoextra(); - /* read the length of the name and the name */ - mread(fd, (genericptr_t) &buflen, sizeof(buflen)); - if (buflen > 0) { + /* oname - object's name */ + mread(fd, (genericptr_t) &buflen, sizeof(buflen)); + if (buflen > 0) { /* includes terminating '\0' */ new_oname(otmp, buflen); mread(fd, (genericptr_t) ONAME(otmp), buflen); - } - - /* omonst */ - mread(fd, (genericptr_t) &buflen, sizeof(buflen)); - if (buflen > 0) { + } + /* omonst - corpse or statue might retain full monster details */ + mread(fd, (genericptr_t) &buflen, sizeof(buflen)); + if (buflen > 0) { newomonst(otmp); /* this is actually a monst struct, so we can just defer to restmon() here */ restmon(fd, OMONST(otmp)); - } - - /* omid */ - mread(fd, (genericptr_t) &buflen, sizeof(buflen)); - if (buflen > 0) { + } + /* omid - monster id number, connecting corpse to ghost */ + mread(fd, (genericptr_t) &buflen, sizeof(buflen)); + if (buflen > 0) { newomid(otmp); mread(fd, (genericptr_t) OMID(otmp), buflen); - } - - /* olong */ - mread(fd, (genericptr_t) &buflen, sizeof(buflen)); - if (buflen > 0) { + } + /* olong - temporary gold */ + mread(fd, (genericptr_t) &buflen, sizeof(buflen)); + if (buflen > 0) { newolong(otmp); mread(fd, (genericptr_t) OLONG(otmp), buflen); - } - - /* omailcmd */ - mread(fd, (genericptr_t) &buflen, sizeof(buflen)); - if (buflen > 0) { + } + /* omailcmd - feedback mechanism for scroll of mail */ + mread(fd, (genericptr_t) &buflen, sizeof(buflen)); + if (buflen > 0) { char *omailcmd = (char *)alloc(buflen); + mread(fd, (genericptr_t) omailcmd, buflen); new_omailcmd(otmp, omailcmd); free((genericptr_t)omailcmd); + } } } @@ -341,6 +343,7 @@ boolean ghostly, frozen; return(first); } +/* restore one monster */ STATIC_OVL void restmon(fd, mtmp) int fd; diff --git a/src/save.c b/src/save.c index bbe3befef..e6bc427c1 100644 --- a/src/save.c +++ b/src/save.c @@ -942,14 +942,7 @@ struct obj *otmp; buflen = sizeof(struct obj); bwrite(fd, (genericptr_t) &buflen, sizeof(int)); bwrite(fd, (genericptr_t) otmp, buflen); - if (!otmp->oextra) { - /* for oname, omonst, omid, olong, omailcmd */ - bwrite(fd, (genericptr_t) &zerobuf, sizeof(int)); - bwrite(fd, (genericptr_t) &zerobuf, sizeof(int)); - bwrite(fd, (genericptr_t) &zerobuf, sizeof(int)); - bwrite(fd, (genericptr_t) &zerobuf, sizeof(int)); - bwrite(fd, (genericptr_t) &zerobuf, sizeof(int)); - } else { + if (otmp->oextra) { if (ONAME(otmp)) buflen = strlen(ONAME(otmp)) + 1; else buflen = 0; bwrite(fd, (genericptr_t) &buflen, sizeof buflen);