From: nhmall Date: Thu, 26 Sep 2019 15:49:15 +0000 (-0400) Subject: fix errant verb tense in some messages if pet or mon name ends in 's' X-Git-Tag: v3.6.3.757eca7~67 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=da6c393e43f1c07f6dfc80a714967ad0ac33e311;p=nethack fix errant verb tense in some messages if pet or mon name ends in 's' Report stated: "Poes deliberately slither onto a polymorph trap!" ... it's only one cat, er, black naga. Why does the parser treat the name as plural? There are lots of singular words and names that end in -s or -es! H9249 1780 --- diff --git a/doc/fixes36.3 b/doc/fixes36.3 index 247c5410a..fbac27988 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -154,6 +154,8 @@ wielded aklys that returned to hero when thrown while inside an engulfer left panic if same weapon killed any engulfer via melee from inside uarmh null pointer dereference if a helm of opposite alignment came off due to being polymorphed +verb tense was inappropriate in some messages when a mon/pet had a name + ending in 's' Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository diff --git a/include/decl.h b/include/decl.h index 5ebaa326e..e030ce454 100644 --- a/include/decl.h +++ b/include/decl.h @@ -302,7 +302,8 @@ E struct c_common_strings { const char *const c_nothing_happens, *const c_thats_enough_tries, *const c_silly_thing_to, *const c_shudder_for_moment, *const c_something, *const c_Something, *const c_You_can_move_again, - *const c_Never_mind, *c_vision_clears, *const c_the_your[2]; + *const c_Never_mind, *c_vision_clears, *const c_the_your[2], + *const c_fakename[2]; } c_common_strings; #define nothing_happens c_common_strings.c_nothing_happens #define thats_enough_tries c_common_strings.c_thats_enough_tries @@ -314,6 +315,9 @@ E struct c_common_strings { #define Never_mind c_common_strings.c_Never_mind #define vision_clears c_common_strings.c_vision_clears #define the_your c_common_strings.c_the_your +/* fakename[] used occasionally so vtense() won't be fooled by an assigned + name ending in 's' */ +#define fakename c_common_strings.c_fakename /* material strings */ E const char *materialnm[]; diff --git a/src/artifact.c b/src/artifact.c index f5c3afedb..03573fe1d 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -969,10 +969,10 @@ boolean vis; /* whether the action can be seen */ char *hittee; /* target's name: "you" or mon_nam(mdef) */ { struct permonst *old_uasmon; - const char *verb, *fakename; + const char *verb; boolean youattack = (magr == &youmonst), youdefend = (mdef == &youmonst), resisted = FALSE, do_stun, do_confuse, result; - int attack_indx, scare_dieroll = MB_MAX_DIEROLL / 2; + int attack_indx, fakeidx, scare_dieroll = MB_MAX_DIEROLL / 2; result = FALSE; /* no message given yet */ /* the most severe effects are less likely at higher enchantment */ @@ -1112,13 +1112,13 @@ char *hittee; /* target's name: "you" or mon_nam(mdef) */ mdef->mconf = 1; } - /* now give message(s) describing side-effects; - don't let vtense() be fooled by assigned name ending in 's' */ - fakename = youdefend ? "you" : "mon"; + /* now give message(s) describing side-effects; Use fakename + so vtense() won't be fooled by assigned name ending in 's' */ + fakeidx = youdefend ? 1 : 0; if (youattack || youdefend || vis) { (void) upstart(hittee); /* capitalize */ if (resisted) { - pline("%s %s!", hittee, vtense(fakename, "resist")); + pline("%s %s!", hittee, vtense(fakename[fakeidx], "resist")); shieldeff(youdefend ? u.ux : mdef->mx, youdefend ? u.uy : mdef->my); } @@ -1132,7 +1132,7 @@ char *hittee; /* target's name: "you" or mon_nam(mdef) */ Strcat(buf, " and "); if (do_confuse) Strcat(buf, "confused"); - pline("%s %s %s%c", hittee, vtense(fakename, "are"), buf, + pline("%s %s %s%c", hittee, vtense(fakename[fakeidx], "are"), buf, (do_stun && do_confuse) ? '!' : '.'); } } diff --git a/src/decl.c b/src/decl.c index 2849418e6..f81271b52 100644 --- a/src/decl.c +++ b/src/decl.c @@ -253,7 +253,8 @@ struct c_common_strings c_common_strings = { "Nothing happens.", "You can move again.", "Never mind.", "vision quickly clears.", - { "the", "your" } }; + { "the", "your" }, + { "mon", "you" } }; /* NOTE: the order of these words exactly corresponds to the order of oc_material values #define'd in objclass.h. */ diff --git a/src/muse.c b/src/muse.c index 4324311f5..ffaf63ab6 100644 --- a/src/muse.c +++ b/src/muse.c @@ -846,7 +846,7 @@ struct monst *mtmp; Mnam = Monnam(mtmp); pline("%s %s into a %s!", Mnam, - vtense(Mnam, locomotion(mtmp->data, "jump")), + vtense(fakename[0], locomotion(mtmp->data, "jump")), (t->ttyp == TRAPDOOR) ? "trap door" : "hole"); if (levl[trapx][trapy].typ == SCORR) { levl[trapx][trapy].typ = CORR; @@ -943,7 +943,7 @@ struct monst *mtmp; if (vis) { Mnam = Monnam(mtmp); pline("%s %s onto a teleport trap!", Mnam, - vtense(Mnam, locomotion(mtmp->data, "jump"))); + vtense(fakename[0], locomotion(mtmp->data, "jump"))); seetrap(t_at(trapx, trapy)); } /* don't use rloc_to() because worm tails must "move" */ @@ -1892,7 +1892,7 @@ struct monst *mtmp; const char *Mnam = Monnam(mtmp); pline("%s deliberately %s onto a polymorph trap!", Mnam, - vtense(Mnam, locomotion(mtmp->data, "jump"))); + vtense(fakename[0], locomotion(mtmp->data, "jump"))); } if (vis) seetrap(t_at(trapx, trapy)); @@ -2470,7 +2470,7 @@ boolean by_you; /* true: if mon kills itself, hero gets credit/blame */ newsym(mon->mx, mon->my); if (vis) pline("%s %s %s %s fire trap!", Mnam, - vtense(Mnam, locomotion(mon->data, "move")), + vtense(fakename[0], locomotion(mon->data, "move")), is_floater(mon->data) ? "over" : "onto", trap->tseen ? "the" : "a"); }