readable conical hats

Let tourists read cornuthaum ("WIZZARD") and dunce cap ("DUNCE").
One out of three will have those words, the other two will yield
"you can't find anything to read on this ___" where ___ is either
"conical hat" or "cornuthaum" or "dunce cap" depending upon hat
type and discovery status.

Even when a dunce cap says "DUNCE" it won't become discovered,
just offer the player an opportunity to apply a name.

Other roles still fall through to the "That's a silly thing to
read" feedback.

Not intended to be logical...
This commit is contained in:
PatR
2020-12-05 12:29:38 -08:00
parent 0462a2088c
commit edefa14834
2 changed files with 60 additions and 28 deletions
+2 -1
View File
@@ -1,4 +1,4 @@
NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.373 $ $NHDT-Date: 1607079461 2020/12/04 10:57:41 $ NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.375 $ $NHDT-Date: 1607200174 2020/12/05 20:29:34 $
General Fixes and Modified Features General Fixes and Modified Features
----------------------------------- -----------------------------------
@@ -640,6 +640,7 @@ render the color names in the corresponding color when using the pick-a-color
reading blessed scroll of teleportation confers one-shot teleport control reading blessed scroll of teleportation confers one-shot teleport control
mild zombie apocalypse mild zombie apocalypse
list lamps and lanterns in charging prompt list lamps and lanterns in charging prompt
let tourists read conical hats
Platform- and/or Interface-Specific New Features Platform- and/or Interface-Specific New Features
+58 -27
View File
@@ -1,4 +1,4 @@
/* NetHack 3.7 read.c $NHDT-Date: 1600468453 2020/09/18 22:34:13 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.202 $ */ /* NetHack 3.7 read.c $NHDT-Date: 1607200174 2020/12/05 20:29:34 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.204 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -214,8 +214,10 @@ struct obj *obj;
int int
doread() doread()
{ {
static const char find_any_braille[] = "feel any Braille writing.";
register struct obj *scroll; register struct obj *scroll;
boolean confused, nodisappear; boolean confused, nodisappear;
int otyp;
/* /*
* Reading while blind is allowed in most cases, including the * Reading while blind is allowed in most cases, including the
@@ -241,9 +243,10 @@ doread()
scroll = getobj(readable, "read"); scroll = getobj(readable, "read");
if (!scroll) if (!scroll)
return 0; return 0;
otyp = scroll->otyp;
/* outrumor has its own blindness check */ /* outrumor has its own blindness check */
if (scroll->otyp == FORTUNE_COOKIE) { if (otyp == FORTUNE_COOKIE) {
if (flags.verbose) if (flags.verbose)
You("break up the cookie and throw away the pieces."); You("break up the cookie and throw away the pieces.");
outrumor(bcsign(scroll), BY_COOKIE); outrumor(bcsign(scroll), BY_COOKIE);
@@ -251,16 +254,16 @@ doread()
u.uconduct.literate++; u.uconduct.literate++;
useup(scroll); useup(scroll);
return 1; return 1;
} else if (scroll->otyp == T_SHIRT || scroll->otyp == ALCHEMY_SMOCK) { } else if (otyp == T_SHIRT || otyp == ALCHEMY_SMOCK) {
char buf[BUFSZ], *mesg; char buf[BUFSZ], *mesg;
const char *endpunct; const char *endpunct;
if (Blind) { if (Blind) {
You_cant("feel any Braille writing."); You_cant(find_any_braille);
return 0; return 0;
} }
/* can't read shirt worn under suit (under cloak is ok though) */ /* can't read shirt worn under suit (under cloak is ok though) */
if (scroll->otyp == T_SHIRT && uarm && scroll == uarmu) { if (otyp == T_SHIRT && uarm && scroll == uarmu) {
pline("%s shirt is obscured by %s%s.", pline("%s shirt is obscured by %s%s.",
scroll->unpaid ? "That" : "Your", shk_your(buf, uarm), scroll->unpaid ? "That" : "Your", shk_your(buf, uarm),
suit_simple_name(uarm)); suit_simple_name(uarm));
@@ -268,8 +271,8 @@ doread()
} }
u.uconduct.literate++; u.uconduct.literate++;
/* populate 'buf[]' */ /* populate 'buf[]' */
mesg = (scroll->otyp == T_SHIRT) ? tshirt_text(scroll, buf) mesg = (otyp == T_SHIRT) ? tshirt_text(scroll, buf)
: apron_text(scroll, buf); : apron_text(scroll, buf);
endpunct = ""; endpunct = "";
if (flags.verbose) { if (flags.verbose) {
int ln = (int) strlen(mesg); int ln = (int) strlen(mesg);
@@ -281,7 +284,37 @@ doread()
} }
pline("\"%s\"%s", mesg, endpunct); pline("\"%s\"%s", mesg, endpunct);
return 1; return 1;
} else if (scroll->otyp == CREDIT_CARD) { } else if ((otyp == DUNCE_CAP || otyp == CORNUTHAUM)
/* note: "DUNCE" isn't directly connected to tourists but
if everyone could read it, they would always be able to
trivially distinguish between the two types of conical hat;
limiting this to tourists is better than rejecting it */
&& Role_if(PM_TOURIST)) {
/* another note: the misspelling, "wizzard", is correct;
that's what is written on Rincewind's pointy hat from
Pratchett's Discworld series, along with a lot of stars;
rather than inked on or painted on, treat them as stitched
or even separate pieces of fabric which have been attached
(don't recall whether the books mention anything like that...) */
const char *cap_text = (otyp == DUNCE_CAP) ? "DUNCE" : "WIZZARD";
if (scroll->o_id % 3) {
/* no need to vary this when blind; "on this ___" is important
because it suggests that there might be something on others */
You_cant("find anything to read on this %s.",
simpleonames(scroll));
return 0;
}
pline("%s on the %s. It reads: %s.",
!Blind ? "There is writing" : "You feel lettering",
simpleonames(scroll), cap_text);
u.uconduct.literate++;
/* yet another note: despite the fact that player will recognize
the object type, don't make it become a discovery for hero */
if (!objects[otyp].oc_name_known && !objects[otyp].oc_uname)
docall(scroll);
return 1;
} else if (otyp == CREDIT_CARD) {
static const char *card_msgs[] = { static const char *card_msgs[] = {
"Leprechaun Gold Tru$t - Shamrock Card", "Leprechaun Gold Tru$t - Shamrock Card",
"Magic Memory Vault Charge Card", "Magic Memory Vault Charge Card",
@@ -320,12 +353,12 @@ doread()
(flags.verbose || Blind) ? "." : ""); (flags.verbose || Blind) ? "." : "");
u.uconduct.literate++; u.uconduct.literate++;
return 1; return 1;
} else if (scroll->otyp == CAN_OF_GREASE) { } else if (otyp == CAN_OF_GREASE) {
pline("This %s has no label.", singular(scroll, xname)); pline("This %s has no label.", singular(scroll, xname));
return 0; return 0;
} else if (scroll->otyp == MAGIC_MARKER) { } else if (otyp == MAGIC_MARKER) {
if (Blind) { if (Blind) {
You_cant("feel any Braille writing."); You_cant(find_any_braille);
return 0; return 0;
} }
if (flags.verbose) if (flags.verbose)
@@ -349,11 +382,11 @@ doread()
pline("\"Odin.\""); pline("\"Odin.\"");
u.uconduct.literate++; u.uconduct.literate++;
return 1; return 1;
} else if (scroll->otyp == CANDY_BAR) { } else if (otyp == CANDY_BAR) {
const char *wrapper = candy_wrapper_text(scroll); const char *wrapper = candy_wrapper_text(scroll);
if (Blind) { if (Blind) {
You_cant("feel any Braille writing."); You_cant(find_any_braille);
return 0; return 0;
} }
if (!*wrapper) { if (!*wrapper) {
@@ -367,10 +400,10 @@ doread()
&& scroll->oclass != SPBOOK_CLASS) { && scroll->oclass != SPBOOK_CLASS) {
pline(silly_thing_to, "read"); pline(silly_thing_to, "read");
return 0; return 0;
} else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) { } else if (Blind && otyp != SPE_BOOK_OF_THE_DEAD) {
const char *what = 0; const char *what = 0;
if (scroll->otyp == SPE_NOVEL) if (otyp == SPE_NOVEL)
/* unseen novels are already distinguishable from unseen /* unseen novels are already distinguishable from unseen
spellbooks so this isn't revealing any extra information */ spellbooks so this isn't revealing any extra information */
what = "words"; what = "words";
@@ -386,7 +419,7 @@ doread()
confused = (Confusion != 0); confused = (Confusion != 0);
#ifdef MAIL #ifdef MAIL
if (scroll->otyp == SCR_MAIL) { if (otyp == SCR_MAIL) {
confused = FALSE; /* override */ confused = FALSE; /* override */
/* reading mail is a convenience for the player and takes /* reading mail is a convenience for the player and takes
place outside the game, so shouldn't affect gameplay; place outside the game, so shouldn't affect gameplay;
@@ -405,24 +438,22 @@ doread()
#endif #endif
/* Actions required to win the game aren't counted towards conduct */ /* Actions required to win the game aren't counted towards conduct */
/* Novel conduct is handled in read_tribute so exclude it too*/ /* Novel conduct is handled in read_tribute so exclude it too */
if (scroll->otyp != SPE_BOOK_OF_THE_DEAD if (otyp != SPE_BOOK_OF_THE_DEAD && otyp != SPE_NOVEL
&& scroll->otyp != SPE_BLANK_PAPER && scroll->otyp != SCR_BLANK_PAPER && otyp != SPE_BLANK_PAPER && otyp != SCR_BLANK_PAPER)
&& scroll->otyp != SPE_NOVEL)
u.uconduct.literate++; u.uconduct.literate++;
if (scroll->oclass == SPBOOK_CLASS) { if (scroll->oclass == SPBOOK_CLASS) {
return study_book(scroll); return study_book(scroll);
} }
scroll->in_use = TRUE; /* scroll, not spellbook, now being read */ scroll->in_use = TRUE; /* scroll, not spellbook, now being read */
if (scroll->otyp != SCR_BLANK_PAPER) { if (otyp != SCR_BLANK_PAPER) {
boolean silently = !can_chant(&g.youmonst); boolean silently = !can_chant(&g.youmonst);
/* a few scroll feedback messages describe something happening /* a few scroll feedback messages describe something happening
to the scroll itself, so avoid "it disappears" for those */ to the scroll itself, so avoid "it disappears" for those */
nodisappear = (scroll->otyp == SCR_FIRE nodisappear = (otyp == SCR_FIRE
|| (scroll->otyp == SCR_REMOVE_CURSE || (otyp == SCR_REMOVE_CURSE && scroll->cursed));
&& scroll->cursed));
if (Blind) if (Blind)
pline(nodisappear pline(nodisappear
? "You %s the formula on the scroll." ? "You %s the formula on the scroll."
@@ -440,14 +471,14 @@ doread()
} }
} }
if (!seffects(scroll)) { if (!seffects(scroll)) {
if (!objects[scroll->otyp].oc_name_known) { if (!objects[otyp].oc_name_known) {
if (g.known) if (g.known)
learnscroll(scroll); learnscroll(scroll);
else if (!objects[scroll->otyp].oc_uname) else if (!objects[otyp].oc_uname)
docall(scroll); docall(scroll);
} }
scroll->in_use = FALSE; scroll->in_use = FALSE;
if (scroll->otyp != SCR_BLANK_PAPER) if (otyp != SCR_BLANK_PAPER)
useup(scroll); useup(scroll);
} }
return 1; return 1;