mimic statues & 2009 startup banner (trunk only)

A mimic posing as a statue was displayed as a tengu statue (and
recognizeable as such now that statues are displayed as the corresponding
monster rather than rock-class back tick), but the lookat code described
it as a giant ant statue (since there was no obj->corpsenm available to
indicate the monster type, it defaulted to 0).  This adds monst->mextra
field `mcorpsenm' so that mimics have a place to remember what sort of
statue or corpse they are mimicking.  And it picks a random monster type
when they take such forms so that the old tengu hack becomes irrelevant.

     newmextra() and newoextra() initialized pointers via memset(...,0)
which is not portable; switch to explicit assignments.  The wizard mode
code to display memory used for monsters and objects added in amounts
for the miscellaneous things pointed to by monst->mextra and obj->oextra
structs but didn't include memory for those structs themselves; add it.
Simplify monster save/restore slightly; there's no need for extra zeroes
to represent monst->mextra->X sizes when monst->mextra is null.

     Update the startup banner for 2009.  I should have done this with a
separate patch but I'm taking a shortcut.  :-]
This commit is contained in:
nethack.rankin
2009-01-31 08:03:41 +00:00
parent 0def692d5f
commit 71219bf093
12 changed files with 124 additions and 71 deletions

View File

@@ -1,4 +1,4 @@
/* SCCS Id: @(#)restore.c 3.5 2008/07/20 */
/* SCCS Id: @(#)restore.c 3.5 2009/01/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -350,56 +350,53 @@ struct monst *mtmp;
mread(fd, (genericptr_t) mtmp, sizeof(struct monst));
/* any saved pointers are mostly invalid */
/* next monster pointer is invalid */
mtmp->nmon = (struct monst *)0;
mtmp->mextra = (struct mextra *)0;
/* non-null mextra needs to be reconstructed */
if (mtmp->mextra) {
mtmp->mextra = newmextra();
/* read the length of the name and the name */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
/* mname - monster's name */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) { /* includes terminating '\0' */
new_mname(mtmp, buflen);
mread(fd, (genericptr_t) MNAME(mtmp), buflen);
}
/* egd */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
}
/* egd - vault guard */
mread(fd, (genericptr_t) &buflen, sizeof (buflen));
if (buflen > 0) {
newegd(mtmp);
mread(fd, (genericptr_t) EGD(mtmp),
sizeof(struct egd));
}
/* epri */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
mread(fd, (genericptr_t) EGD(mtmp), sizeof (struct egd));
}
/* epri - temple priest */
mread(fd, (genericptr_t) &buflen, sizeof (buflen));
if (buflen > 0) {
newepri(mtmp);
mread(fd, (genericptr_t) EPRI(mtmp),
sizeof(struct epri));
}
/* eshk */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
mread(fd, (genericptr_t) EPRI(mtmp), sizeof (struct epri));
}
/* eshk - shopkeeper */
mread(fd, (genericptr_t) &buflen, sizeof (buflen));
if (buflen > 0) {
neweshk(mtmp);
mread(fd, (genericptr_t) ESHK(mtmp),
sizeof(struct eshk));
}
/* emin */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
mread(fd, (genericptr_t) ESHK(mtmp), sizeof (struct eshk));
}
/* emin - minion */
mread(fd, (genericptr_t) &buflen, sizeof (buflen));
if (buflen > 0) {
newemin(mtmp);
mread(fd, (genericptr_t) EMIN(mtmp),
sizeof(struct emin));
}
/* edog */
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
if (buflen > 0) {
mread(fd, (genericptr_t) EMIN(mtmp), sizeof (struct emin));
}
/* edog - pet */
mread(fd, (genericptr_t) &buflen, sizeof (buflen));
if (buflen > 0) {
newedog(mtmp);
mread(fd, (genericptr_t) EDOG(mtmp),
sizeof(struct edog));
}
mread(fd, (genericptr_t) EDOG(mtmp), sizeof (struct edog));
}
/* mcorpsenm - obj->corpsenm for mimic posing as corpse or
statue (inline int rather than pointer to something) */
mread(fd, (genericptr_t) &MCORPSENM(mtmp),
sizeof MCORPSENM(mtmp));
} /* mextra */
}
STATIC_OVL struct monst *