corpse/statue gender fix when wishing

Wishing for "{corpse,statue} of gnome queen" would produce a corpse or
statue of a gnome queen, but wishing for "gnome queen {corpse,statue}"
would produce corpse or statue of a gnome king.  The matching for
gender-specific monster name was only passing back the corresponding
gender when an exact match occurred (which happens for "foo of pmname"
but not for "pmname foo" since 'pmname' through end of string is what
the name_to_mon() matching code is looking at).
This commit is contained in:
PatR
2021-06-12 02:25:16 -07:00
parent 39a0c5ee38
commit 234eceae60

View File

@@ -1,4 +1,4 @@
/* NetHack 3.7 mondata.c $NHDT-Date: 1606473489 2020/11/27 10:38:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.87 $ */ /* NetHack 3.7 mondata.c $NHDT-Date: 1623489867 2021/06/12 09:24:27 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.95 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -686,13 +686,13 @@ name_to_monplus(
register int mntmp = NON_PM; register int mntmp = NON_PM;
register char *s, *str, *term; register char *s, *str, *term;
char buf[BUFSZ]; char buf[BUFSZ];
int len, slen, mgend; int len, slen, mgend, matchgend = NEUTRAL;
boolean exact_match = FALSE; boolean exact_match = FALSE;
if (remainder_p) if (remainder_p)
*remainder_p = (const char *) 0; *remainder_p = (const char *) 0;
if (gender_name_var) if (gender_name_var)
*gender_name_var = 0; *gender_name_var = matchgend; /* NEUTRAL */
str = strcpy(buf, in_str); str = strcpy(buf, in_str);
@@ -802,7 +802,7 @@ name_to_monplus(
&& (!str[len] || str[len] == ' ' || str[len] == '\'')) { && (!str[len] || str[len] == ' ' || str[len] == '\'')) {
if (remainder_p) if (remainder_p)
*remainder_p = in_str + (&str[len] - buf); *remainder_p = in_str + (&str[len] - buf);
if (gender_name_var != (int *) 0) if (gender_name_var)
*gender_name_var = namep->genderhint; *gender_name_var = namep->genderhint;
return namep->pm_val; return namep->pm_val;
} }
@@ -821,8 +821,7 @@ name_to_monplus(
if (m_i_len == slen) { if (m_i_len == slen) {
mntmp = i; mntmp = i;
len = m_i_len; len = m_i_len;
if (gender_name_var != (int *) 0) matchgend = mgend;
*gender_name_var = mgend;
exact_match = TRUE; exact_match = TRUE;
break; /* exact match */ break; /* exact match */
} else if (slen > m_i_len } else if (slen > m_i_len
@@ -837,16 +836,20 @@ name_to_monplus(
|| !strncmpi(&str[m_i_len], "es ", 3))) { || !strncmpi(&str[m_i_len], "es ", 3))) {
mntmp = i; mntmp = i;
len = m_i_len; len = m_i_len;
matchgend = mgend;
} }
} }
} }
if (exact_match) if (exact_match)
break; break;
} }
/* FIXME: some titles have gender; title_to_mon() doesn't propagate it */
if (mntmp == NON_PM) if (mntmp == NON_PM)
mntmp = title_to_mon(str, (int *) 0, &len); mntmp = title_to_mon(str, (int *) 0, &len);
if (len && remainder_p) if (len && remainder_p)
*remainder_p = in_str + (&str[len] - buf); *remainder_p = in_str + (&str[len] - buf);
if (gender_name_var)
*gender_name_var = matchgend;
return mntmp; return mntmp;
} }