Options to create the character blind or nudist

For those pro players who really want to try their hand
at that zen samurai, without needing to reroll thousands
of times to start with blindfold.  Nudist starts without
any armor, and keeps tabs whether you wore any during
the game, for even more bragging rights.

Also makes the Book of the Dead readable even while
blind, for obvious reasons.
This commit is contained in:
Pasi Kallinen
2015-03-30 22:12:54 +03:00
parent e305b8a51e
commit 84a067a016
13 changed files with 40 additions and 3 deletions
+4
View File
@@ -1921,6 +1921,8 @@ quality of the weapon; you are free to manually fill your quiver or quiver sack
or make ready or make ready
with the `Q' command instead. If no weapon is found or the option is with the `Q' command instead. If no weapon is found or the option is
false, the `t' (throw) command is executed instead. (default false) false, the `t' (throw) command is executed instead. (default false)
.lp blind
Start the character permanently blind. (default false)
.lp bones .lp bones
Allow saving and loading bones files. (default true) Allow saving and loading bones files. (default true)
.lp boulder .lp boulder
@@ -2143,6 +2145,8 @@ Cannot be set with the `O' command.
Read the NetHack news file, if present (default on). Read the NetHack news file, if present (default on).
Since the news is shown at the beginning of the game, there's no point Since the news is shown at the beginning of the game, there's no point
in setting this with the `O' command. in setting this with the `O' command.
.lp nudist
Start the character with no armor (default false).
.lp "null " .lp "null "
Send padding nulls to the terminal (default on). Send padding nulls to the terminal (default on).
.lp number_pad .lp number_pad
+6
View File
@@ -2322,6 +2322,9 @@ or make ready
with the `Q' command instead. If no weapon is found or the option is with the `Q' command instead. If no weapon is found or the option is
false, the `t' (throw) command is executed instead. (default false) false, the `t' (throw) command is executed instead. (default false)
%.lp %.lp
\item[\ib{blind}]
Start the character permanently blind. (default false)
%.lp
\item[\ib{bones}] \item[\ib{bones}]
Allow saving and loading bones files. (default true) Allow saving and loading bones files. (default true)
%.lp %.lp
@@ -2576,6 +2579,9 @@ Read the {\it NetHack\/} news file, if present (default on).
Since the news is shown at the beginning of the game, there's no point Since the news is shown at the beginning of the game, there's no point
in setting this with the `{\tt O}' command. in setting this with the `{\tt O}' command.
%.lp %.lp
\item[\ib{nudist}]
Start the character with no armor (default false).
%.lp
\item[\ib{null}] \item[\ib{null}]
Send padding nulls to the terminal (default on). Send padding nulls to the terminal (default on).
%.lp %.lp
+1
View File
@@ -1109,6 +1109,7 @@ when you're hiding under something a zap downward should not hit that
something, while a zap upward should something, while a zap upward should
show more explicit reason why player was helpless at death show more explicit reason why player was helpless at death
added new hallucinatory-only gods added new hallucinatory-only gods
options to create the character blind or nudist
Platform- and/or Interface-Specific New Features Platform- and/or Interface-Specific New Features
+1 -1
View File
@@ -14,7 +14,7 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones * Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files. * and save files.
*/ */
#define EDITLEVEL 59 #define EDITLEVEL 60
#define COPYRIGHT_BANNER_A \ #define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2015" "NetHack, Copyright 1985-2015"
+6
View File
@@ -92,6 +92,11 @@ struct u_conduct { /* number of times... */
/* genocides already listed at end of game */ /* genocides already listed at end of game */
}; };
struct u_roleplay {
boolean blind; /* permanently blind */
boolean nudist; /* has not worn any armor, ever */
};
/*** Unified structure containing role information ***/ /*** Unified structure containing role information ***/
struct Role { struct Role {
/*** Strings that name various things ***/ /*** Strings that name various things ***/
@@ -330,6 +335,7 @@ struct you {
struct u_event uevent; /* certain events have happened */ struct u_event uevent; /* certain events have happened */
struct u_have uhave; /* you're carrying special objects */ struct u_have uhave; /* you're carrying special objects */
struct u_conduct uconduct; /* KMH, conduct */ struct u_conduct uconduct; /* KMH, conduct */
struct u_roleplay uroleplay;
struct attribs acurr, /* your current attributes (eg. str)*/ struct attribs acurr, /* your current attributes (eg. str)*/
aexe, /* for gain/loss via "exercise" */ aexe, /* for gain/loss via "exercise" */
abon, /* your bonus attributes (eg. str) */ abon, /* your bonus attributes (eg. str) */
+1 -1
View File
@@ -91,7 +91,7 @@
#define Blinded u.uprops[BLINDED].intrinsic #define Blinded u.uprops[BLINDED].intrinsic
#define Blindfolded (ublindf && ublindf->otyp != LENSES) #define Blindfolded (ublindf && ublindf->otyp != LENSES)
/* ...means blind because of a cover */ /* ...means blind because of a cover */
#define Blind ((Blinded || Blindfolded || !haseyes(youmonst.data)) && \ #define Blind ((u.uroleplay.blind || Blinded || Blindfolded || !haseyes(youmonst.data)) && \
!(ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD)) !(ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD))
/* ...the Eyes operate even when you really are blind /* ...the Eyes operate even when you really are blind
or don't have any eyes */ or don't have any eyes */
+2
View File
@@ -691,6 +691,8 @@ int propidx; /* special cases can have negative values */
Sprintf(buf, because_of, Sprintf(buf, because_of,
obj->oartifact ? bare_artifactname(obj) : obj->oartifact ? bare_artifactname(obj) :
ysimple_name(obj)); ysimple_name(obj));
else if (propidx == BLINDED && u.uroleplay.blind)
Sprintf(buf, " from birth");
else if (propidx == BLINDED && Blindfolded_only) else if (propidx == BLINDED && Blindfolded_only)
Sprintf(buf, because_of, ysimple_name(ublindf)); Sprintf(buf, because_of, ysimple_name(ublindf));
+3
View File
@@ -2246,6 +2246,9 @@ int final;
en_win = create_nhwindow(NHW_MENU); en_win = create_nhwindow(NHW_MENU);
putstr(en_win, 0, "Voluntary challenges:"); putstr(en_win, 0, "Voluntary challenges:");
if (u.uroleplay.blind) you_have_been("blind from birth");
if (u.uroleplay.nudist) you_have_been("faithfully nudist");
if (!u.uconduct.food) if (!u.uconduct.food)
enl_msg(You_, "have gone", "went", " without food", ""); enl_msg(You_, "have gone", "went", " without food", "");
/* But beverages are okay */ /* But beverages are okay */
+2
View File
@@ -85,6 +85,7 @@ static struct Bool_Opt
#else #else
{"BIOS", (boolean *)0, FALSE, SET_IN_FILE}, {"BIOS", (boolean *)0, FALSE, SET_IN_FILE},
#endif #endif
{"blind", &u.uroleplay.blind, FALSE, DISP_IN_GAME},
{"bones", &flags.bones, TRUE, SET_IN_FILE}, {"bones", &flags.bones, TRUE, SET_IN_FILE},
#ifdef INSURANCE #ifdef INSURANCE
{"checkpoint", &flags.ins_chkpt, TRUE, SET_IN_GAME}, {"checkpoint", &flags.ins_chkpt, TRUE, SET_IN_GAME},
@@ -149,6 +150,7 @@ static struct Bool_Opt
#else #else
{"news", (boolean *)0, FALSE, SET_IN_FILE}, {"news", (boolean *)0, FALSE, SET_IN_FILE},
#endif #endif
{"nudist", &u.uroleplay.nudist, FALSE, DISP_IN_GAME},
{"null", &flags.null, TRUE, SET_IN_GAME}, {"null", &flags.null, TRUE, SET_IN_GAME},
#if defined(SYSFLAGS) && defined(MAC) #if defined(SYSFLAGS) && defined(MAC)
{"page_wait", &sysflags.page_wait, TRUE, SET_IN_GAME}, {"page_wait", &sysflags.page_wait, TRUE, SET_IN_GAME},
+1 -1
View File
@@ -287,7 +287,7 @@ 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) { } else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) {
const char *what = 0; const char *what = 0;
if (scroll->oclass == SPBOOK_CLASS) if (scroll->oclass == SPBOOK_CLASS)
what = "mystic runes"; what = "mystic runes";
+2
View File
@@ -397,6 +397,8 @@ encodeachieve()
if(u.uachieve.mines_luckstone) r |= 1L << 9; if(u.uachieve.mines_luckstone) r |= 1L << 9;
if(u.uachieve.finish_sokoban) r |= 1L << 10; if(u.uachieve.finish_sokoban) r |= 1L << 10;
if(u.uachieve.killed_medusa) r |= 1L << 11; if(u.uachieve.killed_medusa) r |= 1L << 11;
if(u.uroleplay.blind) r |= 1L << 12;
if(u.uroleplay.nudist) r |= 1L << 13;
return r; return r;
} }
+10
View File
@@ -491,6 +491,7 @@ void
u_init() u_init()
{ {
register int i; register int i;
struct u_roleplay tmpuroleplay = u.uroleplay; /* these set by rcfile options */
flags.female = flags.initgend; flags.female = flags.initgend;
flags.beginner = 1; flags.beginner = 1;
@@ -502,6 +503,8 @@ u_init()
(void) memset((genericptr_t)&ubirthday, 0, sizeof(ubirthday)); (void) memset((genericptr_t)&ubirthday, 0, sizeof(ubirthday));
(void) memset((genericptr_t)&urealtime, 0, sizeof(urealtime)); (void) memset((genericptr_t)&urealtime, 0, sizeof(urealtime));
u.uroleplay = tmpuroleplay; /* restore options set via rcfile */
#if 0 /* documentation of more zero values as desirable */ #if 0 /* documentation of more zero values as desirable */
u.usick_cause[0] = 0; u.usick_cause[0] = 0;
u.uluck = u.moreluck = 0; u.uluck = u.moreluck = 0;
@@ -922,6 +925,13 @@ register struct trobj *trop;
nocreate4 = otyp; nocreate4 = otyp;
} }
/* nudist gets no armor */
if (u.uroleplay.nudist && obj->oclass == ARMOR_CLASS) {
dealloc_obj(obj);
trop++;
continue;
}
if (trop->trclass == COIN_CLASS) { if (trop->trclass == COIN_CLASS) {
/* no "blessed" or "identified" money */ /* no "blessed" or "identified" money */
obj->quan = u.umoney0; obj->quan = u.umoney0;
+1
View File
@@ -57,6 +57,7 @@ long mask;
uskin = obj; uskin = obj;
/* assert( !uarm ); */ /* assert( !uarm ); */
} else { } else {
if ((mask & W_ARMOR)) u.uroleplay.nudist = FALSE;
for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) { for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) {
oobj = *(wp->w_obj); oobj = *(wp->w_obj);
if(oobj && !(oobj->owornmask & wp->w_mask)) if(oobj && !(oobj->owornmask & wp->w_mask))