]> granicus.if.org Git - nethack/commitdiff
verb agreement
authorcohrs <cohrs>
Sat, 9 Feb 2002 00:16:35 +0000 (00:16 +0000)
committercohrs <cohrs>
Sat, 9 Feb 2002 00:16:35 +0000 (00:16 +0000)
add and use new APIs, Tobjnam, otense and vtense, is_plural
to determine tense/form of verbs and a few pronouns as well

include/extern.h
include/obj.h
src/apply.c
src/artifact.c
src/dbridge.c
src/detect.c
src/dig.c
src/do.c
src/do_name.c

index 07621933a3de5077668b3baf005956a14943b413..5153ef252cd95df7f51565c20fbd17652a53a581 100644 (file)
@@ -1309,13 +1309,16 @@ E char *FDECL(xname, (struct obj *));
 E char *FDECL(mshot_xname, (struct obj *));
 E char *FDECL(doname, (struct obj *));
 E boolean FDECL(not_fully_identified, (struct obj *));
-E const char *FDECL(corpse_xname, (struct obj *,BOOLEAN_P));
+E char *FDECL(corpse_xname, (struct obj *,BOOLEAN_P));
 E const char *FDECL(singular, (struct obj *,char *(*)(OBJ_P)));
 E char *FDECL(an, (const char *));
 E char *FDECL(An, (const char *));
 E char *FDECL(The, (const char *));
 E char *FDECL(the, (const char *));
 E char *FDECL(aobjnam, (struct obj *,const char *));
+E char *FDECL(Tobjnam, (struct obj *,const char *));
+E char *FDECL(otense, (struct obj *,const char *));
+E char *FDECL(vtense, (const char *,const char *));
 E char *FDECL(Doname2, (struct obj *));
 E char *FDECL(yname, (struct obj *));
 E char *FDECL(Yname2, (struct obj *));
@@ -1927,7 +1930,7 @@ E coord *FDECL(gettrack, (int,int));
 
 E boolean FDECL(burnarmor,(struct monst *));
 E boolean FDECL(rust_dmg, (struct obj *,const char *,int,BOOLEAN_P,struct monst *));
-E void FDECL(grease_protect, (struct obj *,const char *,BOOLEAN_P,struct monst *));
+E void FDECL(grease_protect, (struct obj *,const char *,struct monst *));
 E struct trap *FDECL(maketrap, (int,int,int));
 E void FDECL(fall_through, (BOOLEAN_P));
 E struct monst *FDECL(animate_statue, (struct obj *,XCHAR_P,XCHAR_P,int,int *));
index 5e93983caa7a99ee62b2727439dc2c8473ac22fc..5313c268442788e0a4fb553d99a111dce4bd4e7a 100644 (file)
@@ -222,6 +222,10 @@ struct obj {
                                 (obj)->otyp == FLINT     || \
                                 (obj)->otyp == TOUCHSTONE)
 
+/* helpers, simple enough to be macros */
+#define is_plural(o)   ((o)->quan > 1 || \
+                        (o)->oartifact == ART_EYES_OF_THE_OVERWORLD)
+
 /* Flags for get_obj_location(). */
 #define CONTAINED_TOO  0x1
 #define BURIED_TOO     0x2
index 0f6a83f71ffb8100b82970d99f4fa7af9676f053..88aa879bbbd9d908a2deb7be568351f5fd840ef5 100644 (file)
@@ -773,7 +773,7 @@ register struct obj *obj;
                                        u.ux, u.uy, NO_MINVENT)) != 0) {
                You("summon %s!", a_monnam(mtmp));
                if (!obj_resists(obj, 93, 100)) {
-                   pline("%s has shattered!", The(xname(obj)));
+                   pline("%s shattered!", Tobjnam(obj, "have"));
                    useup(obj);
                } else switch (rn2(3)) {
                        default:
@@ -809,8 +809,8 @@ register struct obj *obj;
                wakem = TRUE;
 
            } else  if (invoking) {
-               pline("%s issues an unsettling shrill sound...",
-                     The(xname(obj)));
+               pline("%s an unsettling shrill sound...",
+                     Tobjnam(obj, "issue"));
 #ifdef AMIGA
                amii_speaker( obj, "aefeaefeaefeaefeaefe", AMII_LOUDER_VOLUME );
 #endif
@@ -858,50 +858,47 @@ STATIC_OVL void
 use_candelabrum(obj)
 register struct obj *obj;
 {
+       char *s = obj->spe != 1 ? "candles" : "candle";
+
        if(Underwater) {
                You("cannot make fire under water.");
                return;
        }
        if(obj->lamplit) {
-               You("snuff the candle%s.", obj->spe > 1 ? "s" : "");
+               You("snuff the %s.", s);
                end_burn(obj, TRUE);
                return;
        }
        if(obj->spe <= 0) {
-               pline("This %s has no candles.", xname(obj));
+               pline("This %s has no %s.", xname(obj), s);
                return;
        }
        if(u.uswallow || obj->cursed) {
                if (!Blind)
-                   pline_The("candle%s flicker%s for a moment, then die%s.",
-                       obj->spe > 1 ? "s" : "",
-                       obj->spe > 1 ? "" : "s",
-                       obj->spe > 1 ? "" : "s");
+                   pline_The("%s %s for a moment, then %s.",
+                             s, vtense(s, "flicker"), vtense(s, "die"));
                return;
        }
        if(obj->spe < 7) {
-               There("%s only %d candle%s in %s.",
-                      obj->spe == 1 ? "is" : "are",
-                      obj->spe,
-                      obj->spe > 1 ? "s" : "",
-                      the(xname(obj)));
+               There("%s only %d %s in %s.",
+                     vtense(s, "are"), obj->spe, s, the(xname(obj)));
                if (!Blind)
-                   pline("%s lit.  %s shines dimly.",
-                      obj->spe == 1 ? "It is" : "They are", The(xname(obj)));
+                   pline("%s lit.  %s dimly.",
+                         obj->spe == 1 ? "It is" : "They are",
+                         Tobjnam(obj, "shine"));
        } else {
-               pline("%s's candles burn%s", The(xname(obj)),
+               pline("%s's %s burn%s", The(xname(obj)), s,
                        (Blind ? "." : " brightly!"));
        }
        if (!invocation_pos(u.ux, u.uy)) {
-               pline_The("candle%s being rapidly consumed!",
-                       (obj->spe > 1 ? "s are" : " is"));
+               pline_The("%s %s being rapidly consumed!", s, vtense(s, "are"));
                obj->age /= 2;
        } else {
                if(obj->spe == 7) {
                    if (Blind)
-                     pline("%s radiates a strange warmth!", The(xname(obj)));
+                     pline("%s a strange warmth!", Tobjnam(obj, "radiate"));
                    else
-                     pline("%s glows with a strange light!", The(xname(obj)));
+                     pline("%s with a strange light!", Tobjnam(obj, "glow"));
                }
                obj->known = 1;
        }
@@ -913,6 +910,7 @@ use_candle(obj)
 register struct obj *obj;
 {
        register struct obj *otmp;
+       char *s = obj->quan != 1 ? "candles" : "candle";
        char qbuf[QBUFSZ];
 
        if(u.uswallow) {
@@ -940,16 +938,14 @@ register struct obj *obj;
        } else {
                if ((long)otmp->spe + obj->quan > 7L)
                    obj = splitobj(obj, 7L - (long)otmp->spe);
-               You("attach %ld%s candle%s to %s.",
+               You("attach %ld%s %s to %s.",
                    obj->quan, !otmp->spe ? "" : " more",
-                   plur(obj->quan), the(xname(otmp)));
+                   s, the(xname(otmp)));
                if (!otmp->spe || otmp->age > obj->age)
                    otmp->age = obj->age;
                otmp->spe += (int)obj->quan;
                if (otmp->lamplit && !obj->lamplit)
-                   pline_The("new candle%s magically ignite%s!",
-                             plur(obj->quan),
-                             (obj->quan > 1L) ? "" : "s");
+                   pline_The("new %s magically %s!", s, vtense(s, "ignite"));
                else if (!otmp->lamplit && obj->lamplit)
                    pline("%s out.", (obj->quan > 1L) ? "They go" : "It goes");
                if (obj->unpaid)
@@ -958,8 +954,8 @@ register struct obj *obj;
                              (obj->quan > 1L) ? "them" : "it",
                              (obj->quan > 1L) ? "them" : "it");
                if (obj->quan < 7L && otmp->spe == 7)
-                   pline("%s now has seven%s candles attached.",
-                         The(xname(otmp)), otmp->lamplit ? " lit" : "");
+                   pline("%s now has seven%s %s attached.",
+                         The(xname(otmp)), otmp->lamplit ? " lit" : "", s);
                /* candelabrum's light range might increase */
                if (otmp->lamplit) obj_merge_light_sources(otmp, otmp);
                /* candles are no longer a separate light source */
@@ -1007,7 +1003,7 @@ struct obj *obj;
                    obj->otyp == BRASS_LANTERN || obj->otyp == POT_OIL) {
                (void) get_obj_location(obj, &x, &y, 0);
                if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind)
-                   pline("%s goes out!", Yname2(obj));
+                   pline("%s %s out!", Yname2(obj), otense(obj, "go"));
                end_burn(obj, TRUE);
                return TRUE;
            }
@@ -1035,7 +1031,7 @@ struct obj *obj;
            if (!get_obj_location(obj, &x, &y, 0))
                return FALSE;
            if (obj->where == OBJ_MINVENT ? cansee(x,y) : !Blind)
-               pline("%s catches light!", Yname2(obj));
+               pline("%s %s light!", Yname2(obj), otense(obj, "catch"));
            begin_burn(obj, TRUE);
            return TRUE;
        }
@@ -1070,20 +1066,17 @@ struct obj *obj;
                return;
        }
        if (obj->cursed && !rn2(2)) {
-               pline("%s flicker%s for a moment, then die%s.",
-                      The(xname(obj)),
-                      obj->quan > 1L ? "" : "s",
-                      obj->quan > 1L ? "" : "s");
+               pline("%s for a moment, then %s.",
+                     Tobjnam(obj, "flicker"), otense(obj, "die"));
        } else {
                if(obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP ||
                                obj->otyp == BRASS_LANTERN) {
                    check_unpaid(obj);
                    pline("%s lamp is now on.", Shk_Your(buf, obj));
                } else {        /* candle(s) */
-                   pline("%s flame%s burn%s%s",
+                   pline("%s flame%s %s%s",
                        s_suffix(Yname2(obj)),
-                       plur(obj->quan),
-                       obj->quan > 1L ? "" : "s",
+                       plur(obj->quan), otense(obj, "burn"),
                        Blind ? "." : " brightly!");
                    if (obj->unpaid && costly_spot(u.ux, u.uy) &&
                          obj->age == 20L * (long)objects[obj->otyp].oc_cost) {
@@ -1725,7 +1718,7 @@ struct obj *obj;
 
        if (Glib) {
            dropx(obj);
-           pline("%s slips from your %s.", The(xname(obj)),
+           pline("%s from your %s.", Tobjnam(obj, "slip"),
                  makeplural(body_part(FINGER)));
            return;
        }
@@ -1735,7 +1728,7 @@ struct obj *obj;
                        check_unpaid(obj);
                        obj->spe--;
                        dropx(obj);
-                       pline("%s slips from your %s.", The(xname(obj)),
+                       pline("%s from your %s.", Tobjnam(obj, "slip"),
                              makeplural(body_part(FINGER)));
                        return;
                }
@@ -1772,8 +1765,10 @@ struct obj *obj;
                            makeplural(body_part(FINGER)));
                }
        } else {
-               pline("%s %s empty.", The(xname(obj)),
-                       obj->known ? "is" : "seems to be");
+           if (obj->known)
+               pline("%s empty.", Tobjnam(obj, "are"));
+           else
+               pline("%s to be empty.", Tobjnam(obj, "seem"));
        }
        update_inventory();
 }
@@ -1837,27 +1832,27 @@ struct obj *otmp;
        if (material == LIQUID || material == WAX ||
                material == CLOTH || material == WOOD) {
            switch(material) {
-                   case LIQUID:
-                       if (!obj->known)
-                           You("must think this is a wetstone, do you?");
-                       else
-                           pline("%s is a little wetter now.", The(xname(otmp)));
-                       break;
-                   case WAX:
-                       color = "waxy";
-                       goto see_streaks;       /* okay even if not touchstone */
-                       break;
-                   case CLOTH:
-                       pline_The("stone looks a little more polished now.");
-                       break;
-                   case WOOD:
-                       color = "wooden";
-                       goto see_streaks;       /* okay even if not touchstone */
-                       break;
+           case LIQUID:
+               if (!obj->known)
+                   You("must think this is a wetstone, do you?");
+               else
+                   pline("%s a little wetter now.", Tobjnam(otmp, "are"));
+               break;
+           case WAX:
+               color = "waxy";
+               goto see_streaks;       /* okay even if not touchstone */
+               break;
+           case CLOTH:
+               pline_The("stone looks a little more polished now.");
+               break;
+           case WOOD:
+               color = "wooden";
+               goto see_streaks;       /* okay even if not touchstone */
+               break;
            }
            return;
        }
-          
+
        if (otmp->otyp != TOUCHSTONE) {
            pline(ambiguous);
            return;
index e57575f8d90cbafa890e4d1b66c13e5618abaf54..1255362ccf2f0261eddc7e3fd3835905b7f21ee1 100644 (file)
@@ -513,7 +513,7 @@ touch_artifact(obj,mon)
 
     /* can pick it up unless you're totally non-synch'd with the artifact */
     if (badclass && badalign && self_willed) {
-       if (yours) pline("%s evades your grasp!", The(xname(obj)));
+       if (yours) pline("%s your grasp!", Tobjnam(obj, "evade"));
        return 0;
     }
 
@@ -750,7 +750,7 @@ int dieroll; /* needed for Magicbane and vorpal blades */
        if (attacks(AD_ELEC, otmp)) {
            if (realizes_damage) {
                if(youattack && otmp != uwep)
-                   pline("%s hits %s!", The(xname(otmp)), hittee);
+                   pline("%s %s!", Tobjnam(otmp, "hit"), hittee);
                pline("Lightning strikes %s!", hittee);
                if (!rn2(5)) (void) destroy_mitem(mdef, RING_CLASS, AD_ELEC);
                if (!rn2(5)) (void) destroy_mitem(mdef, WAND_CLASS, AD_ELEC);
@@ -760,7 +760,7 @@ int dieroll; /* needed for Magicbane and vorpal blades */
        if (attacks(AD_MAGM, otmp)) {
                if (realizes_damage) {
                        if(youattack && otmp != uwep)
-                           pline("%s hits %s!", The(xname(otmp)), hittee);
+                           pline("%s %s!", Tobjnam(otmp, "hit"), hittee);
                        pline("A hail of magic missiles strikes %s!", hittee);
                        return TRUE;
                }
@@ -1327,7 +1327,7 @@ void arti_speak(obj)
        line = getrumor(bcsign(obj), buf, TRUE);
        if (!*line)
                line = "NetHack rumors file closed for renovation.";
-       pline("%s whispers:", The(xname(obj)));
+       pline("%s:", Tobjnam(obj, "whisper"));
        verbalize("%s", line);
        return;
 }
index 6267620decb8b27c29a88a5620aed3c2d29ca807..589d569638a5ed5333ec0d29883c2773a6af0dab 100644 (file)
@@ -336,39 +336,14 @@ struct entity *etmp;
 const char *verb;
 {
        static char wholebuf[80];
-       char verbbuf[30];
 
        Strcpy(wholebuf, is_u(etmp) ? "You" : Monnam(etmp->emon));
-       if (!*verb)
-               return(wholebuf);
+       if (!*verb) return(wholebuf);
        Strcat(wholebuf, " ");
-       verbbuf[0] = '\0';
        if (is_u(etmp))
-               Strcpy(verbbuf, verb);
-       else {
-               if (!strcmp(verb, "are"))
-                       Strcpy(verbbuf, "is");
-               if (!strcmp(verb, "have"))
-                       Strcpy(verbbuf, "has");
-               if (!verbbuf[0]) {
-                       Strcpy(verbbuf, verb);
-                       switch (verbbuf[strlen(verbbuf) - 1]) {
-                               case 'y':
-                                       verbbuf[strlen(verbbuf) - 1] = '\0';
-                                       Strcat(verbbuf, "ies");
-                                       break;
-                               case 'h':
-                               case 'o':
-                               case 's':
-                                       Strcat(verbbuf, "es");
-                                       break;
-                               default:
-                                       Strcat(verbbuf, "s");
-                                       break;
-                       }
-               }
-       }
-       Strcat(wholebuf, verbbuf);
+           Strcat(wholebuf, verb);
+       else
+           Strcat(wholebuf, vtense((char *)0, verb));
        return(wholebuf);
 }
 
index fb3d5a4504d7035676e7adbd20a5dca62d2eae2a..190096df993673a545ab34d2b2380d39001f7fa0 100644 (file)
@@ -751,33 +751,32 @@ struct obj *obj;
 {
     char ch;
     int oops;
-    const char *bname = xname(obj);
 
     if (Blind) {
-       pline("Too bad you can't see %s", the(bname));
+       pline("Too bad you can't see %s", the(xname(obj)));
        return;
     }
     oops = (rnd(20) > ACURR(A_INT) || obj->cursed);
     if (oops && (obj->spe > 0)) {
        switch (rnd(obj->oartifact ? 4 : 5)) {
-       case 1 : pline("%s is too much to comprehend!", The(bname));
+       case 1 : pline("%s too much to comprehend!", Tobjnam(obj, "are"));
            break;
-       case 2 : pline("%s confuses you!", The(bname));
+       case 2 : pline("%s you!", Tobjnam(obj, "confuse"));
            make_confused(HConfusion + rnd(100),FALSE);
            break;
        case 3 : if (!resists_blnd(&youmonst)) {
-               pline("%s damages your vision!", The(bname));
+               pline("%s your vision!", Tobjnam(obj, "damage"));
                make_blinded(Blinded + rnd(100),FALSE);
                if (!Blind) Your(vision_clears);
            } else {
-               pline("%s assaults your vision.", The(bname));
+               pline("%s your vision.", Tobjnam(obj, "assault"));
                You("are unaffected!");
            }
            break;
-       case 4 : pline("%s zaps your mind!", The(bname));
+       case 4 : pline("%s your mind!", Tobjnam(obj, "zap"));
            make_hallucinated(HHallucination + rnd(100),FALSE,0L);
            break;
-       case 5 : pline("%s explodes!", The(bname));
+       case 5 : pline("%s!", Tobjnam(obj, "explode"));
            useup(obj);
            losehp(rnd(30), "exploding crystal ball", KILLED_BY_AN);
            break;
@@ -820,7 +819,7 @@ struct obj *obj;
        if (flags.verbose) pline(Never_mind);
        return;
     }
-    You("peer into %s...", the(bname));
+    You("peer into %s...", the(xname(obj)));
     nomul(-rnd(10));
     nomovemsg = "";
     if (obj->spe <= 0)
index bf8b490af95605552d76b5904d7b0033f98a365c..d9aa5e5ea3e0b5be84885993e26be8ea1fb0e801 100644 (file)
--- a/src/dig.c
+++ b/src/dig.c
@@ -220,29 +220,34 @@ dig()
            }
        }
        if(Fumbling && !rn2(3)) {
-               switch(rn2(3)) {
-               case 0:  if(!welded(uwep)) {
-                            You("fumble and drop your %s.", xname(uwep));
-                            dropx(uwep);
-                        } else {
+           switch(rn2(3)) {
+           case 0:
+               if(!welded(uwep)) {
+                   You("fumble and drop your %s.", xname(uwep));
+                   dropx(uwep);
+               } else {
 #ifdef STEED
-                            if (u.usteed)
-                               Your("%s bounces and hits %s!",
-                                       xname(uwep), mon_nam(u.usteed));
-                            else
+                   if (u.usteed)
+                       Your("%s %s and %s %s!",
+                            xname(uwep),
+                            otense(uwep, "bounce"), otense(uwep, "hit"),
+                            mon_nam(u.usteed));
+                   else
 #endif
-                               pline("Ouch!  Your %s bounces and hits you!",
-                                       xname(uwep));
-                            set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
-                        }
-                        break;
-               case 1:  pline("Bang!  You hit with the broad side of %s!",
-                              the(xname(uwep)));
-                        break;
-               default: Your("swing misses its mark.");
-                        break;
+                       pline("Ouch!  Your %s %s and %s you!",
+                             xname(uwep),
+                             otense(uwep, "bounce"), otense(uwep, "hit"));
+                   set_wounded_legs(RIGHT_SIDE, 5 + rnd(5));
                }
-               return(0);
+               break;
+           case 1:
+               pline("Bang!  You hit with the broad side of %s!",
+                     the(xname(uwep)));
+               break;
+           default: Your("swing misses its mark.");
+               break;
+           }
+           return(0);
        }
 
        digging.effort += 10 + rn2(5) + abon() +
@@ -863,8 +868,8 @@ struct obj *obj;
                                seetrap(trap);
                                There("is a spider web there!");
                            }
-                           Your("%s becomes entangled in the web.",
-                               aobjnam(obj, (char *)0));
+                           Your("%s entangled in the web.",
+                               aobjnam(obj, "become"));
                            /* you ought to be able to let go; tough luck */
                            /* (maybe `move_into_trap()' would be better) */
                            nomul(-d(2,2));
@@ -1343,10 +1348,12 @@ long timeout;   /* unused */
            x = obj->ox;
            y = obj->oy;
        } else if (in_invent) {
-           if (flags.verbose)
-               Your("%s%s rot%s away%c",
-                    obj == uwep ? "wielded " : "", corpse_xname(obj, FALSE),
-                    obj->quan == 1L ? "s" : "", obj == uwep ? '!' : '.');
+           if (flags.verbose) {
+               char *cname = corpse_xname(obj, FALSE);
+               Your("%s%s %s away%c",
+                    obj == uwep ? "wielded " : nul, cname,
+                    vtense(cname, "rot"), obj == uwep ? '!' : '.');
+           }
            if (obj == uwep) {
                uwepgone();     /* now bare handed */
                stop_occupation();
index a26c4b0ea954bf81fab401b7c5d830a42045e7c3..ef261e787d9d8f20ff4cb81c9bff384d330c4c7d 100644 (file)
--- a/src/do.c
+++ b/src/do.c
@@ -166,7 +166,8 @@ const char *verb;
                if (((mtmp = m_at(x, y)) && mtmp->mtrapped) ||
                        (u.utrap && u.ux == x && u.uy == y)) {
                    if (*verb)
-                       pline_The("boulder %ss into the pit%s.", verb,
+                       pline_The("boulder %s into the pit%s.",
+                               vtense((const char *)0, verb),
                                (mtmp) ? "" : " with you");
                    if (mtmp) {
                        if (!passes_walls(mtmp->data) &&
@@ -228,14 +229,13 @@ doaltarobj(obj)  /* obj is an object dropped on an altar */
        u.uconduct.gnostic++;
 
        if (obj->blessed || obj->cursed) {
-               There("is %s flash as %s hit%s the altar.",
+               There("is %s flash as %s %s the altar.",
                        an(hcolor(obj->blessed ? amber : Black)),
-                       doname(obj),
-                       (obj->quan == 1L) ? "s" : "");
+                       doname(obj), otense(obj, "hit"));
                if (!Hallucination) obj->bknown = 1;
        } else {
-               pline("%s land%s on the altar.", Doname2(obj),
-                       (obj->quan == 1L) ? "s" : "");
+               pline("%s %s on the altar.", Doname2(obj),
+                       otense(obj, "land"));
                obj->bknown = 1;
        }
 }
@@ -314,8 +314,8 @@ giveback:
                    if (otmp != uball && otmp != uchain &&
                            !obj_resists(otmp, 1, 99)) {
                        if (!Blind) {
-                           pline("Suddenly, %s vanishes from the sink!",
-                                                       doname(otmp));
+                           pline("Suddenly, %s %s from the sink!",
+                                 doname(otmp), otense(otmp, "vanish"));
                            ideed = TRUE;
                        }
                        delobj(otmp);
index 0a3962fff3405c42b9ff46f98bb7d85798d7a17a..ad1e022a7dc5a77688e5ace505d63ff044fda32f 100644 (file)
@@ -296,7 +296,7 @@ register struct obj *obj;
        short objtyp;
 
        Sprintf(qbuf, "What do you want to name %s %s?",
-               (obj->quan > 1L) ? "these" : "this", xname(obj));
+               is_plural(obj) ? "these" : "this", xname(obj));
        getlin(qbuf, buf);
        if(!*buf || *buf == '\033')     return;
        /* strip leading and trailing spaces; unnames item if all spaces */