'remove' menu choices in interactive handling for menu colorings,
message types, and autopickup exceptions subject to buffer overflow
when picking a destination for #jump, '$' to show valid dest. is more accurate
+enchant armor gave "your pair of boots/gloves glow", should have been "glows"
Platform- and/or Interface-Specific Fixes
((obj)->otyp == LUCKSTONE || (obj)->otyp == LOADSTONE \
|| (obj)->otyp == FLINT || (obj)->otyp == TOUCHSTONE)
-/* misc */
+/* misc helpers, simple enough to be macros */
#define is_flimsy(otmp) \
(objects[(otmp)->otyp].oc_material <= LEATHER \
|| (otmp)->otyp == RUBBER_HOSE)
-
-/* helpers, simple enough to be macros */
#define is_plural(o) \
- ((o)->quan != 1L || (o)->otyp == LENSES || is_gloves(o) || is_boots(o))
+ ((o)->quan != 1L \
+ /* "the Eyes of the Overworld" are plural, but \
+ "a pair of lenses named the Eyes of the Overworld" is not */ \
+ || ((o)->oartifact == ART_EYES_OF_THE_OVERWORLD \
+ && !undiscovered_artifact(ART_EYES_OF_THE_OVERWORLD)))
+#define pair_of(o) ((o)->otyp == LENSES || is_gloves(o) || is_boots(o))
/* Flags for get_obj_location(). */
#define CONTAINED_TOO 0x1
* Notes for adding new oextra structures:
*
* 1. Add the structure definition and any required macros in an
- *appropriate
- * header file that precedes this one.
- * 2. Add a pointer to your new struct to the oextra struct in this
- *file.
+ * appropriate header file that precedes this one.
+ * 2. Add a pointer to your new struct to oextra struct in this file.
* 3. Add a referencing macro to this file after the newobj macro above
* (see ONAME, OMONST, OMIN, OLONG, or OMAILCMD for examples).
* 4. Add a testing macro after the set of referencing macros
* (see has_oname(), has_omonst(), has_omin(), has_olong(),
* has_omailcmd() for examples).
- * 5. Create a newXX(otmp) function and possibly a free_XX(otmp)
- *function
+ * 5. Create newXX(otmp) function and possibly free_XX(otmp) function
* in an appropriate new or existing source file and add a prototype
* for it to include/extern.h. The majority of these are currently
* located in mkobj.c for convenience.
goto ouch;
if (IS_TREE(maploc->typ)) {
struct obj *treefruit;
+
/* nothing, fruit or trouble? 75:23.5:1.5% */
if (rn2(3)) {
if (!rn2(6) && !(mvitals[PM_KILLER_BEE].mvflags & G_GONE))
&& (treefruit = rnd_treefruit_at(x, y))) {
long nfruit = 8L - rnl(7), nfall;
short frtype = treefruit->otyp;
+
treefruit->quan = nfruit;
+ treefruit->owt = weight(treefruit);
if (is_plural(treefruit))
pline("Some %s fall from the tree!", xname(treefruit));
else
int cnt = rnl(4) + 2;
int made = 0;
coord mm;
+
mm.x = x;
mm.y = y;
while (cnt--) {
}
if (s1)
pline("Use the '%s' command to %s %s%s.", s1, s2,
- !is_plural(otmp) ? "that" : "those", s3);
+ !(is_plural(otmp) || pair_of(otmp)) ? "that" : "those", s3);
else
#endif
pline(silly_thing_to, word);
}
/*
- Skip over "pair of ", "pairs of", "set of" and "sets of".
-
- Accept "3 pair of boots" as well as "3 pairs of boots". It is valid
- English either way. See makeplural() for more on pair/pairs.
-
- We should only double count if the object in question is not
- referred to as a "pair of". E.g. We should double if the player
- types "pair of spears", but not if the player types "pair of
- lenses". Luckily (?) all objects that are referred to as pairs
- -- boots, gloves, and lenses -- are also not mergable, so cnt is
- ignored anyway.
- */
+ * Skip over "pair of ", "pairs of", "set of" and "sets of".
+ *
+ * Accept "3 pair of boots" as well as "3 pairs of boots". It is
+ * valid English either way. See makeplural() for more on pair/pairs.
+ *
+ * We should only double count if the object in question is not
+ * referred to as a "pair of". E.g. We should double if the player
+ * types "pair of spears", but not if the player types "pair of
+ * lenses". Luckily (?) all objects that are referred to as pairs
+ * -- boots, gloves, and lenses -- are also not mergable, so cnt is
+ * ignored anyway.
+ */
if (!strncmpi(bp, "pair of ", 8)) {
bp += 8;
cnt *= 2;
- } else if (cnt > 1 && !strncmpi(bp, "pairs of ", 9)) {
+ } else if (!strncmpi(bp, "pairs of ", 9)) {
bp += 9;
- cnt *= 2;
+ if (cnt > 1)
+ cnt *= 2;
} else if (!strncmpi(bp, "set of ", 7)) {
bp += 7;
} else if (!strncmpi(bp, "sets of ", 8)) {
if (inaccessible_equipment(obj, "dip", FALSE))
return 0;
- shortestname = is_plural(obj) ? "them" : "it";
+ shortestname = (is_plural(obj) || pair_of(obj)) ? "them" : "it";
/*
* Bypass safe_qbuf() since it doesn't handle varying suffix without
* an awful lot of support work. Format the object once, even though
}
Strcpy(qbuf, "Ready all of them instead?");
} else {
+ boolean use_plural = (is_plural(uwep) || pair_of(uwep));
+
Sprintf(qbuf, "You are wielding %s. Ready %s instead?",
- /* uwep->quan is 1, but name might be plural ('boots') */
- !is_plural(uwep) ? "that" : "those",
- !is_plural(uwep) ? "it" : "them");
+ !use_plural ? "that" : "those",
+ !use_plural ? "it" : "them");
}
/* require confirmation to ready the main weapon */
if (ynq(qbuf) != 'y') {
}
Strcpy(qbuf, "Ready all of them instead?");
} else {
+ boolean use_plural = (is_plural(uswapwep) || pair_of(uswapwep));
+
Sprintf(qbuf, "%s your %s weapon. Ready %s instead?",
- !is_plural(uswapwep) ? "That is" : "Those are",
+ !use_plural ? "That is" : "Those are",
u.twoweap ? "second" : "alternate",
- /* uswapwep->quan is 1, but name might be plural */
- !is_plural(uswapwep) ? "it" : "them");
+ !use_plural ? "it" : "them");
}
/* require confirmation to ready the alternate weapon */
if (ynq(qbuf) != 'y') {