Mr. Izchak
Suppress "Mr" or "Ms" title for shopkeepers when they're going by a first name rather than a surname. The bug report was for Izchak, but it would have happened with the two last resort names (which I've never seen in actual use) and for the "hippie names" used in post-3.4.x health food shops. I have not attempted to specify gender for those, just flagged them as first names. This prepends a prefix character to the name string (see comment in shknam.c) to specify gender and/or first name vs surname.
This commit is contained in:
@@ -93,6 +93,7 @@ succubi will remove hero's gloves before taking worn ring; incubi will do
|
||||
so before forcing ring to be put on
|
||||
mbodypart should return forehoof, not foreclaw, for horselike monsters
|
||||
further digging of an existing hole finishes in a single turn
|
||||
only prefix shopkeeper names with "Mr." or "Ms." when not a personal name
|
||||
|
||||
|
||||
Platform- and/or Interface-Specific Fixes
|
||||
|
||||
@@ -1854,7 +1854,6 @@ E void FDECL(store_savefileinfo, (int));
|
||||
E long FDECL(money2mon, (struct monst *, long));
|
||||
E void FDECL(money2u, (struct monst *, long));
|
||||
#endif
|
||||
E char *FDECL(shkname, (struct monst *));
|
||||
E void FDECL(shkgone, (struct monst *));
|
||||
E void FDECL(set_residency, (struct monst *,BOOLEAN_P));
|
||||
E void FDECL(replshk, (struct monst *,struct monst *));
|
||||
@@ -1914,6 +1913,8 @@ E char *FDECL(Shk_Your, (char *,struct obj *));
|
||||
E void FDECL(stock_room, (int,struct mkroom *));
|
||||
E boolean FDECL(saleable, (struct monst *,struct obj *));
|
||||
E int FDECL(get_shop_item, (int));
|
||||
E const char *FDECL(shkname, (struct monst *));
|
||||
E boolean FDECL(shkname_is_pname, (struct monst *));
|
||||
|
||||
/* ### sit.c ### */
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* SCCS Id: @(#)end.c 3.5 2004/12/21 */
|
||||
/* SCCS Id: @(#)end.c 3.5 2005/03/11 */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
|
||||
@@ -218,8 +218,11 @@ register struct monst *mtmp;
|
||||
Strcat(buf, "ghost");
|
||||
if (mtmp->mnamelth) Sprintf(eos(buf), " of %s", NAME(mtmp));
|
||||
} else if(mtmp->isshk) {
|
||||
Sprintf(eos(buf), "%s %s, the shopkeeper",
|
||||
(mtmp->female ? "Ms." : "Mr."), shkname(mtmp));
|
||||
const char *shknm = shkname(mtmp),
|
||||
*honorific = shkname_is_pname(mtmp) ? "" :
|
||||
mtmp->female ? "Ms. " : "Mr. ";
|
||||
|
||||
Sprintf(eos(buf), "%s%s, the shopkeeper", honorific, shknm);
|
||||
killer.format = KILLED_BY;
|
||||
} else if (mtmp->ispriest || mtmp->isminion) {
|
||||
/* m_monnam() suppresses "the" prefix plus "invisible", and
|
||||
|
||||
@@ -170,13 +170,6 @@ register boolean withbill;
|
||||
return(shkp);
|
||||
}
|
||||
|
||||
char *
|
||||
shkname(mtmp) /* called in do_name.c */
|
||||
register struct monst *mtmp;
|
||||
{
|
||||
return(ESHK(mtmp)->shknam);
|
||||
}
|
||||
|
||||
void
|
||||
shkgone(mtmp) /* called in mon.c */
|
||||
struct monst *mtmp;
|
||||
|
||||
54
src/shknam.c
54
src/shknam.c
@@ -16,6 +16,17 @@ STATIC_DCL int FDECL(shkinit, (const struct shclass *,struct mkroom *));
|
||||
|
||||
#define VEGETARIAN_CLASS (MAXOCLASSES+1)
|
||||
|
||||
/*
|
||||
* Name prefix codes:
|
||||
* dash _ female, personal name
|
||||
* underscore _ female, general name
|
||||
* plus + male, personal name
|
||||
* vertical bar | male, general name (implied for most of shktools)
|
||||
* equals = gender not specified, personal name
|
||||
*
|
||||
* Personal names do not receive the honorific prefix "Mr." or "Ms.".
|
||||
*/
|
||||
|
||||
static const char * const shkliquors[] = {
|
||||
/* Ukraine */
|
||||
"Njezjin", "Tsjernigof", "Ossipewsk", "Gorlowka",
|
||||
@@ -173,11 +184,11 @@ static const char * const shkhealthfoods[] = {
|
||||
"Ganden", "Tsurphu", "Lhasa", "Tsedong",
|
||||
"Drepung",
|
||||
/* Hippie names */
|
||||
"Azura", "Blaze", "Breanna", "Breezy",
|
||||
"Dharma", "Feather", "Jasmine", "Luna",
|
||||
"Melody", "Moonjava", "Petal", "Rhiannon",
|
||||
"Starla", "Tranquilla", "Windsong", "Zennia",
|
||||
"Zoe", "Zora",
|
||||
"=Azura", "=Blaze", "=Breanna", "=Breezy",
|
||||
"=Dharma", "=Feather", "=Jasmine", "=Luna",
|
||||
"=Melody", "=Moonjava", "=Petal", "=Rhiannon",
|
||||
"=Starla", "=Tranquilla", "=Windsong", "=Zennia",
|
||||
"=Zoe", "=Zora",
|
||||
0
|
||||
};
|
||||
|
||||
@@ -227,10 +238,6 @@ const struct shclass shtypes[] = {
|
||||
{"hardware store", TOOL_CLASS, 3, D_SHOP,
|
||||
{{100, TOOL_CLASS}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
|
||||
shktools},
|
||||
/* Actually shktools is ignored; the code specifically chooses a
|
||||
* random implementor name (along with candle shops having
|
||||
* random shopkeepers)
|
||||
*/
|
||||
{"rare books", SPBOOK_CLASS, 3, D_SHOP,
|
||||
{{90, SPBOOK_CLASS}, {10, SCROLL_CLASS}, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
|
||||
shkbooks},
|
||||
@@ -395,7 +402,7 @@ const char * const *nlp;
|
||||
if (nlp == shklight && In_mines(&u.uz)
|
||||
&& (sptr = Is_special(&u.uz)) != 0 && sptr->flags.town) {
|
||||
/* special-case minetown lighting shk */
|
||||
shname = "Izchak";
|
||||
shname = "+Izchak";
|
||||
shk->female = FALSE;
|
||||
} else {
|
||||
/* We want variation from game to game, without needing the save
|
||||
@@ -414,8 +421,7 @@ const char * const *nlp;
|
||||
for (trycnt = 0; trycnt < 50; trycnt++) {
|
||||
if (nlp == shktools) {
|
||||
shname = shktools[rn2(names_avail)];
|
||||
shk->female = (*shname == '_');
|
||||
if (shk->female) shname++;
|
||||
shk->female = 0; /* reversed below for '_' prefix */
|
||||
} else if (name_wanted < names_avail) {
|
||||
shname = nlp[name_wanted];
|
||||
} else if ((i = rn2(names_avail)) != 0) {
|
||||
@@ -426,8 +432,10 @@ const char * const *nlp;
|
||||
continue;
|
||||
continue; /* next `trycnt' iteration */
|
||||
} else {
|
||||
shname = shk->female ? "Lucrezia" : "Dirk";
|
||||
shname = shk->female ? "-Lucrezia" : "+Dirk";
|
||||
}
|
||||
if (*shname == '_' || *shname == '-') shk->female = 1;
|
||||
else if (*shname == '|' || *shname == '+') shk->female = 0;
|
||||
|
||||
/* is name already in use on this level? */
|
||||
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
||||
@@ -639,4 +647,24 @@ int type;
|
||||
return shp->iprobs[i].itype;
|
||||
}
|
||||
|
||||
const char *
|
||||
shkname(mtmp)
|
||||
struct monst *mtmp;
|
||||
{
|
||||
const char *shknm = ESHK(mtmp)->shknam;
|
||||
|
||||
/* strip prefix if present */
|
||||
if (!letter(*shknm)) ++shknm;
|
||||
return shknm;
|
||||
}
|
||||
|
||||
boolean
|
||||
shkname_is_pname(mtmp)
|
||||
struct monst *mtmp;
|
||||
{
|
||||
const char *shknm = ESHK(mtmp)->shknam;
|
||||
|
||||
return (*shknm == '-' || *shknm == '+' || *shknm == '=');
|
||||
}
|
||||
|
||||
/*shknam.c*/
|
||||
|
||||
Reference in New Issue
Block a user