]> granicus.if.org Git - nethack/commitdiff
monster name formatting
authorPatR <rankin@nethack.org>
Tue, 22 Jun 2021 00:44:35 +0000 (17:44 -0700)
committerPatR <rankin@nethack.org>
Tue, 22 Jun 2021 00:44:35 +0000 (17:44 -0700)
While testing monster summoning by using a debugger to force the
outcome, I saw "the renegade Angel of <foo> appears in a cloud of
smoke" as if only one such creature existed.  Trying to change
that to "a renegate Angel" pointed out some problems:  type names
like Angel, Green-elf, and Uruk-hai fool an() into using "the"
because of their capital letter.  Fixing that was a bit of a hack
and worked for Green-elf and Uruk-hai but not for Angel because
it has the eminion extension so uses priestname() instead of the
guts of x_monnam().  Fixing that involved more hackery and now I
feel unclean, but it seems to be working.

It wasn't as noticeable as it might have been because most of the
time that "the Angel of <foo>" or "the priest of <bar>" was shown,
the caller is requesting "the" rather than "a/an".

doc/fixes37.0
include/extern.h
src/do_name.c
src/priest.c

index 86faf42df89c2de07f1c683a09a4da4f95f095a4..233ef8426f6a75d3daedf46b468b22a4e1b1b795 100644 (file)
@@ -1,4 +1,4 @@
-NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.573 $ $NHDT-Date: 1624053070 2021/06/18 21:51:10 $
+NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.575 $ $NHDT-Date: 1624322667 2021/06/22 00:44:27 $
 
 General Fixes and Modified Features
 -----------------------------------
@@ -547,6 +547,8 @@ using a bullwhip to snatch a wielded cockatrice corpse from a monster when not
        panic during final cleanup
 make fire-command autowield an appropriate launcher and add fireassist boolean
        option to toggle the assistance off
+Angels and priests were always described as "the {Angel,priest,high priest} of
+       <deity>" when first two should have been "{an Angel,a high priest}..."
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index b51c60cda13a6afc85edafc2f15a42442dd211c6..7f1690393e784b7758bccb1fd87f56fc3abc9839 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 extern.h        $NHDT-Date: 1624232719 2021/06/20 23:45:19 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.983 $ */
+/* NetHack 3.7 extern.h        $NHDT-Date: 1624322668 2021/06/22 00:44:28 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.984 $ */
 /* Copyright (c) Steve Creps, 1988.                              */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -2054,7 +2054,7 @@ extern boolean inhistemple(struct monst *);
 extern int pri_move(struct monst *);
 extern void priestini(d_level *, struct mkroom *, int, int, boolean);
 extern aligntyp mon_aligntyp(struct monst *);
-extern char *priestname(struct monst *, char *);
+extern char *priestname(struct monst *, int, char *);
 extern boolean p_coaligned(struct monst *);
 extern struct monst *findpriest(char);
 extern void intemple(int);
index 2bc8ab55f4cc0aac9c11108ad71c009289a98981..966a0668e9ad4f0c75c0f91c6240f84eea88722c 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 do_name.c       $NHDT-Date: 1623878512 2021/06/16 21:21:52 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.207 $ */
+/* NetHack 3.7 do_name.c       $NHDT-Date: 1624322669 2021/06/22 00:44:29 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.208 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Pasi Kallinen, 2018. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -1672,14 +1672,19 @@ rndghostname(void)
  * options works, since those are special cases.
  */
 char *
-x_monnam(struct monst *mtmp, int article,
-         const char *adjective, int suppress, boolean called)
+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 = mon_pmname(mtmp);
     boolean do_hallu, do_invis, do_it, do_saddle, do_name;
-    boolean name_at_start, has_adjectives;
+    boolean name_at_start, has_adjectives,
+            falseCap = (*pm_name != lowc(*pm_name));
     char *bp;
 
     if (g.program_state.gameover)
@@ -1715,7 +1720,7 @@ x_monnam(struct monst *mtmp, int article,
             EHalluc_resistance = 1L;
         if (!do_invis)
             mtmp->minvis = 0;
-        name = priestname(mtmp, priestnambuf);
+        name = priestname(mtmp, article, priestnambuf);
         EHalluc_resistance = save_prop;
         mtmp->minvis = save_invis;
         if (article == ARTICLE_NONE && !strncmp(name, "the ", 4))
@@ -1815,11 +1820,21 @@ x_monnam(struct monst *mtmp, int article,
             article = ARTICLE_THE;
         else
             article = ARTICLE_NONE;
-    } else if ((mdat->geno & G_UNIQ) && article == ARTICLE_A) {
+    } else if ((mdat->geno & G_UNIQ) != 0 && article == ARTICLE_A) {
         article = ARTICLE_THE;
     }
 
-    {
+    if (article == ARTICLE_A && falseCap && !name_at_start) {
+        char buf2[BUFSZ], buf3[BUFSZ];
+
+        /* some type names like "Archon", "Green-elf", and "Uruk-hai" fool
+           an() because of the capitalization and would result in "the " */
+        Strcpy(buf3, buf);
+        *buf3 = lowc(*buf3);
+        (void) just_an(buf2, buf3);
+        Strcat(buf2, buf);
+        return strcpy(buf, buf2);
+    } else {
         char buf2[BUFSZ];
 
         switch (article) {
index f42743cf7f2a41f00356b9c818780d648bc05f90..4016c7b8eedc1711c2f24983b58280301e2ee6a3 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 priest.c        $NHDT-Date: 1597931337 2020/08/20 13:48:57 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.63 $ */
+/* NetHack 3.7 priest.c        $NHDT-Date: 1624322670 2021/06/22 00:44:30 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.70 $ */
 /* Copyright (c) Izchak Miller, Steve Linhart, 1989.              */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -291,26 +291,48 @@ mon_aligntyp(struct monst *mon)
  *              the true name even when under that influence
  */
 char *
-priestname(struct monst *mon,
-           char *pname) /* caller-supplied output buffer */
+priestname(
+    struct monst *mon,
+    int article,
+    char *pname) /* caller-supplied output buffer */
 {
     boolean do_hallu = Hallucination,
             aligned_priest = mon->data == &mons[PM_ALIGNED_CLERIC],
             high_priest = mon->data == &mons[PM_HIGH_CLERIC];
     char whatcode = '\0';
-    const char *what = do_hallu ? rndmonnam(&whatcode)
-                                : pmname(mon->data, Mgender(mon));
+    const char *what = do_hallu ? rndmonnam(&whatcode) : mon_pmname(mon);
 
     if (!mon->ispriest && !mon->isminion) /* should never happen...  */
         return strcpy(pname, what);       /* caller must be confused */
 
     *pname = '\0';
-    if (!do_hallu || !bogon_is_pname(whatcode))
-        Strcat(pname, "the ");
-    if (mon->minvis)
+    if (article != ARTICLE_NONE && (!do_hallu || !bogon_is_pname(whatcode))) {
+        if (article == ARTICLE_YOUR || (article == ARTICLE_A && high_priest))
+            article = ARTICLE_THE;
+        if (article == ARTICLE_THE) {
+            Strcat(pname, "the ");
+        } else {
+            char buf2[BUFSZ];
+
+            /* don't let "Angel of <foo>" fool an() into using "the " */
+            Strcpy(buf2, pname);
+            *buf2 = lowc(*buf2);
+            (void) just_an(pname, buf2);
+        }
+    }
+    /* pname[] contains "" or {"a ","an ","the "} */
+    if (mon->minvis) {
+        /* avoid "a invisible priest" */
+        if (!strcmp(pname, "a "))
+            Strcpy(pname, "an ");
         Strcat(pname, "invisible ");
-    if (mon->isminion && EMIN(mon)->renegade)
+    }
+    if (mon->isminion && EMIN(mon)->renegade) {
+        /* avoid "an renegade Angel" */
+        if (!strcmp(pname, "an ")) /* will fail for "an invisible " */
+            Strcpy(pname, "a ");
         Strcat(pname, "renegade ");
+    }
 
     if (mon->ispriest || aligned_priest) { /* high_priest implies ispriest */
         if (!aligned_priest && !high_priest) {