From: Pasi Kallinen Date: Mon, 30 Mar 2015 19:09:20 +0000 (+0300) Subject: Options to create the character blind or nudist X-Git-Tag: NetHack-3.6.0_RC01~508 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=84a067a0162187383d0551aa5d4e130874b7bc57;p=nethack 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. --- diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index 496d588de..df7301a81 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -1921,6 +1921,8 @@ quality of the weapon; you are free to manually fill your quiver or quiver sack or make ready with the `Q' command instead. If no weapon is found or the option is false, the `t' (throw) command is executed instead. (default false) +.lp blind +Start the character permanently blind. (default false) .lp bones Allow saving and loading bones files. (default true) .lp boulder @@ -2143,6 +2145,8 @@ Cannot be set with the `O' command. Read the NetHack news file, if present (default on). Since the news is shown at the beginning of the game, there's no point in setting this with the `O' command. +.lp nudist +Start the character with no armor (default false). .lp "null " Send padding nulls to the terminal (default on). .lp number_pad diff --git a/doc/Guidebook.tex b/doc/Guidebook.tex index 6c3ccbded..7c2464664 100644 --- a/doc/Guidebook.tex +++ b/doc/Guidebook.tex @@ -2322,6 +2322,9 @@ or make ready with the `Q' command instead. If no weapon is found or the option is false, the `t' (throw) command is executed instead. (default false) %.lp +\item[\ib{blind}] +Start the character permanently blind. (default false) +%.lp \item[\ib{bones}] Allow saving and loading bones files. (default true) %.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 in setting this with the `{\tt O}' command. %.lp +\item[\ib{nudist}] +Start the character with no armor (default false). +%.lp \item[\ib{null}] Send padding nulls to the terminal (default on). %.lp diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 507480768..b5dfeea67 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -1109,6 +1109,7 @@ when you're hiding under something a zap downward should not hit that something, while a zap upward should show more explicit reason why player was helpless at death added new hallucinatory-only gods +options to create the character blind or nudist Platform- and/or Interface-Specific New Features diff --git a/include/patchlevel.h b/include/patchlevel.h index 1b0ebf241..f4281139e 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -14,7 +14,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 59 +#define EDITLEVEL 60 #define COPYRIGHT_BANNER_A \ "NetHack, Copyright 1985-2015" diff --git a/include/you.h b/include/you.h index 0fc5c6073..a69fe4de3 100644 --- a/include/you.h +++ b/include/you.h @@ -92,6 +92,11 @@ struct u_conduct { /* number of times... */ /* 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 ***/ struct Role { /*** Strings that name various things ***/ @@ -330,6 +335,7 @@ struct you { struct u_event uevent; /* certain events have happened */ struct u_have uhave; /* you're carrying special objects */ struct u_conduct uconduct; /* KMH, conduct */ + struct u_roleplay uroleplay; struct attribs acurr, /* your current attributes (eg. str)*/ aexe, /* for gain/loss via "exercise" */ abon, /* your bonus attributes (eg. str) */ diff --git a/include/youprop.h b/include/youprop.h index 1dfe3a9e9..cdecb6c82 100644 --- a/include/youprop.h +++ b/include/youprop.h @@ -91,7 +91,7 @@ #define Blinded u.uprops[BLINDED].intrinsic #define Blindfolded (ublindf && ublindf->otyp != LENSES) /* ...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)) /* ...the Eyes operate even when you really are blind or don't have any eyes */ diff --git a/src/attrib.c b/src/attrib.c index b9ce67596..f7af4fee8 100644 --- a/src/attrib.c +++ b/src/attrib.c @@ -691,6 +691,8 @@ int propidx; /* special cases can have negative values */ Sprintf(buf, because_of, obj->oartifact ? bare_artifactname(obj) : ysimple_name(obj)); + else if (propidx == BLINDED && u.uroleplay.blind) + Sprintf(buf, " from birth"); else if (propidx == BLINDED && Blindfolded_only) Sprintf(buf, because_of, ysimple_name(ublindf)); diff --git a/src/cmd.c b/src/cmd.c index 5d9bcfc27..51bc10896 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -2246,6 +2246,9 @@ int final; en_win = create_nhwindow(NHW_MENU); 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) enl_msg(You_, "have gone", "went", " without food", ""); /* But beverages are okay */ diff --git a/src/options.c b/src/options.c index e1ff15ff0..742958fc3 100644 --- a/src/options.c +++ b/src/options.c @@ -85,6 +85,7 @@ static struct Bool_Opt #else {"BIOS", (boolean *)0, FALSE, SET_IN_FILE}, #endif + {"blind", &u.uroleplay.blind, FALSE, DISP_IN_GAME}, {"bones", &flags.bones, TRUE, SET_IN_FILE}, #ifdef INSURANCE {"checkpoint", &flags.ins_chkpt, TRUE, SET_IN_GAME}, @@ -149,6 +150,7 @@ static struct Bool_Opt #else {"news", (boolean *)0, FALSE, SET_IN_FILE}, #endif + {"nudist", &u.uroleplay.nudist, FALSE, DISP_IN_GAME}, {"null", &flags.null, TRUE, SET_IN_GAME}, #if defined(SYSFLAGS) && defined(MAC) {"page_wait", &sysflags.page_wait, TRUE, SET_IN_GAME}, diff --git a/src/read.c b/src/read.c index 9d8cac038..3ad28e8aa 100644 --- a/src/read.c +++ b/src/read.c @@ -287,7 +287,7 @@ doread() && scroll->oclass != SPBOOK_CLASS) { pline(silly_thing_to, "read"); return(0); - } else if (Blind) { + } else if (Blind && (scroll->otyp != SPE_BOOK_OF_THE_DEAD)) { const char *what = 0; if (scroll->oclass == SPBOOK_CLASS) what = "mystic runes"; diff --git a/src/topten.c b/src/topten.c index 19eaa2ed2..48c69cb8e 100644 --- a/src/topten.c +++ b/src/topten.c @@ -397,6 +397,8 @@ encodeachieve() if(u.uachieve.mines_luckstone) r |= 1L << 9; if(u.uachieve.finish_sokoban) r |= 1L << 10; if(u.uachieve.killed_medusa) r |= 1L << 11; + if(u.uroleplay.blind) r |= 1L << 12; + if(u.uroleplay.nudist) r |= 1L << 13; return r; } diff --git a/src/u_init.c b/src/u_init.c index 79954841c..3c32637dd 100644 --- a/src/u_init.c +++ b/src/u_init.c @@ -491,6 +491,7 @@ void u_init() { register int i; + struct u_roleplay tmpuroleplay = u.uroleplay; /* these set by rcfile options */ flags.female = flags.initgend; flags.beginner = 1; @@ -502,6 +503,8 @@ u_init() (void) memset((genericptr_t)&ubirthday, 0, sizeof(ubirthday)); (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 */ u.usick_cause[0] = 0; u.uluck = u.moreluck = 0; @@ -922,6 +925,13 @@ register struct trobj *trop; nocreate4 = otyp; } + /* nudist gets no armor */ + if (u.uroleplay.nudist && obj->oclass == ARMOR_CLASS) { + dealloc_obj(obj); + trop++; + continue; + } + if (trop->trclass == COIN_CLASS) { /* no "blessed" or "identified" money */ obj->quan = u.umoney0; diff --git a/src/worn.c b/src/worn.c index 70ba11b3a..b810332ea 100644 --- a/src/worn.c +++ b/src/worn.c @@ -57,6 +57,7 @@ long mask; uskin = obj; /* assert( !uarm ); */ } else { + if ((mask & W_ARMOR)) u.uroleplay.nudist = FALSE; for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) { oobj = *(wp->w_obj); if(oobj && !(oobj->owornmask & wp->w_mask))