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.
This commit is contained in:
@@ -13,7 +13,7 @@
|
|||||||
* Incrementing EDITLEVEL can be used to force invalidation of old bones
|
* Incrementing EDITLEVEL can be used to force invalidation of old bones
|
||||||
* and save files.
|
* and save files.
|
||||||
*/
|
*/
|
||||||
#define EDITLEVEL 42
|
#define EDITLEVEL 43
|
||||||
|
|
||||||
#define COPYRIGHT_BANNER_A \
|
#define COPYRIGHT_BANNER_A \
|
||||||
"NetHack, Copyright 1985-2009"
|
"NetHack, Copyright 1985-2009"
|
||||||
|
|||||||
+30
-27
@@ -229,56 +229,58 @@ boolean ghostly;
|
|||||||
free((genericptr_t)tmp_dam);
|
free((genericptr_t)tmp_dam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* restore one object */
|
||||||
STATIC_OVL void
|
STATIC_OVL void
|
||||||
restobj(fd, otmp)
|
restobj(fd, otmp)
|
||||||
int fd;
|
int fd;
|
||||||
struct obj *otmp;
|
struct obj *otmp;
|
||||||
{
|
{
|
||||||
int buflen;
|
int buflen;
|
||||||
|
|
||||||
mread(fd, (genericptr_t) otmp, sizeof(struct obj));
|
mread(fd, (genericptr_t) otmp, sizeof(struct obj));
|
||||||
|
|
||||||
/* any saved pointers are mostly invalid */
|
/* next object pointers are invalid; otmp->cobj needs to be left
|
||||||
otmp->nobj = (struct obj *)0;
|
as is--being non-null is key to restoring container contents */
|
||||||
otmp->oextra = (struct oextra *)0;
|
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 */
|
/* oname - object's name */
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
if (buflen > 0) {
|
if (buflen > 0) { /* includes terminating '\0' */
|
||||||
new_oname(otmp, buflen);
|
new_oname(otmp, buflen);
|
||||||
mread(fd, (genericptr_t) ONAME(otmp), buflen);
|
mread(fd, (genericptr_t) ONAME(otmp), buflen);
|
||||||
}
|
}
|
||||||
|
/* omonst - corpse or statue might retain full monster details */
|
||||||
/* omonst */
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
if (buflen > 0) {
|
||||||
if (buflen > 0) {
|
|
||||||
newomonst(otmp);
|
newomonst(otmp);
|
||||||
/* this is actually a monst struct, so we
|
/* this is actually a monst struct, so we
|
||||||
can just defer to restmon() here */
|
can just defer to restmon() here */
|
||||||
restmon(fd, OMONST(otmp));
|
restmon(fd, OMONST(otmp));
|
||||||
}
|
}
|
||||||
|
/* omid - monster id number, connecting corpse to ghost */
|
||||||
/* omid */
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
if (buflen > 0) {
|
||||||
if (buflen > 0) {
|
|
||||||
newomid(otmp);
|
newomid(otmp);
|
||||||
mread(fd, (genericptr_t) OMID(otmp), buflen);
|
mread(fd, (genericptr_t) OMID(otmp), buflen);
|
||||||
}
|
}
|
||||||
|
/* olong - temporary gold */
|
||||||
/* olong */
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
if (buflen > 0) {
|
||||||
if (buflen > 0) {
|
|
||||||
newolong(otmp);
|
newolong(otmp);
|
||||||
mread(fd, (genericptr_t) OLONG(otmp), buflen);
|
mread(fd, (genericptr_t) OLONG(otmp), buflen);
|
||||||
}
|
}
|
||||||
|
/* omailcmd - feedback mechanism for scroll of mail */
|
||||||
/* omailcmd */
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
if (buflen > 0) {
|
||||||
if (buflen > 0) {
|
|
||||||
char *omailcmd = (char *)alloc(buflen);
|
char *omailcmd = (char *)alloc(buflen);
|
||||||
|
|
||||||
mread(fd, (genericptr_t) omailcmd, buflen);
|
mread(fd, (genericptr_t) omailcmd, buflen);
|
||||||
new_omailcmd(otmp, omailcmd);
|
new_omailcmd(otmp, omailcmd);
|
||||||
free((genericptr_t)omailcmd);
|
free((genericptr_t)omailcmd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,6 +343,7 @@ boolean ghostly, frozen;
|
|||||||
return(first);
|
return(first);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* restore one monster */
|
||||||
STATIC_OVL void
|
STATIC_OVL void
|
||||||
restmon(fd, mtmp)
|
restmon(fd, mtmp)
|
||||||
int fd;
|
int fd;
|
||||||
|
|||||||
+1
-8
@@ -942,14 +942,7 @@ struct obj *otmp;
|
|||||||
buflen = sizeof(struct obj);
|
buflen = sizeof(struct obj);
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
bwrite(fd, (genericptr_t) &buflen, sizeof(int));
|
||||||
bwrite(fd, (genericptr_t) otmp, buflen);
|
bwrite(fd, (genericptr_t) otmp, buflen);
|
||||||
if (!otmp->oextra) {
|
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 (ONAME(otmp)) buflen = strlen(ONAME(otmp)) + 1;
|
if (ONAME(otmp)) buflen = strlen(ONAME(otmp)) + 1;
|
||||||
else buflen = 0;
|
else buflen = 0;
|
||||||
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
bwrite(fd, (genericptr_t) &buflen, sizeof buflen);
|
||||||
|
|||||||
Reference in New Issue
Block a user