mextra tweaks (trunk only)
Add new_mname/free_mname functions to make monster name handling be more like the other extended data and to hide mextra details a bit more. Add some casts where int and unsigned are being intermixed. Simplify christen_monst(); it ought to be changed to have type `void' but I wanted to avoid modifying another ten or so files.
This commit is contained in:
@@ -348,6 +348,8 @@ E void NDECL(heal_legs);
|
|||||||
/* ### do_name.c ### */
|
/* ### do_name.c ### */
|
||||||
|
|
||||||
E int FDECL(getpos, (coord *,BOOLEAN_P,const char *));
|
E int FDECL(getpos, (coord *,BOOLEAN_P,const char *));
|
||||||
|
E void FDECL(new_mname, (struct monst *,int));
|
||||||
|
E void FDECL(free_mname, (struct monst *));
|
||||||
E struct monst *FDECL(christen_monst, (struct monst *,const char *));
|
E struct monst *FDECL(christen_monst, (struct monst *,const char *));
|
||||||
E int NDECL(do_mname);
|
E int NDECL(do_mname);
|
||||||
E struct obj *FDECL(oname, (struct obj *,const char *));
|
E struct obj *FDECL(oname, (struct obj *,const char *));
|
||||||
|
|||||||
@@ -1853,14 +1853,15 @@ STATIC_OVL int
|
|||||||
size_monst(mtmp)
|
size_monst(mtmp)
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
{
|
{
|
||||||
int sz = sizeof(struct monst);
|
int sz = (int)sizeof (struct monst);
|
||||||
|
|
||||||
if (mtmp->mextra) {
|
if (mtmp->mextra) {
|
||||||
if (MNAME(mtmp)) sz += strlen(MNAME(mtmp))+1;
|
if (MNAME(mtmp)) sz += (int)strlen(MNAME(mtmp)) + 1;
|
||||||
if (EGD(mtmp)) sz += sizeof(struct egd);
|
if (EGD(mtmp)) sz += (int)sizeof (struct egd);
|
||||||
if (EPRI(mtmp)) sz += sizeof(struct epri);
|
if (EPRI(mtmp)) sz += (int)sizeof (struct epri);
|
||||||
if (ESHK(mtmp)) sz += sizeof(struct eshk);
|
if (ESHK(mtmp)) sz += (int)sizeof (struct eshk);
|
||||||
if (EMIN(mtmp)) sz += sizeof(struct emin);
|
if (EMIN(mtmp)) sz += (int)sizeof (struct emin);
|
||||||
if (EDOG(mtmp)) sz += sizeof(struct edog);
|
if (EDOG(mtmp)) sz += (int)sizeof (struct edog);
|
||||||
}
|
}
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
@@ -1964,6 +1965,7 @@ wiz_migrate_mons()
|
|||||||
struct permonst *ptr;
|
struct permonst *ptr;
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
d_level tolevel;
|
d_level tolevel;
|
||||||
|
|
||||||
getlin("How many random monsters to migrate? [0]", inbuf);
|
getlin("How many random monsters to migrate? [0]", inbuf);
|
||||||
if (*inbuf == '\033') return 0;
|
if (*inbuf == '\033') return 0;
|
||||||
mcount = atoi(inbuf);
|
mcount = atoi(inbuf);
|
||||||
|
|||||||
+36
-14
@@ -212,6 +212,36 @@ const char *goal;
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* allocate space for a monster's name; removes old name if there is one */
|
||||||
|
void
|
||||||
|
new_mname(mon, lth)
|
||||||
|
struct monst *mon;
|
||||||
|
int lth; /* desired length (caller handles adding 1 for terminator) */
|
||||||
|
{
|
||||||
|
if (lth) {
|
||||||
|
/* allocate mextra if necessary; otherwise get rid of old name */
|
||||||
|
if (!mon->mextra) mon->mextra = newmextra();
|
||||||
|
else free_mname(mon); /* already has mextra, might also have name */
|
||||||
|
MNAME(mon) = (char *) alloc((unsigned) lth);
|
||||||
|
} else {
|
||||||
|
/* zero length: the new name is empty; get rid of the old name */
|
||||||
|
if (has_name(mon)) free_mname(mon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release a monster's name; retains mextra even if all fields are now null */
|
||||||
|
void
|
||||||
|
free_mname(mon)
|
||||||
|
struct monst *mon;
|
||||||
|
{
|
||||||
|
if (has_name(mon)) {
|
||||||
|
free((genericptr_t)MNAME(mon));
|
||||||
|
MNAME(mon) = (char *)0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* historical note: this returns a monster pointer because it used to
|
||||||
|
allocate a new bigger block of memory to hold the monster and its name */
|
||||||
struct monst *
|
struct monst *
|
||||||
christen_monst(mtmp, name)
|
christen_monst(mtmp, name)
|
||||||
struct monst *mtmp;
|
struct monst *mtmp;
|
||||||
@@ -221,23 +251,15 @@ const char *name;
|
|||||||
char buf[PL_PSIZ];
|
char buf[PL_PSIZ];
|
||||||
|
|
||||||
/* dogname & catname are PL_PSIZ arrays; object names have same limit */
|
/* dogname & catname are PL_PSIZ arrays; object names have same limit */
|
||||||
lth = *name ? (int)(strlen(name) + 1) : 0;
|
lth = (name && *name) ? ((int)strlen(name) + 1) : 0;
|
||||||
if(lth > PL_PSIZ){
|
if (lth > PL_PSIZ) {
|
||||||
lth = PL_PSIZ;
|
lth = PL_PSIZ;
|
||||||
name = strncpy(buf, name, PL_PSIZ - 1);
|
name = strncpy(buf, name, PL_PSIZ - 1);
|
||||||
buf[PL_PSIZ - 1] = '\0';
|
buf[PL_PSIZ - 1] = '\0';
|
||||||
}
|
}
|
||||||
if (has_name(mtmp) && lth == (int)(strlen(MNAME(mtmp)) + 1)) {
|
new_mname(mtmp, lth); /* removes old name if one is present */
|
||||||
/* don't need to allocate a new mname */
|
|
||||||
if (lth) Strcpy(MNAME(mtmp), name);
|
|
||||||
return mtmp;
|
|
||||||
}
|
|
||||||
if (has_name(mtmp)) free((genericptr_t)MNAME(mtmp));
|
|
||||||
if (!mtmp->mextra) mtmp->mextra = newmextra();
|
|
||||||
|
|
||||||
MNAME(mtmp) = (char *)alloc(lth);
|
|
||||||
if (lth) Strcpy(MNAME(mtmp), name);
|
if (lth) Strcpy(MNAME(mtmp), name);
|
||||||
return(mtmp);
|
return mtmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -287,8 +309,8 @@ do_mname()
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
/* special case similar to the one in lookat() */
|
/* special case similar to the one in lookat() */
|
||||||
(void) distant_monnam(mtmp, ARTICLE_THE, monnambuf);
|
Sprintf(qbuf, "What do you want to call %s?",
|
||||||
Sprintf(qbuf, "What do you want to call %s?", monnambuf);
|
distant_monnam(mtmp, ARTICLE_THE, monnambuf));
|
||||||
getlin(qbuf,buf);
|
getlin(qbuf,buf);
|
||||||
if(!*buf || *buf == '\033') return(0);
|
if(!*buf || *buf == '\033') return(0);
|
||||||
/* strip leading and trailing spaces; unnames monster if all spaces */
|
/* strip leading and trailing spaces; unnames monster if all spaces */
|
||||||
|
|||||||
@@ -232,28 +232,19 @@ unsigned corpseflags;
|
|||||||
num = d(2,6);
|
num = d(2,6);
|
||||||
while (num--)
|
while (num--)
|
||||||
obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE);
|
obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp); /* don't christen obj */
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_GLASS_GOLEM:
|
case PM_GLASS_GOLEM:
|
||||||
num = d(2,4); /* very low chance of creating all glass gems */
|
num = d(2,4); /* very low chance of creating all glass gems */
|
||||||
while (num--)
|
while (num--)
|
||||||
obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE);
|
obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_CLAY_GOLEM:
|
case PM_CLAY_GOLEM:
|
||||||
obj = mksobj_at(ROCK, x, y, FALSE, FALSE);
|
obj = mksobj_at(ROCK, x, y, FALSE, FALSE);
|
||||||
obj->quan = (long)(rn2(20) + 50);
|
obj->quan = (long)(rn2(20) + 50);
|
||||||
obj->owt = weight(obj);
|
obj->owt = weight(obj);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_STONE_GOLEM:
|
case PM_STONE_GOLEM:
|
||||||
corpstatflags &= ~CORPSTAT_INIT;
|
corpstatflags &= ~CORPSTAT_INIT;
|
||||||
@@ -265,36 +256,24 @@ unsigned corpseflags;
|
|||||||
while(num--) {
|
while(num--) {
|
||||||
obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE);
|
obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_LEATHER_GOLEM:
|
case PM_LEATHER_GOLEM:
|
||||||
num = d(2,4);
|
num = d(2,4);
|
||||||
while(num--)
|
while(num--)
|
||||||
obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE);
|
obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_GOLD_GOLEM:
|
case PM_GOLD_GOLEM:
|
||||||
/* Good luck gives more coins */
|
/* Good luck gives more coins */
|
||||||
obj = mkgold((long)(200 - rnl(101)), x, y);
|
obj = mkgold((long)(200 - rnl(101)), x, y);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PM_PAPER_GOLEM:
|
case PM_PAPER_GOLEM:
|
||||||
num = rnd(4);
|
num = rnd(4);
|
||||||
while (num--)
|
while (num--)
|
||||||
obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE);
|
obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE);
|
||||||
if (has_name(mtmp)) {
|
free_mname(mtmp);
|
||||||
free((genericptr_t)MNAME(mtmp));
|
|
||||||
MNAME(mtmp) = (char *)0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default_1:
|
default_1:
|
||||||
default:
|
default:
|
||||||
@@ -1379,8 +1358,8 @@ struct mextra *x;
|
|||||||
if (x->eshk) free((genericptr_t)x->eshk);
|
if (x->eshk) free((genericptr_t)x->eshk);
|
||||||
if (x->emin) free((genericptr_t)x->emin);
|
if (x->emin) free((genericptr_t)x->emin);
|
||||||
if (x->edog) free((genericptr_t)x->edog);
|
if (x->edog) free((genericptr_t)x->edog);
|
||||||
|
free((genericptr_t)x);
|
||||||
}
|
}
|
||||||
free((genericptr_t)x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -2622,8 +2601,12 @@ boolean msg; /* "The oldmon turns into a newmon!" */
|
|||||||
newsym(mtmp->mx,mtmp->my);
|
newsym(mtmp->mx,mtmp->my);
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
char *save_mname = (has_name(mtmp)) ? MNAME(mtmp) : (char *)0;
|
char *save_mname = 0;
|
||||||
if (mtmp->mextra) MNAME(mtmp) = (char *)0;
|
|
||||||
|
if (has_name(mtmp)) {
|
||||||
|
save_mname = MNAME(mtmp);
|
||||||
|
MNAME(mtmp) = (char *)0;
|
||||||
|
}
|
||||||
Strcpy(newname,
|
Strcpy(newname,
|
||||||
(mdat == &mons[PM_GREEN_SLIME]) ? "slime" :
|
(mdat == &mons[PM_GREEN_SLIME]) ? "slime" :
|
||||||
x_monnam(mtmp, ARTICLE_A, (char *)0,SUPPRESS_SADDLE, FALSE));
|
x_monnam(mtmp, ARTICLE_A, (char *)0,SUPPRESS_SADDLE, FALSE));
|
||||||
@@ -2631,7 +2614,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */
|
|||||||
(void) usmellmon(mdat);
|
(void) usmellmon(mdat);
|
||||||
else
|
else
|
||||||
pline("%s turns into %s!", oldname, newname);
|
pline("%s turns into %s!", oldname, newname);
|
||||||
if(mtmp->mextra) MNAME(mtmp) = save_mname;
|
if (save_mname) MNAME(mtmp) = save_mname;
|
||||||
}
|
}
|
||||||
|
|
||||||
possibly_unwield(mtmp, polyspot); /* might lose use of weapon */
|
possibly_unwield(mtmp, polyspot); /* might lose use of weapon */
|
||||||
|
|||||||
+3
-5
@@ -297,13 +297,12 @@ genericptr_t buffer;
|
|||||||
(void) memcpy((genericptr_t)<h, (genericptr_t)spot, sizeof(int));
|
(void) memcpy((genericptr_t)<h, (genericptr_t)spot, sizeof(int));
|
||||||
spot += sizeof(int);
|
spot += sizeof(int);
|
||||||
if (lth) {
|
if (lth) {
|
||||||
if (!mtmp->mextra) mtmp->mextra = newmextra();
|
new_mname(mtmp, lth);
|
||||||
MNAME(mtmp) = (char *)alloc(lth);
|
|
||||||
(void) memcpy((genericptr_t)MNAME(mtmp),
|
(void) memcpy((genericptr_t)MNAME(mtmp),
|
||||||
(genericptr_t)spot, lth);
|
(genericptr_t)spot, lth);
|
||||||
spot += lth;
|
spot += lth;
|
||||||
}
|
}
|
||||||
/* obtain the length of the egd (guard) structure */
|
/* obtain the length of the egd (vault guard) structure */
|
||||||
(void) memcpy((genericptr_t)<h, (genericptr_t)spot, sizeof(int));
|
(void) memcpy((genericptr_t)<h, (genericptr_t)spot, sizeof(int));
|
||||||
spot += sizeof(int);
|
spot += sizeof(int);
|
||||||
if (lth) {
|
if (lth) {
|
||||||
@@ -371,8 +370,7 @@ boolean ghostly;
|
|||||||
/* read the length of the name and the name */
|
/* read the length of the name and the name */
|
||||||
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
mread(fd, (genericptr_t) &buflen, sizeof(buflen));
|
||||||
if (buflen > 0) {
|
if (buflen > 0) {
|
||||||
if (!mtmp->mextra) mtmp->mextra = newmextra();
|
new_mname(mtmp, buflen);
|
||||||
MNAME(mtmp) = (char *)alloc(buflen);
|
|
||||||
mread(fd, (genericptr_t) MNAME(mtmp), buflen);
|
mread(fd, (genericptr_t) MNAME(mtmp), buflen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+15
-16
@@ -1019,47 +1019,46 @@ int *isize;
|
|||||||
genericptr_t buffer, xptr[6];
|
genericptr_t buffer, xptr[6];
|
||||||
struct monst *mbuf;
|
struct monst *mbuf;
|
||||||
|
|
||||||
lth = sizeof(struct monst);
|
/* assert((sizeof (*mbuf->mextra) / sizeof (char *)) == 6); */
|
||||||
|
lth = (int)sizeof (struct monst);
|
||||||
|
|
||||||
/* there is always one sizeof(int) for the name
|
/* there is always one sizeof(int) for each mextra field */
|
||||||
and one for each of the 5 potential mextra fields */
|
for (k = 0; k < SIZE(xlth); ++k) {
|
||||||
for (k = 0; k < 6; ++k) {
|
|
||||||
xlth[k] = 0;
|
xlth[k] = 0;
|
||||||
xptr[k] = (genericptr_t)0;
|
xptr[k] = (genericptr_t)0;
|
||||||
}
|
}
|
||||||
if (mtmp->mextra) {
|
if (mtmp->mextra) {
|
||||||
if (MNAME(mtmp)) {
|
if (MNAME(mtmp)) {
|
||||||
xlth[0] = strlen(MNAME(mtmp)) + 1;
|
xlth[0] = (int)strlen(MNAME(mtmp)) + 1;
|
||||||
xptr[0] = (genericptr_t)MNAME(mtmp);
|
xptr[0] = (genericptr_t)MNAME(mtmp);
|
||||||
}
|
}
|
||||||
if (EGD(mtmp)) {
|
if (EGD(mtmp)) {
|
||||||
xlth[1] = sizeof(struct egd);
|
xlth[1] = (int)sizeof (struct egd);
|
||||||
xptr[1] = (genericptr_t)EGD(mtmp);
|
xptr[1] = (genericptr_t)EGD(mtmp);
|
||||||
}
|
}
|
||||||
if (EPRI(mtmp)) {
|
if (EPRI(mtmp)) {
|
||||||
xlth[2] = sizeof(struct epri);
|
xlth[2] = (int)sizeof (struct epri);
|
||||||
xptr[2] = (genericptr_t)EPRI(mtmp);
|
xptr[2] = (genericptr_t)EPRI(mtmp);
|
||||||
}
|
}
|
||||||
if (ESHK(mtmp)) {
|
if (ESHK(mtmp)) {
|
||||||
xlth[3] = sizeof(struct eshk);
|
xlth[3] = (int)sizeof (struct eshk);
|
||||||
xptr[3] = (genericptr_t)ESHK(mtmp);
|
xptr[3] = (genericptr_t)ESHK(mtmp);
|
||||||
}
|
}
|
||||||
if (EMIN(mtmp)) {
|
if (EMIN(mtmp)) {
|
||||||
xlth[4] = sizeof(struct emin);
|
xlth[4] = (int)sizeof (struct emin);
|
||||||
xptr[4] = (genericptr_t)EMIN(mtmp);
|
xptr[4] = (genericptr_t)EMIN(mtmp);
|
||||||
}
|
}
|
||||||
if (EDOG(mtmp)) {
|
if (EDOG(mtmp)) {
|
||||||
xlth[5] = sizeof(struct edog);
|
xlth[5] = (int)sizeof (struct edog);
|
||||||
xptr[5] = (genericptr_t)EDOG(mtmp);
|
xptr[5] = (genericptr_t)EDOG(mtmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (k = 0; k < 6; ++k) {
|
for (k = 0; k < SIZE(xlth); ++k) {
|
||||||
lth += sizeof(int);
|
lth += (int)sizeof (int) + xlth[k];
|
||||||
lth += xlth[k];
|
|
||||||
}
|
}
|
||||||
if (isize) *isize = lth;
|
if (isize) *isize = lth;
|
||||||
|
|
||||||
buffer = alloc(lth);
|
buffer = alloc((unsigned) lth);
|
||||||
|
|
||||||
spot = (char *)buffer;
|
spot = (char *)buffer;
|
||||||
(void) memcpy((genericptr_t)spot, (genericptr_t)mtmp,
|
(void) memcpy((genericptr_t)spot, (genericptr_t)mtmp,
|
||||||
@@ -1069,10 +1068,10 @@ int *isize;
|
|||||||
mbuf = (struct monst *)buffer;
|
mbuf = (struct monst *)buffer;
|
||||||
mbuf->mextra = (struct mextra *)0;
|
mbuf->mextra = (struct mextra *)0;
|
||||||
|
|
||||||
for (k = 0; k < 6; ++k) {
|
for (k = 0; k < SIZE(xlth); ++k) {
|
||||||
lth = xlth[k];
|
lth = xlth[k];
|
||||||
(void) memcpy((genericptr_t)spot,
|
(void) memcpy((genericptr_t)spot,
|
||||||
(genericptr_t)<h, sizeof(lth));
|
(genericptr_t)<h, sizeof(lth));
|
||||||
spot += sizeof(lth);
|
spot += sizeof(lth);
|
||||||
if (lth > 0 && xptr[k] != 0) {
|
if (lth > 0 && xptr[k] != 0) {
|
||||||
(void) memcpy((genericptr_t)spot, xptr[k], lth);
|
(void) memcpy((genericptr_t)spot, xptr[k], lth);
|
||||||
|
|||||||
Reference in New Issue
Block a user