]> granicus.if.org Git - nethack/commitdiff
Mr. Izchak
authornethack.rankin <nethack.rankin>
Sun, 13 Mar 2005 06:48:35 +0000 (06:48 +0000)
committernethack.rankin <nethack.rankin>
Sun, 13 Mar 2005 06:48:35 +0000 (06:48 +0000)
     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.

doc/fixes34.4
include/extern.h
src/end.c
src/shk.c
src/shknam.c

index 104cfe351f65ea80a01d48229b7dba484a7eae38..efa902022a6d616695594e44ffef937616cc41e6 100644 (file)
@@ -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
index 22a8ec9d7060d7a052f1641b2fe8639702ba25b7..f63298ec1f54357e2440dc82453bf1a31cff9127 100644 (file)
@@ -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 ### */
 
index 36290ccb17bff58af938d3896edb06b0edd78aec..de1929d7f01d3dbe3aac45ee5138683ef2d72c72 100644 (file)
--- a/src/end.c
+++ b/src/end.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
index 060675c131fdf2d598406f8070583eeae89dbe2d..c1c6cc65990e8449916f4ba31842828f4d1436af 100644 (file)
--- a/src/shk.c
+++ b/src/shk.c
@@ -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;
index 1d875956ff17bd73cbe92139af43e2130e38465f..32b5c378dcab13acab8635fd78a67fa6030c6bfd 100644 (file)
@@ -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*/