-/* NetHack 3.6 objnam.c $NHDT-Date: 1521507553 2018/03/20 00:59:13 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.199 $ */
+/* NetHack 3.6 objnam.c $NHDT-Date: 1551138256 2019/02/25 23:44:16 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.235 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2011. */
/* NetHack may be freely redistributed. See license for details. */
STATIC_DCL char *FDECL(strprepend, (char *, const char *));
STATIC_DCL short FDECL(rnd_otyp_by_wpnskill, (SCHAR_P));
-STATIC_DCL short FDECL(rnd_otyp_by_namedesc, (char *, CHAR_P));
+STATIC_DCL short FDECL(rnd_otyp_by_namedesc, (const char *, CHAR_P, int));
STATIC_DCL boolean FDECL(wishymatch, (const char *, const char *, BOOLEAN_P));
STATIC_DCL char *NDECL(nextobuf);
STATIC_DCL void FDECL(releaseobuf, (char *));
STATIC_DCL char *FDECL(minimal_xname, (struct obj *));
STATIC_DCL void FDECL(add_erosion_words, (struct obj *, char *));
STATIC_DCL char *FDECL(doname_base, (struct obj *obj, unsigned));
+STATIC_DCL char *FDECL(just_an, (char *str, const char *));
#if 0 /*JP*/
STATIC_DCL boolean FDECL(singplur_lookup, (char *, char *, BOOLEAN_P,
const char *const *));
-STATIC_DCL char *FDECL(singplur_compound, (char *));
#endif
+STATIC_DCL char *FDECL(singplur_compound, (char *));
STATIC_DCL char *FDECL(xname_flags, (struct obj *, unsigned));
#if 0 /*JP*/
STATIC_DCL boolean FDECL(badman, (const char *, BOOLEAN_P));
register struct objclass *ocl = &objects[typ];
int nn = ocl->oc_name_known, omndx = obj->corpsenm;
const char *actualn = OBJ_NAME(*ocl);
- const char *dn = OBJ_DESCR(*ocl) ? OBJ_DESCR(*ocl) : actualn;
+ const char *dn = OBJ_DESCR(*ocl);
const char *un = ocl->oc_uname;
boolean pluralize = (obj->quan != 1L) && !(cxn_flags & CXN_SINGULAR);
boolean known, dknown, bknown;
buf = nextobuf() + PREFIX; /* leave room for "17 -3 " */
if (Role_if(PM_SAMURAI) && Japanese_item_name(typ))
actualn = Japanese_item_name(typ);
+ /* 3.6.2: this used to be part of 'dn's initialization, but it
+ needs to come after possibly overriding 'actualn' */
+ if (!dn)
+ dn = actualn;
buf[0] = '\0';
/*
#endif
} else
Strcat(buf, dn);
+
#if 0 /*JP*/ /*\82±\82ê\82Í\8cê\8f\87\82Ì\8aÖ\8cW\82©\82ç\8fã\82Ì\95û\82Å\92è\8b`*/
- /* If we use an() here we'd have to remember never to use */
- /* it whenever calling doname() or xname(). */
if (typ == FIGURINE && omndx != NON_PM) {
- Sprintf(eos(buf), " of a%s %s",
- index(vowels, *mons[omndx].mname) ? "n" : "",
+ char anbuf[10]; /* [4] would be enough: 'a','n',' ','\0' */
+
+ Sprintf(eos(buf), " of %s%s",
+ just_an(anbuf, mons[omndx].mname),
mons[omndx].mname);
} else if (is_wet_towel(obj)) {
#else
break;
}
- if (nn)
+ if (nn) {
Strcat(buf, actualn);
- else if (un) {
+ } else if (un) {
#if 0 /*JP*/
if (is_boots(obj))
Strcat(buf, "boots");
#endif
break;
case ROCK_CLASS:
- if (typ == STATUE && omndx != NON_PM)
+ if (typ == STATUE && omndx != NON_PM) {
+ char anbuf[10];
+
#if 0 /*JP*/
Sprintf(buf, "%s%s of %s%s",
(Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC))
? ""
: the_unique_pm(&mons[omndx])
? "the "
- : index(vowels, *mons[omndx].mname)
- ? "an "
- : "a ",
+ : just_an(anbuf, mons[omndx].mname),
mons[omndx].mname);
#else
Sprintf(eos(buf), "%s%s\82Ì%s",
: "",
mons[obj->corpsenm].mname, actualn);
#endif
- else
+ } else
#if 0 /*JP*/
Strcpy(buf, actualn);
#else
#if 0 /*JP*/
if (has_oname(obj) && dknown) {
Strcat(buf, " named ");
- nameit:
+ nameit:
Strcat(buf, ONAME(obj));
}
Strcat(bp, (obj == uskin) ? " (embedded in your skin)"
*/
Strcat(bp, (obj == uskin) ? "(\94§\82É\96\84\82ß\82±\82Ü\82ê\82Ä\82¢\82é)"
+ /* in case of perm_invent update while Wear/Takeoff
+ is in progress; check doffing() before donning()
+ because donning() returns True for both cases */
+ : doffing(obj) ? " (being doffed)"
+ : donning(obj) ? " (being donned)"
/*JP
: " (being worn)");
*/
} else {
#if 0 /*JP*/
Sprintf(eos(bp), " (attached to %s)",
- a_monnam(mlsh));
+ noit_mon_nam(mlsh));
#else
Sprintf(eos(bp), " (%s\82É\8c\8b\82Ñ\82Â\82¯\82ç\82ê\82Ä\82¢\82é)",
- a_monnam(mlsh));
+ noit_mon_nam(mlsh));
#endif
}
break;
goto charges;
break;
case WAND_CLASS:
- charges:
+ charges:
if (known)
/*JP
Sprintf(eos(bp), " (%d:%d)", (int) obj->recharged, obj->spe);
Strcat(bp, "(\8cõ\82Á\82Ä\82¢\82é)");
break;
case RING_CLASS:
- ring:
+ ring:
if (obj->owornmask & W_RINGR)
/*JP
Strcat(bp, " (on right ");
if (bimanual(obj))
hand_s = makeplural(hand_s);
-/*JP
- Sprintf(eos(bp), " (weapon in %s)", hand_s);
-*/
+ /* note: Sting's glow message, if added, will insert text
+ in front of "(weapon in hand)"'s closing paren */
+#if 0 /*JP*/
+ Sprintf(eos(bp), " (%sweapon in %s)",
+ (obj->otyp == AKLYS) ? "tethered " : "", hand_s);
+#else /*\83A\83L\83\8a\83X\82ð\93Á\95Ê\88µ\82¢\82µ\82È\82¢*/
Sprintf(eos(bp), "(%s\82É\82µ\82Ä\82¢\82é)", hand_s);
+#endif
if (warn_obj_cnt && obj == uwep && (EWarn_of_mon & W_WEP) != 0L) {
- /* presumably can be felt when blind */
+ if (!Blind) /* we know bp[] ends with ')'; overwrite that */
#if 0 /*JP*/
- Strcat(bp, " (glowing");
- if (!Blind)
- Sprintf(eos(bp), " %s", glow_color(obj->oartifact));
- Strcat(bp, ")");
-#else
- if (Blind)
- Strcat(bp, " (\94M\82ð\8e\9d\82Á\82Ä\82¢\82é)");
- else
- Sprintf(eos(bp), " (%s\8bP\82¢\82Ä\82¢\82é)",
+ Sprintf(eos(bp) - 1, ", %s %s)",
+ glow_verb(warn_obj_cnt, TRUE),
glow_color(obj->oartifact));
+#else
+ Sprintf(eos(bp) - 1, ", %s%s\82¢\82é)",
+ jconj_adj(glow_color(obj->oartifact)),
+ jconj(glow_verb(warn_obj_cnt, TRUE), "\82Ä"));
#endif
}
}
Strcat(bp, "(\8f\80\94õ\82µ\82Ä\82¢\82é)");
}
}
- if (!iflags.suppress_price && is_unpaid(obj)) {
+ /* treat 'restoring' like suppress_price because shopkeeper and
+ bill might not be available yet while restore is in progress */
+ if (iflags.suppress_price || restoring) {
+ ; /* don't attempt to obtain any stop pricing, even if 'with_price' */
+ } else if (is_unpaid(obj)) { /* in inventory or in container in invent */
long quotedprice = unpaid_cost(obj, TRUE);
#if 0 /*JP*/
obj->unpaid ? "\96¢\95¥\82¢" : "\92\86\90g",
quotedprice, currency(quotedprice));
#endif
- } else if (with_price) {
- long price = get_cost_of_shop_item(obj);
+ } else if (with_price) { /* on floor or in container on floor */
+ int nochrg = 0;
+ long price = get_cost_of_shop_item(obj, &nochrg);
- if (price > 0)
- Sprintf(eos(bp), " (%ld %s)", price, currency(price));
+ if (price > 0L)
+ Sprintf(eos(bp), " (%s, %ld %s)",
+ nochrg ? "contents" : "for sale",
+ price, currency(price));
+ else if (nochrg > 0)
+ Strcat(bp, " (no charge)");
}
#if 0 /*JP*//*\93ú\96{\8cê\82Å\82Í\95s\97v*/
- if (!strncmp(prefix, "a ", 2)
- && index(vowels, *(prefix + 2) ? *(prefix + 2) : *bp)
- && (*(prefix + 2)
- || (strncmp(bp, "uranium", 7) && strncmp(bp, "unicorn", 7)
- && strncmp(bp, "eucalyptus", 10)))) {
- Strcpy(tmpbuf, prefix);
- Strcpy(prefix, "an ");
- Strcpy(prefix + 3, tmpbuf + 2);
+ if (!strncmp(prefix, "a ", 2)) {
+ /* save current prefix, without "a "; might be empty */
+ Strcpy(tmpbuf, prefix + 2);
+ /* set prefix[] to "", "a ", or "an " */
+ (void) just_an(prefix, *tmpbuf ? tmpbuf : bp);
+ /* append remainder of original prefix */
+ Strcat(prefix, tmpbuf);
}
#endif
return nam;
}
+/* pick "", "a ", or "an " as article for 'str'; used by an() and doname() */
+STATIC_OVL char *
+just_an(outbuf, str)
+char *outbuf;
+const char *str;
+{
+#if 0 /*JP*//*\95s\92è\8a¥\8e\8c\82Í\95s\97v*/
+ char c0;
+
+ *outbuf = '\0';
+ c0 = lowc(*str);
+ if (!str[1]) {
+ /* single letter; might be used for named fruit */
+ Strcpy(outbuf, index("aefhilmnosx", c0) ? "an " : "a ");
+ } else if (!strncmpi(str, "the ", 4) || !strcmpi(str, "molten lava")
+ || !strcmpi(str, "iron bars") || !strcmpi(str, "ice")) {
+ ; /* no article */
+ } else {
+ if ((index(vowels, c0) && strncmpi(str, "one-", 4)
+ && strncmpi(str, "eucalyptus", 10) && strncmpi(str, "unicorn", 7)
+ && strncmpi(str, "uranium", 7) && strncmpi(str, "useful", 6))
+ || (index("x", c0) && !index(vowels, lowc(str[1]))))
+ Strcpy(outbuf, "an ");
+ else
+ Strcpy(outbuf, "a ");
+ }
+#else
+ *outbuf = '\0';
+#endif
+ return outbuf;
+}
+
char *
an(str)
-register const char *str;
+const char *str;
{
char *buf = nextobuf();
-#if 0 /*JP*//*\95s\92è\8a¥\8e\8c\82Í\95s\97v*/
- buf[0] = '\0';
-
- if (strncmpi(str, "the ", 4) && strcmp(str, "molten lava")
- && strcmp(str, "iron bars") && strcmp(str, "ice")) {
- if (index(vowels, *str) && strncmp(str, "one-", 4)
- && strncmp(str, "useful", 6) && strncmp(str, "unicorn", 7)
- && strncmp(str, "uranium", 7) && strncmp(str, "eucalyptus", 10))
- Strcpy(buf, "an ");
- else
- Strcpy(buf, "a ");
+ if (!str || !*str) {
+ impossible("Alphabet soup: 'an(%s)'.", str ? "\"\"" : "<null>");
+ return strcpy(buf, "an []");
}
-
- Strcat(buf, str);
-#else /*\92P\82É\83R\83s\81[*/
- Strcpy(buf, str);
-#endif
- return buf;
+ (void) just_an(buf, str);
+ return strcat(buf, str);
}
char *
#if 0 /*JP*//*\92è\8a¥\8e\8c\82Í\95s\97v*/
boolean insert_the = FALSE;
+ if (!str || !*str) {
+ impossible("Alphabet soup: 'the(%s)'.", str ? "\"\"" : "<null>");
+ return strcpy(buf, "the []");
+ }
if (!strncmpi(str, "the ", 4)) {
buf[0] = lowc(*str);
Strcpy(&buf[1], str + 1);
return strcpy(buf, verb);
}
-sing:
+ sing:
Strcpy(buf, verb);
len = (int) strlen(buf);
bspot = buf + len - 1;
const struct sing_plur *sp;
const char *same, *other, *const *as;
int al;
+ int baselen = strlen(basestr);
for (as = as_is; *as; ++as) {
al = (int) strlen(*as);
}
/* skip "ox" -> "oxen" entry when pluralizing "<something>ox"
unless it is muskox */
- if (to_plural && strlen(basestr) > 2 && !strcmpi(endstring - 2, "ox")
- && strcmpi(endstring - 6, "muskox")) {
+ if (to_plural && baselen > 2 && !strcmpi(endstring - 2, "ox")
+ && !(baselen > 5 && !strcmpi(endstring - 6, "muskox"))) {
/* "fox" -> "foxes" */
Strcasecpy(endstring, "es");
return TRUE;
}
if (to_plural) {
- if (!strcmpi(endstring - 3, "man")
+ if (baselen > 2 && !strcmpi(endstring - 3, "man")
&& badman(basestr, to_plural)) {
Strcasecpy(endstring, "s");
return TRUE;
}
} else {
- if (!strcmpi(endstring - 3, "men")
+ if (baselen > 2 && !strcmpi(endstring - 3, "men")
&& badman(basestr, to_plural))
return TRUE;
}
/* Default: append an 's' */
Strcasecpy(spot + 1, "s");
-bottom:
+ bottom:
if (excess)
Strcat(str, excess);
#else /*JP*//*\90V\82µ\82¢\83o\83b\83t\83@\82Í\95K\97v*/
if (p >= bp + 2 && lowc(p[-2]) == 'e') {
if (p >= bp + 3 && lowc(p[-3]) == 'i') { /* "ies" */
if (!BSTRCMPI(bp, p - 7, "cookies")
- || !BSTRCMPI(bp, p - 4, "pies")
+ || (!BSTRCMPI(bp, p - 4, "pies")
+ /* avoid false match for "harpies" */
+ && (p - 4 == bp || p[-5] == ' '))
+ /* alternate djinni/djinn spelling; not really needed */
+ || (!BSTRCMPI(bp, p - 6, "genies")
+ /* avoid false match for "progenies" */
+ && (p - 6 == bp || p[-7] == ' '))
|| !BSTRCMPI(bp, p - 5, "mbies") /* zombie */
|| !BSTRCMPI(bp, p - 5, "yries")) /* valkyrie */
goto mins;
|| (p - 4 == bp && !strcmpi(p - 4, "lens"))) {
goto bottom;
}
- mins:
+ mins:
*(p - 1) = '\0'; /* drop s */
} else { /* input doesn't end in 's' */
/* here we cannot find the plural suffix */
}
-bottom:
+ bottom:
/* if we stripped off a suffix (" of bar" from "foo of bar"),
put it back now [strcat() isn't actually 100% safe here...] */
if (excess)
const char *basestr;
boolean to_plural; /* true => makeplural, false => makesingular */
{
- int i, al;
- char *endstr, *spot;
/* these are all the prefixes for *man that don't have a *men plural */
- const char *no_men[] = {
+ static const char *no_men[] = {
"albu", "antihu", "anti", "ata", "auto", "bildungsro", "cai", "cay",
"ceru", "corner", "decu", "des", "dura", "fir", "hanu", "het",
"infrahu", "inhu", "nonhu", "otto", "out", "prehu", "protohu",
"hu", "un", "le", "re", "so", "to", "at", "a",
};
/* these are all the prefixes for *men that don't have a *man singular */
- const char *no_man[] = {
+ static const char *no_man[] = {
"abdo", "acu", "agno", "ceru", "cogno", "cycla", "fleh", "grava",
"hegu", "preno", "sonar", "speci", "dai", "exa", "fla", "sta", "teg",
- "tegu", "vela", "da", "hy", "lu", "no", "nu", "ra", "ru", "se", "vi", "ya",
- "o", "a",
+ "tegu", "vela", "da", "hy", "lu", "no", "nu", "ra", "ru", "se", "vi",
+ "ya", "o", "a",
};
+ int i, al;
+ const char *endstr, *spot;
if (!basestr || strlen(basestr) < 4)
return FALSE;
- endstr = eos((char *)basestr);
+ endstr = eos((char *) basestr);
if (to_plural) {
for (i = 0; i < SIZE(no_men); i++) {
absence of spaces and/or hyphens (such as "pickaxe" vs "pick axe"
vs "pick-axe") then there is no need for inclusion in this list;
likewise for ``"of" inversions'' ("boots of speed" vs "speed boots") */
-struct alt_spellings {
+static const struct alt_spellings {
const char *sp;
int ob;
} spellings[] = {
{ "eucalyptus", EUCALYPTUS_LEAF },
{ "royal jelly", LUMP_OF_ROYAL_JELLY },
{ "lembas", LEMBAS_WAFER },
+ { "cookie", FORTUNE_COOKIE },
+ { "pie", CREAM_PIE },
{ "marker", MAGIC_MARKER },
{ "hook", GRAPPLING_HOOK },
{ "grappling iron", GRAPPLING_HOOK },
{
int i, n = 0;
short otyp = STRANGE_OBJECT;
+
for (i = bases[WEAPON_CLASS];
i < NUM_OBJECTS && objects[i].oc_class == WEAPON_CLASS; i++)
if (objects[i].oc_skill == skill) {
}
STATIC_OVL short
-rnd_otyp_by_namedesc(name, oclass)
-char *name;
+rnd_otyp_by_namedesc(name, oclass, xtra_prob)
+const char *name;
char oclass;
+int xtra_prob; /* to force 0% random generation items to also be considered */
{
int i, n = 0;
short validobjs[NUM_OBJECTS];
register const char *zn;
- long maxprob = 0;
+ int prob, maxprob = 0;
- if (!name)
+ if (!name || !*name)
return STRANGE_OBJECT;
- memset((genericptr_t) validobjs, 0, sizeof(validobjs));
+ memset((genericptr_t) validobjs, 0, sizeof validobjs);
- for (i = oclass ? bases[(int)oclass] : STRANGE_OBJECT + 1;
+ /* FIXME:
+ * When this spans classes (the !oclass case), the item
+ * probabilities are not very useful because they don't take
+ * the class generation probability into account. [If 10%
+ * of spellbooks were blank and 1% of scrolls were blank,
+ * "blank" would have 10/11 chance to yield a blook even though
+ * scrolls are supposed to be much more common than books.]
+ */
+ for (i = oclass ? bases[(int) oclass] : STRANGE_OBJECT + 1;
i < NUM_OBJECTS && (!oclass || objects[i].oc_class == oclass);
++i) {
/* don't match extra descriptions (w/o real name) */
|| ((zn = objects[i].oc_uname) != 0
&& wishymatch(name, zn, FALSE))) {
validobjs[n++] = (short) i;
- maxprob += (objects[i].oc_prob + 1);
+ maxprob += (objects[i].oc_prob + xtra_prob);
}
}
if (n > 0 && maxprob) {
- long prob = rn2(maxprob);
-
- i = 0;
- while (i < n - 1
- && (prob -= (objects[validobjs[i]].oc_prob + 1)) >= 0)
- i++;
+ prob = rn2(maxprob);
+ for (i = 0; i < n - 1; i++)
+ if ((prob -= (objects[validobjs[i]].oc_prob + xtra_prob)) < 0)
+ break;
return validobjs[i];
}
return STRANGE_OBJECT;
}
+int
+shiny_obj(oclass)
+char oclass;
+{
+ return (int) rnd_otyp_by_namedesc("shiny", oclass, 0);
+}
+
/*
* Return something wished for. Specifying a null pointer for
* the user request string results in a random object. Otherwise,
int wetness, gsize = 0;
struct fruit *f;
int ftype = context.current_fruit;
- char fruitbuf[BUFSZ];
+ char fruitbuf[BUFSZ], globbuf[BUFSZ];
/* Fruits may not mess up the ability to wish for real objects (since
* you can leave a fruit in a bones file and it will be added to
* another person's game), so they must be checked for last, after
#else
} else if (!strncmpi(bp, "\8f¬\82³\82¢", l = 6)) { /* glob sizes */
#endif
+ /* "small" might be part of monster name (mimic, if wishing
+ for its corpse) rather than prefix for glob size; when
+ used for globs, it might be either "small glob of <foo>" or
+ "small <foo> glob" and user might add 's' even though plural
+ doesn't accomplish anything because globs don't stack */
+ if (strncmpi(bp + l, "glob", 4) && !strstri(bp + l, " glob"))
+ break;
gsize = 1;
#if 0 /*JP*/
} else if (!strncmpi(bp, "medium ", l = 7)) {
} else if (!strncmpi(bp, "\92\86\82\82ç\82¢\82Ì", l = 10)) {
#endif
/* xname() doesn't display "medium" but without this
- there'd be no way to ask for the intermediate size */
+ there'd be no way to ask for the intermediate size
+ ("glob" without size prefix yields smallest one) */
gsize = 2;
#if 0 /*JP*/
} else if (!strncmpi(bp, "large ", l = 6)) {
#else
} else if (!strncmpi(bp, "\91å\82«\82¢", l = 6)) {
#endif
+ /* "large" might be part of monster name (dog, cat, koboold,
+ mimic) or object name (box, round shield) rather than
+ prefix for glob size */
+ if (strncmpi(bp + l, "glob", 4) && !strstri(bp + l, " glob"))
+ break;
/* "very large " had "very " peeled off on previous iteration */
gsize = (very != 1) ? 3 : 4;
} else
bp += l;
}
if (!cnt)
- cnt = 1; /* %% what with "gems" etc. ? */
+ cnt = 1; /* will be changed to 2 if makesingular() changes string */
if (strlen(bp) > 1 && (p = rindex(bp, '(')) != 0) {
boolean keeptrailingchars = TRUE;
*
* also don't let player wish for multiple globs.
*/
- if ((p = strstri(bp, "glob of ")) != 0
+ i = (int) strlen(bp);
+ p = (char *) 0;
+ /* check for "glob", "<foo> glob", and "glob of <foo>" */
+ if (!strcmpi(bp, "glob") || !BSTRCMPI(bp, bp + i - 5, " glob")
+ || !strcmpi(bp, "globs") || !BSTRCMPI(bp, bp + i - 6, " globs")
+ || (p = strstri(bp, "glob of ")) != 0
|| (p = strstri(bp, "globs of ")) != 0) {
- int globoffset = (*(p + 4) == 's') ? 9 : 8;
-
- if ((mntmp = name_to_mon(p + globoffset)) >= PM_GRAY_OOZE
- && mntmp <= PM_BLACK_PUDDING) {
- mntmp = NON_PM; /* lie to ourselves */
- cnt = 0; /* force only one */
- }
+ mntmp = name_to_mon(!p ? bp : (strstri(p, " of ") + 4));
+ /* if we didn't recognize monster type, pick a valid one at random */
+ if (mntmp == NON_PM)
+ mntmp = rn1(PM_BLACK_PUDDING - PM_GRAY_OOZE, PM_GRAY_OOZE);
+ /* construct canonical spelling in case name_to_mon() recognized a
+ variant (grey ooze) or player used inverted syntax (<foo> glob);
+ if player has given a valid monster type but not valid glob type,
+ object name lookup won't find it and wish attempt will fail */
+ Sprintf(globbuf, "glob of %s", mons[mntmp].mname);
+ bp = globbuf;
+ mntmp = NON_PM; /* not useful for "glob of <foo>" object lookup */
+ cnt = 0; /* globs don't stack */
+ oclass = FOOD_CLASS;
+ actualn = bp, dn = 0;
+ goto srch;
} else {
/*
* Find corpse type using "of" (figurine of an orc, tin of orc meat)
/* first change to singular if necessary */
if (*bp) {
char *sng = makesingular(bp);
+
if (strcmp(bp, sng)) {
if (cnt == 1)
cnt = 2;
#if 0 /*JP*//*\83X\83y\83\8b\97h\82ê\8f\88\97\9d\82Í\82µ\82È\82¢*/
/* Alternate spellings (pick-ax, silver sabre, &c) */
{
- struct alt_spellings *as = spellings;
+ const struct alt_spellings *as = spellings;
while (as->sp) {
if (fuzzymatch(bp, as->sp, " -", TRUE)) {
typ = SPE_BLANK_PAPER;
goto typfnd;
}
+ /* specific food rather than color of gem/potion/spellbook[/scales] */
+ if (!BSTRCMPI(bp, p - 6, "orange") && mntmp == NON_PM) {
+ typ = ORANGE;
+ goto typfnd;
+ }
/*
* NOTE: Gold pieces are handled as objects nowadays, and therefore
* this section should probably be reconsidered as well as the entire
}
#if 0 /*JP*//* mail/armor\8aÖ\98A\82Å\82Ì\82Ý\8eg\82¤\83\89\83x\83\8b */
-retry:
+ retry:
#endif
#if 0 /*JP*//* \83^\83C\83v\95Ê\82Í\82Æ\82è\82 \82¦\82¸\82µ\82È\82¢ */
/* "grey stone" check must be before general "stone" */
if (!dn)
dn = actualn; /* ex. "skull cap" */
#if 0 /*JP*/
-srch:
+ srch:
#endif
/* check real names of gems first */
if (!oclass && actualn) {
#endif
}
- if (((typ = rnd_otyp_by_namedesc(actualn, oclass)) != STRANGE_OBJECT)
- || ((typ = rnd_otyp_by_namedesc(dn, oclass)) != STRANGE_OBJECT)
- || ((typ = rnd_otyp_by_namedesc(un, oclass)) != STRANGE_OBJECT)
- || ((typ = rnd_otyp_by_namedesc(origbp, oclass)) != STRANGE_OBJECT))
+ if (((typ = rnd_otyp_by_namedesc(actualn, oclass, 1)) != STRANGE_OBJECT)
+ || ((typ = rnd_otyp_by_namedesc(dn, oclass, 1)) != STRANGE_OBJECT)
+ || ((typ = rnd_otyp_by_namedesc(un, oclass, 1)) != STRANGE_OBJECT)
+ || ((typ = rnd_otyp_by_namedesc(origbp, oclass, 1)) != STRANGE_OBJECT))
goto typfnd;
typ = 0;
* trap objects like beartraps.
* Disallow such topology tweaks for WIZKIT startup wishes.
*/
-wiztrap:
+ wiztrap:
if (wizard && !program_state.wizkit_wishing) {
struct rm *lev;
int trap, x = u.ux, y = u.uy;
if (strncmpi(tname, bp, strlen(tname)))
continue;
/* found it; avoid stupid mistakes */
- if ((trap == TRAPDOOR || trap == HOLE) && !Can_fall_thru(&u.uz))
+ if (is_hole(trap) && !Can_fall_thru(&u.uz))
trap = ROCKTRAP;
if ((t = maketrap(x, y, trap)) != 0) {
trap = t->ttyp;
(trap != MAGIC_PORTAL) ? "" : " to nowhere");
} else
pline("Creation of %s failed.", an(tname));
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
/* furniture and terrain */
lev->blessedftn = 1;
pline("A %sfountain.", lev->blessedftn ? "magic " : "");
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 6, "throne")) {
lev->typ = THRONE;
pline("A throne.");
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 4, "sink")) {
lev->typ = SINK;
level.flags.nsinks++;
pline("A sink.");
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
/* ("water" matches "potion of water" rather than terrain) */
if (!BSTRCMPI(bp, p - 4, "pool") || !BSTRCMPI(bp, p - 4, "moat")) {
/* Must manually make kelp! */
water_damage_chain(level.objects[x][y], TRUE);
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 4, "lava")) { /* also matches "molten lava" */
lev->typ = LAVAPOOL;
if (!(Levitation || Flying))
(void) lava_effects();
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 5, "altar")) {
lev->altarmask = Align2amask(al);
pline("%s altar.", An(align_str(al)));
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 5, "grave")
pline("%s.", IS_GRAVE(lev->typ) ? "A grave"
: "Can't place a grave here");
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 4, "tree")) {
pline("A tree.");
newsym(x, y);
block_point(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
if (!BSTRCMPI(bp, p - 4, "bars")) {
lev->typ = IRONBARS;
pline("Iron bars.");
newsym(x, y);
- return &zeroobj;
+ return (struct obj *) &zeroobj;
}
}
if (!oclass)
return ((struct obj *) 0);
-any:
+ any:
if (!oclass)
- oclass = wrpsym[rn2((int) sizeof(wrpsym))];
-typfnd:
+ oclass = wrpsym[rn2((int) sizeof wrpsym)];
+ typfnd:
if (typ)
oclass = objects[typ].oc_class;
|| (otmp->oartifact && rn2(nartifact_exist()) > 1)) && !wizard) {
artifact_exists(otmp, safe_oname(otmp), FALSE);
obfree(otmp, (struct obj *) 0);
- otmp = &zeroobj;
+ otmp = (struct obj *) &zeroobj;
/*JP
pline("For a moment, you feel %s in your %s, but it disappears!",
*/
pline("\88ê\8fu%s\82ª%s\82Ì\92\86\82É\82 \82é\82æ\82¤\82È\8a´\82¶\82ª\82µ\82½\82ª\81C\82·\82®\82É\8fÁ\82¦\82³\82Á\82½\81I",
something, makeplural(body_part(HAND)));
+ return otmp;
}
if (halfeaten && otmp->oclass == FOOD_CLASS) {
{
const char *suitnm, *esuitp;
- if (Is_dragon_mail(suit))
+ if (suit) {
+ if (Is_dragon_mail(suit))
#if 0 /*JP*/
- return "dragon mail"; /* <color> dragon scale mail */
+ return "dragon mail"; /* <color> dragon scale mail */
#else
- return "\97Ø\8aZ"; /* <color> dragon scale mail */
+ return "\97Ø\8aZ"; /* <color> dragon scale mail */
#endif
- else if (Is_dragon_scales(suit))
+ else if (Is_dragon_scales(suit))
/*JP
return "dragon scales";
*/
return "\97Ø";
- suitnm = OBJ_NAME(objects[suit->otyp]);
- esuitp = eos((char *) suitnm);
+ suitnm = OBJ_NAME(objects[suit->otyp]);
+ esuitp = eos((char *) suitnm);
#if 0 /*JP*/
- if (strlen(suitnm) > 5 && !strcmp(esuitp - 5, " mail"))
- return "mail"; /* most suits fall into this category */
+ if (strlen(suitnm) > 5 && !strcmp(esuitp - 5, " mail"))
+ return "mail"; /* most suits fall into this category */
#else
- if (strlen(suitnm) > 2 && !strcmp(esuitp - 2, "\8aZ"))
- return "\8aZ"; /* most suits fall into this category */
+ if (strlen(suitnm) > 2 && !strcmp(esuitp - 2, "\8aZ"))
+ return "\8aZ"; /* most suits fall into this category */
#endif
#if 0 /*JP*/
- else if (strlen(suitnm) > 7 && !strcmp(esuitp - 7, " jacket"))
- return "jacket"; /* leather jacket */
+ else if (strlen(suitnm) > 7 && !strcmp(esuitp - 7, " jacket"))
+ return "jacket"; /* leather jacket */
#endif
- /* suit is lame but armor is ambiguous and body armor is absurd */
+ }
+ /* "suit" is lame but "armor" is ambiguous and "body armor" is absurd */
/*JP
return "suit";
*/
mimic_obj_name(mtmp)
struct monst *mtmp;
{
- if (mtmp->m_ap_type == M_AP_OBJECT) {
+ if (M_AP_TYPE(mtmp) == M_AP_OBJECT) {
if (mtmp->mappearance == GOLD_PIECE)
/*JP
return "gold";