* options works, since those are special cases.
*/
char *
-x_monnam(register struct monst *mtmp, int article,
+x_monnam(struct monst *mtmp, int article,
const char *adjective, int suppress, boolean called)
{
char *buf = nextmbuf();
struct permonst *mdat = mtmp->data;
- const char *pm_name = pmname(mdat, Mgender(mtmp));
+ const char *pm_name = mon_pmname(mtmp);
boolean do_hallu, do_invis, do_it, do_saddle, do_name;
boolean name_at_start, has_adjectives;
char *bp;
} else {
Sprintf(outbuf, "%s%s <%d,%d>",
mon->mtame ? "tame " : mon->mpeaceful ? "peaceful " : "",
- pmname(mon->data, Mgender(mon)), mon->mx, mon->my);
+ mon_pmname(mon), mon->mx, mon->my);
if (mon->cham != NON_PM)
Sprintf(eos(outbuf), "{%s}",
pmname(&mons[mon->cham], Mgender(mon)));
const char *
pmname(struct permonst *pm, int mgender)
{
- if ((mgender >= MALE && mgender < NUM_MGENDERS) && pm->pmnames[mgender])
- return pm->pmnames[mgender];
- else
- return pm->pmnames[NEUTRAL];
+ if (mgender < MALE || mgender >= NUM_MGENDERS || !pm->pmnames[mgender])
+ mgender = NEUTRAL;
+ return pm->pmnames[mgender];
}
#endif /* PMNAME_MACROS */
+/* mons[]->pmname for a monster */
+const char *
+mon_pmname(struct monst *mon)
+{
+ /* for neuter, mon->data->pmnames[MALE] will be Null and use [NEUTRAL] */
+ return pmname(mon->data, mon->female ? FEMALE : MALE);
+}
+
+/* mons[]->pmname for a corpse or statue or figurine */
+const char *
+obj_pmname(struct obj *obj)
+{
+ if (has_omonst(obj))
+ return mon_pmname(OMONST(obj));
+
+ if ((obj->otyp == CORPSE || obj->otyp == STATUE || obj->otyp == FIGURINE)
+ && obj->corpsenm >= LOW_PM) {
+ int cgend = (obj->spe & CORPSTAT_GENDER),
+ mgend = ((cgend == CORPSTAT_MALE) ? MALE
+ : (cgend == CORPSTAT_FEMALE) ? FEMALE
+ : NEUTRAL);
+
+ return pmname(&mons[obj->corpsenm], mgend);
+ }
+ return "";
+}
+
/* fake monsters used to be in a hard-coded array, now in a data file */
char *
bogusmon(char *buf, char *code)
#define NUMOBUF 12
struct _readobjnam_data {
- char globbuf[BUFSZ];
- char fruitbuf[BUFSZ];
+ struct obj *otmp;
char *bp;
char *origbp;
char oclass;
int tmp, tinv, tvariety, mgend;
int wetness, gsize;
int ftype;
- struct obj *otmp;
+ char globbuf[BUFSZ];
+ char fruitbuf[BUFSZ];
};
static char *strprepend(char *, const char *);
if (typ == FIGURINE && omndx != NON_PM) {
char anbuf[10]; /* [4] would be enough: 'a','n',' ','\0' */
+ const char *pm_name = mons[omndx].pmnames[NEUTRAL];
- Sprintf(eos(buf), " of %s%s",
- just_an(anbuf, mons[omndx].pmnames[NEUTRAL]),
- mons[omndx].pmnames[NEUTRAL]);
+ Sprintf(eos(buf), " of %s%s", just_an(anbuf, pm_name), pm_name);
} else if (is_wet_towel(obj)) {
if (wizard)
Sprintf(eos(buf), " (%d)", obj->spe);
case ROCK_CLASS:
if (typ == STATUE && omndx != NON_PM) {
char anbuf[10];
- int mgend = (((obj->spe & CORPSTAT_GENDER) == CORPSTAT_FEMALE)
- ? FEMALE : MALE);
+ const char *statue_pmname = obj_pmname(obj);
Sprintf(buf, "%s%s of %s%s",
(Role_if(PM_ARCHEOLOGIST)
actualn,
type_is_pname(&mons[omndx]) ? ""
: the_unique_pm(&mons[omndx]) ? "the "
- : just_an(anbuf, pmname(&mons[omndx], mgend)),
- pmname(&mons[omndx], mgend));
+ : just_an(anbuf, statue_pmname),
+ statue_pmname);
} else
Strcpy(buf, actualn);
break;
/* avoid "aligned priest"; it just exposes internal details */
mnam = "priest";
} else {
- int cgend = (otmp->spe & CORPSTAT_GENDER),
- mgend = (cgend == CORPSTAT_FEMALE) ? FEMALE
- : (cgend == CORPSTAT_MALE) ? MALE
- : NEUTRAL;
-
- mnam = pmname(&mons[omndx], mgend);
+ mnam = obj_pmname(otmp);
if (the_unique_pm(&mons[omndx]) || type_is_pname(&mons[omndx])) {
mnam = s_suffix(mnam);
possessive = TRUE;
#define SPINACH 2
static void
-readobjnam_init(char* bp, struct _readobjnam_data* d)
+readobjnam_init(char *bp, struct _readobjnam_data *d)
{
+ d->otmp = (struct obj *) 0;
d->cnt = d->spe = d->spesgn = d->typ = 0;
d->very = d->rechrg = d->blessed = d->uncursed = d->iscursed
= d->ispoisoned = d->isgreased = d->eroded = d->eroded2
d->bp = d->origbp = bp;
d->p = (char *) 0;
d->name = (const char *) 0;
- d->otmp = (struct obj *) 0;
d->ftype = g.context.current_fruit;
+ (void) memset(d->globbuf, '\0', sizeof d->globbuf);
+ (void) memset(d->fruitbuf, '\0', sizeof d->globbuf);
}
static int
-readobjnam_preparse(struct _readobjnam_data* d)
+readobjnam_preparse(struct _readobjnam_data *d)
{
for (;;) {
register int l;
}
static void
-readobjnam_parse_charges(struct _readobjnam_data* d)
+readobjnam_parse_charges(struct _readobjnam_data *d)
{
if (strlen(d->bp) > 1 && (d->p = rindex(d->bp, '(')) != 0) {
boolean keeptrailingchars = TRUE;
}
static int
-readobjnam_postparse1(struct _readobjnam_data* d)
+readobjnam_postparse1(struct _readobjnam_data *d)
{
int i;
}
static int
-readobjnam_postparse2(struct _readobjnam_data* d)
+readobjnam_postparse2(struct _readobjnam_data *d)
{
int i;
}
static int
-readobjnam_postparse3(struct _readobjnam_data* d)
+readobjnam_postparse3(struct _readobjnam_data *d)
{
int i;
* return null.
*/
struct obj *
-readobjnam(char* bp, struct obj* no_wish)
+readobjnam(char *bp, struct obj *no_wish)
{
struct _readobjnam_data d;
if (d.spesgn == -1)
d.spe = -d.spe;
- /* set otmp->spe. This may, or may not, use spe... */
+ /* set otmp->spe. This may, or may not, use d.spe... */
switch (d.typ) {
case TIN:
+ d.otmp->spe = 0; /* default: not spinach */
if (d.contents == EMPTY) {
d.otmp->corpsenm = NON_PM;
- d.otmp->spe = 0;
} else if (d.contents == SPINACH) {
d.otmp->corpsenm = NON_PM;
- d.otmp->spe = 1;
+ d.otmp->spe = 1; /* spinach after all */
}
break;
case TOWEL:
: (d.mgend == MALE && !is_female(P)) ? CORPSTAT_MALE
/* unspecified or wish conflicts */
: CORPSTAT_RANDOM;
+ if (P && d.otmp->spe == CORPSTAT_RANDOM)
+ d.otmp->spe = is_male(P) ? CORPSTAT_MALE
+ : is_female(P) ? CORPSTAT_FEMALE
+ : rn2(2) ? CORPSTAT_MALE : CORPSTAT_FEMALE;
+ if (d.ishistoric && d.typ == STATUE)
+ d.otmp->spe |= CORPSTAT_HISTORIC;
break;
};
#ifdef MAIL_STRUCTURES
switch (d.typ) {
case TIN:
- d.otmp->spe = 0; /* No spinach */
if (dead_species(d.mntmp, FALSE)) {
d.otmp->corpsenm = NON_PM; /* it's empty */
} else if ((!(mons[d.mntmp].geno & G_UNIQ) || wizard)
d.otmp->corpsenm = d.mntmp;
if (Has_contents(d.otmp) && verysmall(&mons[d.mntmp]))
delete_contents(d.otmp); /* no spellbook */
- d.otmp->spe |= d.ishistoric ? CORPSTAT_HISTORIC : 0;
break;
case SCALE_MAIL:
/* Dragon mail - depends on the order of objects & dragons. */
}
const char *
-suit_simple_name(struct obj* suit)
+suit_simple_name(struct obj *suit)
{
const char *suitnm, *esuitp;
}
const char *
-cloak_simple_name(struct obj* cloak)
+cloak_simple_name(struct obj *cloak)
{
if (cloak) {
switch (cloak->otyp) {
/* helm vs hat for messages */
const char *
-helm_simple_name(struct obj* helmet)
+helm_simple_name(struct obj *helmet)
{
/*
* There is some wiggle room here; the result has been chosen
/* gloves vs gauntlets; depends upon discovery state */
const char *
-gloves_simple_name(struct obj* gloves)
+gloves_simple_name(struct obj *gloves)
{
static const char gauntlets[] = "gauntlets";
/* boots vs shoes; depends upon discovery state */
const char *
-boots_simple_name(struct obj* boots)
+boots_simple_name(struct obj *boots)
{
static const char shoes[] = "shoes";
/* simplified shield for messages */
const char *
-shield_simple_name(struct obj* shield)
+shield_simple_name(struct obj *shield)
{
if (shield) {
/* xname() describes unknown (unseen) reflection as smooth */
/* for completness */
const char *
-shirt_simple_name(struct obj* shirt UNUSED)
+shirt_simple_name(struct obj *shirt UNUSED)
{
return "shirt";
}
const char *
-mimic_obj_name(struct monst* mtmp)
+mimic_obj_name(struct monst *mtmp)
{
if (M_AP_TYPE(mtmp) == M_AP_OBJECT) {
if (mtmp->mappearance == GOLD_PIECE)
selftouch(const char *arg)
{
char kbuf[BUFSZ];
+ const char *corpse_pmname;
if (uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm])
&& !Stone_resistance) {
- pline("%s touch the %s corpse.", arg,
- mons[uwep->corpsenm].pmnames[NEUTRAL]);
- Sprintf(kbuf, "%s corpse",
- an(mons[uwep->corpsenm].pmnames[NEUTRAL]));
+ corpse_pmname = obj_pmname(uwep);
+ pline("%s touch the %s corpse.", arg, corpse_pmname);
+ Sprintf(kbuf, "%s corpse", an(corpse_pmname));
instapetrify(kbuf);
/* life-saved; unwield the corpse if we can't handle it */
if (!uarmg && !Stone_resistance)
allow two-weapon combat when either weapon is a corpse] */
if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE
&& touch_petrifies(&mons[uswapwep->corpsenm]) && !Stone_resistance) {
- pline("%s touch the %s corpse.", arg,
- mons[uswapwep->corpsenm].pmnames[NEUTRAL]);
- Sprintf(kbuf, "%s corpse",
- an(mons[uswapwep->corpsenm].pmnames[NEUTRAL]));
+ corpse_pmname = obj_pmname(uswapwep);
+ pline("%s touch the %s corpse.", arg, corpse_pmname);
+ Sprintf(kbuf, "%s corpse", an(corpse_pmname));
instapetrify(kbuf);
/* life-saved; unwield the corpse */
if (!uarmg && !Stone_resistance)
/* is it a cockatrice?... */
if (touch_petrifies(mtmp->data) && !uarmg && !Stone_resistance) {
+ const char *mtmp_pmname = mon_pmname(mtmp);
+
You("grab the trapped %s using your bare %s.",
- pmname(mtmp->data, Mgender(mtmp)),
- makeplural(body_part(HAND)));
+ mtmp_pmname, makeplural(body_part(HAND)));
if (poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM)) {
display_nhwindow(WIN_MESSAGE, FALSE);
} else {
char kbuf[BUFSZ];
- Sprintf(kbuf, "trying to help %s out of a pit",
- an(pmname(mtmp->data, Mgender(mtmp))));
+ Sprintf(kbuf, "trying to help %s out of a pit", an(mtmp_pmname));
instapetrify(kbuf);
return 1;
}