Merge remote-tracking branch 'origin/NetHack-3.6.0'

This commit is contained in:
keni
2017-11-19 20:41:52 -05:00
15 changed files with 234 additions and 176 deletions

View File

@@ -437,6 +437,7 @@ fix buffer overflow in wizard mode for '#' command when 'extmenu' option is on
"you suddenly vomit" was given two turns before actually vomiting, so you "you suddenly vomit" was given two turns before actually vomiting, so you
could get that message, move a bit, then get "you can move again" could get that message, move a bit, then get "you can move again"
after the 2 turn freeze applied along with the actual vomit after the 2 turn freeze applied along with the actual vomit
give an alternate message if you vomit when stomach is empty (ie, fainting)
corpses and other flammable items not subject to direct burning or fire-based corpses and other flammable items not subject to direct burning or fire-based
erosion which were thrown or dropped into lava remained intact erosion which were thrown or dropped into lava remained intact
if a potion on the floor survived a land mine explosion and got propelled at if a potion on the floor survived a land mine explosion and got propelled at
@@ -471,6 +472,7 @@ charisma affects the leeway in demon lord bribes
make Vlad slightly tougher make Vlad slightly tougher
reduce the amount of gold laying on the floor reduce the amount of gold laying on the floor
locked chests and large boxes contain more stuff locked chests and large boxes contain more stuff
make shopkeepers bill hero for burying merchandise
Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository Fixes to Post-3.6.0 Problems that Were Exposed Via git Repository
@@ -556,6 +558,7 @@ tty: if "--More--" was written to leftmost column (beginning of second line)
tty: long message lines which wrap when shown on the top line might be tty: long message lines which wrap when shown on the top line might be
re-displayed incorrectly by ^P for msg_window={full,combo,reverse} re-displayed incorrectly by ^P for msg_window={full,combo,reverse}
tty: MSGTYPE=hide could interfere with display of prompts tty: MSGTYPE=hide could interfere with display of prompts
tty: treat carriage return as a newline for input text and --More-- prompts
unix/X11: in top level Makefile, some commented out definitions of VARDATND unix/X11: in top level Makefile, some commented out definitions of VARDATND
misspelled pilemark.xbm (as pilemark.xpm) misspelled pilemark.xbm (as pilemark.xpm)
unix: options file with CR+LF line ends and an invalid option line resulted in unix: options file with CR+LF line ends and an invalid option line resulted in

View File

@@ -1861,8 +1861,8 @@ struct obj *obj;
verbalize(you_buy_it); verbalize(you_buy_it);
useupf(corpse, 1L); useupf(corpse, 1L);
} }
can = hold_another_object(can, "You make, but cannot pick up, %s.", (void) hold_another_object(can, "You make, but cannot pick up, %s.",
doname(can), (const char *) 0); doname(can), (const char *) 0);
} else } else
impossible("Tinning failed."); impossible("Tinning failed.");
} }
@@ -2807,8 +2807,8 @@ struct obj *obj;
pline("Snatching %s is a fatal mistake.", kbuf); pline("Snatching %s is a fatal mistake.", kbuf);
instapetrify(kbuf); instapetrify(kbuf);
} }
otmp = hold_another_object( (void) hold_another_object(otmp, "You drop %s!",
otmp, "You drop %s!", doname(otmp), (const char *) 0); doname(otmp), (const char *) 0);
break; break;
default: default:
/* to floor beneath mon */ /* to floor beneath mon */

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 artifact.c $NHDT-Date: 1451081581 2015/12/25 22:13:01 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.99 $ */ /* NetHack 3.6 artifact.c $NHDT-Date: 1509836679 2017/11/04 23:04:39 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.106 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -1496,8 +1496,8 @@ struct obj *obj;
obj->age = 0; obj->age = 0;
return 0; return 0;
} }
b_effect = (obj->blessed b_effect = (obj->blessed && (oart->role == Role_switch
&& (Role_switch == oart->role || !oart->role)); || oart->role == NON_PM));
recharge(otmp, b_effect ? 1 : obj->cursed ? -1 : 0); recharge(otmp, b_effect ? 1 : obj->cursed ? -1 : 0);
update_inventory(); update_inventory();
break; break;

View File

@@ -1863,16 +1863,33 @@ bury_objs(x, y)
int x, y; int x, y;
{ {
struct obj *otmp, *otmp2; struct obj *otmp, *otmp2;
struct monst *shkp;
long loss = 0L;
boolean costly;
costly = ((shkp = shop_keeper(*in_rooms(x, y, SHOPBASE)))
&& costly_spot(x, y));
if (level.objects[x][y] != (struct obj *) 0) { if (level.objects[x][y] != (struct obj *) 0) {
debugpline2("bury_objs: at <%d,%d>", x, y); debugpline2("bury_objs: at <%d,%d>", x, y);
} }
for (otmp = level.objects[x][y]; otmp; otmp = otmp2) for (otmp = level.objects[x][y]; otmp; otmp = otmp2) {
if (costly) {
loss += stolen_value(otmp, x, y, (boolean) shkp->mpeaceful, TRUE);
if (otmp->oclass != COIN_CLASS)
otmp->no_charge = 1;
}
otmp2 = bury_an_obj(otmp, (boolean *) 0); otmp2 = bury_an_obj(otmp, (boolean *) 0);
}
/* don't expect any engravings here, but just in case */ /* don't expect any engravings here, but just in case */
del_engr_at(x, y); del_engr_at(x, y);
newsym(x, y); newsym(x, y);
if (costly && loss) {
You("owe %s %ld %s for burying merchandise.", mon_nam(shkp), loss,
currency(loss));
}
} }
/* move objects from buriedobjlist to fobj/nexthere lists */ /* move objects from buriedobjlist to fobj/nexthere lists */

View File

@@ -40,12 +40,12 @@ static void FDECL((*getpos_hilitefunc), (int)) = (void FDECL((*), (int))) 0;
static boolean FDECL((*getpos_getvalid), (int,int)) = (boolean FDECL((*), (int,int))) 0; static boolean FDECL((*getpos_getvalid), (int,int)) = (boolean FDECL((*), (int,int))) 0;
void void
getpos_sethilite(f, d) getpos_sethilite(gp_hilitef, gp_getvalidf)
void FDECL((*f), (int)); void FDECL((*gp_hilitef), (int));
boolean FDECL((*d), (int,int)); boolean FDECL((*gp_getvalidf), (int,int));
{ {
getpos_hilitefunc = f; getpos_hilitefunc = gp_hilitef;
getpos_getvalid = d; getpos_getvalid = gp_getvalidf;
} }
const char *const gloc_descr[NUM_GLOCS][4] = { const char *const gloc_descr[NUM_GLOCS][4] = {

View File

@@ -1616,6 +1616,8 @@ struct obj *otmp;
sick_time = (Sick > 1L) ? Sick - 1L : 1L; sick_time = (Sick > 1L) ? Sick - 1L : 1L;
make_sick(sick_time, corpse_xname(otmp, "rotted", CXN_NORMAL), make_sick(sick_time, corpse_xname(otmp, "rotted", CXN_NORMAL),
TRUE, SICK_VOMITABLE); TRUE, SICK_VOMITABLE);
pline("(It must have died too long ago to be safe to eat.)");
} }
if (carried(otmp)) if (carried(otmp))
useup(otmp); useup(otmp);
@@ -3152,12 +3154,18 @@ skipfloor:
void void
vomit() /* A good idea from David Neves */ vomit() /* A good idea from David Neves */
{ {
if (cantvomit(youmonst.data)) if (cantvomit(youmonst.data)) {
/* doesn't cure food poisoning; message assumes that we aren't /* doesn't cure food poisoning; message assumes that we aren't
dealing with some esoteric body_part() */ dealing with some esoteric body_part() */
Your("jaw gapes convulsively."); Your("jaw gapes convulsively.");
else } else {
make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE); make_sick(0L, (char *) 0, TRUE, SICK_VOMITABLE);
/* if not enough in stomach to actually vomit then dry heave;
vomiting_dialog() gives a vomit message when its countdown
reaches 0, but only if u.uhs < FAINTING (and !cantvomit()) */
if (u.uhs >= FAINTING)
Your("%s heaves convulsively!", body_part(STOMACH));
}
/* nomul()/You_can_move_again used to be unconditional, which was /* nomul()/You_can_move_again used to be unconditional, which was
viable while eating but not for Vomiting countdown where hero might viable while eating but not for Vomiting countdown where hero might

View File

@@ -293,9 +293,11 @@ boolean incr; /* true iff via incremental experience growth */
u.uexp = newuexp(u.ulevel); u.uexp = newuexp(u.ulevel);
} }
++u.ulevel; ++u.ulevel;
pline("Welcome %sto experience level %d.",
u.ulevelmax < u.ulevel ? "" : "back ",
u.ulevel);
if (u.ulevelmax < u.ulevel) if (u.ulevelmax < u.ulevel)
u.ulevelmax = u.ulevel; u.ulevelmax = u.ulevel;
pline("Welcome to experience level %d.", u.ulevel);
adjabil(u.ulevel - 1, u.ulevel); /* give new intrinsics */ adjabil(u.ulevel - 1, u.ulevel); /* give new intrinsics */
reset_rndmonst(NON_PM); /* new monster selection */ reset_rndmonst(NON_PM); /* new monster selection */
} }

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 monst.c $NHDT-Date: 1451084423 2015/12/25 23:00:23 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.55 $ */ /* NetHack 3.6 monst.c $NHDT-Date: 1510531569 2017/11/13 00:06:09 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.59 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -2369,8 +2369,8 @@ struct permonst _mons2[] = {
M1_HUMANOID | M1_POIS | M1_SWIM, M1_HUMANOID | M1_POIS | M1_SWIM,
M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT,
M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE),
/* standard demons & devils /* standard demons & devils
*/ */
#define SEDUCTION_ATTACKS_YES \ #define SEDUCTION_ATTACKS_YES \
A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ A(ATTK(AT_BITE, AD_SSEX, 0, 0), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK) ATTK(AT_CLAW, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK)
@@ -2395,8 +2395,8 @@ struct permonst _mons2[] = {
MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE,
M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY),
/* Used by AD&D for a type of demon, originally one of the Furies */ /* Used by AD&D for a type of demon, originally one of the Furies
/* and spelled this way */ and spelled this way */
MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10),
(G_HELL | G_NOCORPSE | G_SGROUP | 2), (G_HELL | G_NOCORPSE | G_SGROUP | 2),
A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, A(ATTK(AT_WEAP, AD_DRST, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -2567,7 +2567,8 @@ struct permonst _mons2[] = {
M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_PNAME | M2_NASTY
| M2_PRINCE | M2_MALE, | M2_PRINCE | M2_MALE,
M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD), M3_WANTSAMUL | M3_INFRAVISIBLE | M3_INFRAVISION, HI_LORD),
/* Riders -- the Four Horsemen of the Apocalypse ("War" == player) /* Riders -- the Four Horsemen of the Apocalypse ("War" == player);
* depicted with '&' but do not have M2_DEMON set.
*/ */
MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN), MON("Death", S_DEMON, LVL(30, 12, -5, 100, 0), (G_UNIQ | G_NOGEN),
A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK, A(ATTK(AT_TUCH, AD_DETH, 8, 8), ATTK(AT_TUCH, AD_DETH, 8, 8), NO_ATTK,
@@ -2593,8 +2594,8 @@ struct permonst _mons2[] = {
M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL, M1_FLY | M1_HUMANOID | M1_REGEN | M1_SEE_INVIS | M1_TPORT_CNTRL,
M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY,
M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD), M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD),
/* other demons /* other demons
*/ */
#ifdef MAIL #ifdef MAIL
MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0), MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0),
(G_NOGEN | G_NOCORPSE), (G_NOGEN | G_NOCORPSE),
@@ -2711,14 +2712,12 @@ struct permonst _mons2[] = {
/* /*
* dummy monster needed for visual interface * dummy monster needed for visual interface
*/ * (marking it unique prevents figurines)
/* (marking it unique prevents figurines)
*/ */
MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0), MON("long worm tail", S_WORM_TAIL, LVL(0, 0, 0, 0, 0),
(G_NOGEN | G_NOCORPSE | G_UNIQ), (G_NOGEN | G_NOCORPSE | G_UNIQ),
A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), A(NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, CLR_BROWN), SIZ(0, 0, 0, 0), 0, 0, 0L, M2_NOPOLY, 0, CLR_BROWN),
/* Note: /* Note:
* Worm tail must be between the normal monsters and the special * Worm tail must be between the normal monsters and the special
* quest & pseudo-character ones because an optimization in the * quest & pseudo-character ones because an optimization in the
@@ -2862,8 +2861,8 @@ struct permonst _mons2[] = {
| M2_COLLECT | M2_MAGIC, | M2_COLLECT | M2_MAGIC,
M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), M3_CLOSE | M3_INFRAVISIBLE, HI_LORD),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
/* Two for elves - one of each sex. /* Two for elves - one of each sex.
*/ */
MON("Earendil", S_HUMAN, MON("Earendil", S_HUMAN,
LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), A(ATTK(AT_WEAP, AD_PHYS, 1, 8),

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 options.c $NHDT-Date: 1508827592 2017/10/24 06:46:32 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.316 $ */ /* NetHack 3.6 options.c $NHDT-Date: 1510963525 2017/11/18 00:05:25 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.319 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -106,8 +106,7 @@ static struct Bool_Opt {
#endif #endif
{ "confirm", &flags.confirm, TRUE, SET_IN_GAME }, { "confirm", &flags.confirm, TRUE, SET_IN_GAME },
{ "dark_room", &flags.dark_room, TRUE, SET_IN_GAME }, { "dark_room", &flags.dark_room, TRUE, SET_IN_GAME },
{ "eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, { "eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, SET_IN_GAME }, /*WC*/
SET_IN_GAME }, /*WC*/
#ifdef TTY_GRAPHICS #ifdef TTY_GRAPHICS
{ "extmenu", &iflags.extmenu, FALSE, SET_IN_GAME }, { "extmenu", &iflags.extmenu, FALSE, SET_IN_GAME },
#else #else
@@ -408,8 +407,9 @@ static struct Comp_Opt {
#endif #endif
{ "whatis_coord", "show coordinates when auto-describing cursor position", { "whatis_coord", "show coordinates when auto-describing cursor position",
1, SET_IN_GAME }, 1, SET_IN_GAME },
{ "whatis_filter", "filter coordinate locations when targeting next or previous", { "whatis_filter",
1, SET_IN_GAME }, "filter coordinate locations when targeting next or previous",
1, SET_IN_GAME },
{ "windowcolors", "the foreground/background colors of windows", /*WC*/ { "windowcolors", "the foreground/background colors of windows", /*WC*/
80, DISP_IN_GAME }, 80, DISP_IN_GAME },
{ "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME }, { "windowtype", "windowing system to use", WINTYPELEN, DISP_IN_GAME },
@@ -492,7 +492,8 @@ static const menu_cmd_t default_menu_cmd_info[] = {
{ "menu_deselect_all", MENU_UNSELECT_ALL, "Unselect all items" }, { "menu_deselect_all", MENU_UNSELECT_ALL, "Unselect all items" },
{ "menu_invert_all", MENU_INVERT_ALL, "Invert selection" }, { "menu_invert_all", MENU_INVERT_ALL, "Invert selection" },
{ "menu_select_page", MENU_SELECT_PAGE, "Select items in current page" }, { "menu_select_page", MENU_SELECT_PAGE, "Select items in current page" },
{ "menu_deselect_page", MENU_UNSELECT_PAGE, "Unselect items in current page" }, { "menu_deselect_page", MENU_UNSELECT_PAGE,
"Unselect items in current page" },
{ "menu_invert_page", MENU_INVERT_PAGE, "Invert current page selection" }, { "menu_invert_page", MENU_INVERT_PAGE, "Invert current page selection" },
{ "menu_search", MENU_SEARCH, "Search and toggle matching items" }, { "menu_search", MENU_SEARCH, "Search and toggle matching items" },
}; };
@@ -713,8 +714,8 @@ initoptions_init()
iflags.getpos_coords = GPCOORDS_NONE; iflags.getpos_coords = GPCOORDS_NONE;
/* hero's role, race, &c haven't been chosen yet */ /* hero's role, race, &c haven't been chosen yet */
flags.initrole = flags.initrace = flags.initgend = flags.initalign = flags.initrole = flags.initrace = flags.initgend = flags.initalign
ROLE_NONE; = ROLE_NONE;
/* Set the default monster and object class symbols. */ /* Set the default monster and object class symbols. */
init_symbols(); init_symbols();
@@ -1165,14 +1166,14 @@ int on_or_off;
/*-- ON --*/ /*-- ON --*/
if (iflags.opt_booldup) if (iflags.opt_booldup)
impossible("iflags.opt_booldup already on (memory leak)"); impossible("iflags.opt_booldup already on (memory leak)");
iflags.opt_booldup = (int *) alloc(SIZE(boolopt) * sizeof(int)); iflags.opt_booldup = (int *) alloc(SIZE(boolopt) * sizeof (int));
optptr = iflags.opt_booldup; optptr = iflags.opt_booldup;
for (k = 0; k < SIZE(boolopt); ++k) for (k = 0; k < SIZE(boolopt); ++k)
*optptr++ = 0; *optptr++ = 0;
if (iflags.opt_compdup) if (iflags.opt_compdup)
impossible("iflags.opt_compdup already on (memory leak)"); impossible("iflags.opt_compdup already on (memory leak)");
iflags.opt_compdup = (int *) alloc(SIZE(compopt) * sizeof(int)); iflags.opt_compdup = (int *) alloc(SIZE(compopt) * sizeof (int));
optptr = iflags.opt_compdup; optptr = iflags.opt_compdup;
for (k = 0; k < SIZE(compopt); ++k) for (k = 0; k < SIZE(compopt); ++k)
*optptr++ = 0; *optptr++ = 0;
@@ -1233,7 +1234,7 @@ int iscompound; /* 0 == boolean option, 1 == compound */
*/ */
#else /* !MAC */ #else /* !MAC */
config_error_add("%s option specified multiple times: %s", config_error_add("%s option specified multiple times: %s",
iscompound ? "compound" : "boolean", opts); iscompound ? "compound" : "boolean", opts);
#endif /* ?MAC */ #endif /* ?MAC */
return; return;
} }
@@ -1458,7 +1459,7 @@ const char *prompt;
static const struct { static const struct {
const char *name; const char *name;
const xchar msgtyp; xchar msgtyp;
const char *descr; const char *descr;
} msgtype_names[] = { } msgtype_names[] = {
{ "show", MSGTYP_NORMAL, "Show message normally" }, { "show", MSGTYP_NORMAL, "Show message normally" },
@@ -1514,11 +1515,9 @@ msgtype_add(typ, pattern)
int typ; int typ;
char *pattern; char *pattern;
{ {
struct plinemsg_type *tmp struct plinemsg_type
= (struct plinemsg_type *) alloc(sizeof (struct plinemsg_type)); *tmp = (struct plinemsg_type *) alloc(sizeof (struct plinemsg_type));
if (!tmp)
return FALSE;
tmp->msgtype = typ; tmp->msgtype = typ;
tmp->regex = regex_init(); tmp->regex = regex_init();
if (!regex_compile(pattern, tmp->regex)) { if (!regex_compile(pattern, tmp->regex)) {
@@ -1670,7 +1669,8 @@ const char *errmsg;
} }
if (!regex_compile(str, match)) { if (!regex_compile(str, match)) {
config_error_add("%s: %s", errmsg ? errmsg : re_error, regex_error_desc(match)); config_error_add("%s: %s", errmsg ? errmsg : re_error,
regex_error_desc(match));
retval = FALSE; retval = FALSE;
} }
regex_free(match); regex_free(match);
@@ -1901,7 +1901,7 @@ boolean tinitial, tfrom_file;
} }
if (strlen(opts) > BUFSZ / 2) { if (strlen(opts) > BUFSZ / 2) {
config_error_add("Option too long, max length is %i characters", config_error_add("Option too long, max length is %i characters",
(BUFSZ / 2)); (BUFSZ / 2));
return FALSE; return FALSE;
} }
@@ -2025,8 +2025,7 @@ boolean tinitial, tfrom_file;
/* We always check for duplicates on the remaining compound options, /* We always check for duplicates on the remaining compound options,
although individual option processing can choose to complain or not */ although individual option processing can choose to complain or not */
duplicate = duplicate = duplicate_opt_detection(opts, 1); /* 1: check compounds */
duplicate_opt_detection(opts, 1); /* 1 means check compounds */
fullname = "pettype"; fullname = "pettype";
if (match_optname(opts, fullname, 3, TRUE)) { if (match_optname(opts, fullname, 3, TRUE)) {
@@ -2485,7 +2484,8 @@ boolean tinitial, tfrom_file;
forig = fruit_from_name(pl_fruit, FALSE, (int *) 0); forig = fruit_from_name(pl_fruit, FALSE, (int *) 0);
if (!forig && fnum >= 100) { if (!forig && fnum >= 100) {
config_error_add("Doing that so many times isn't very fruitful."); config_error_add(
"Doing that so many times isn't very fruitful.");
return retval; return retval;
} }
} }
@@ -2681,6 +2681,7 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* WINCAP /* WINCAP
* align_message:[left|top|right|bottom] */ * align_message:[left|top|right|bottom] */
fullname = "align_message"; fullname = "align_message";
@@ -2707,7 +2708,8 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* the order to list the pack */
/* the order to list inventory */
fullname = "packorder"; fullname = "packorder";
if (match_optname(opts, fullname, 4, TRUE)) { if (match_optname(opts, fullname, 4, TRUE)) {
if (duplicate) if (duplicate)
@@ -2831,9 +2833,10 @@ boolean tinitial, tfrom_file;
} }
/* types of objects to pick up automatically */ /* types of objects to pick up automatically */
if (match_optname(opts, "pickup_types", 8, TRUE)) { fullname = "pickup_types";
if (match_optname(opts, fullname, 8, TRUE)) {
char ocl[MAXOCLASSES + 1], tbuf[MAXOCLASSES + 1], qbuf[QBUFSZ], char ocl[MAXOCLASSES + 1], tbuf[MAXOCLASSES + 1], qbuf[QBUFSZ],
abuf[BUFSZ]; abuf[BUFSZ];
int oc_sym; int oc_sym;
boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu; boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu;
@@ -2855,7 +2858,7 @@ boolean tinitial, tfrom_file;
if (flags.menu_style == MENU_TRADITIONAL if (flags.menu_style == MENU_TRADITIONAL
|| flags.menu_style == MENU_COMBINATION) { || flags.menu_style == MENU_COMBINATION) {
use_menu = FALSE; use_menu = FALSE;
Sprintf(qbuf, "New pickup_types: [%s am] (%s)", ocl, Sprintf(qbuf, "New %s: [%s am] (%s)", fullname, ocl,
*tbuf ? tbuf : "all"); *tbuf ? tbuf : "all");
getlin(qbuf, abuf); getlin(qbuf, abuf);
op = mungspaces(abuf); op = mungspaces(abuf);
@@ -2871,7 +2874,7 @@ boolean tinitial, tfrom_file;
} }
} }
if (negated) { if (negated) {
bad_negation("pickup_types", TRUE); bad_negation(fullname, TRUE);
return FALSE; return FALSE;
} }
while (*op == ' ') while (*op == ' ')
@@ -2890,8 +2893,7 @@ boolean tinitial, tfrom_file;
op++; op++;
} }
if (badopt) { if (badopt) {
config_error_add("Unknown %s parameter '%s'", config_error_add("Unknown %s parameter '%s'", fullname, op);
"pickup_types", op);
return FALSE; return FALSE;
} }
} }
@@ -3256,10 +3258,11 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* WINCAP /* WINCAP
* scroll_amount:nn */ * scroll_amount:nn */
fullname = "scroll_amount"; fullname = "scroll_amount";
if (match_optname(opts, fullname, sizeof("scroll_amount") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "scroll_amount" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
@@ -3271,10 +3274,11 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* WINCAP /* WINCAP
* scroll_margin:nn */ * scroll_margin:nn */
fullname = "scroll_margin"; fullname = "scroll_margin";
if (match_optname(opts, fullname, sizeof("scroll_margin") - 1, TRUE)) { if (match_optname(opts, fullname, sizeof "scroll_margin" - 1, TRUE)) {
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
op = string_for_opt(opts, negated); op = string_for_opt(opts, negated);
@@ -3286,6 +3290,7 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
fullname = "subkeyvalue"; fullname = "subkeyvalue";
if (match_optname(opts, fullname, 5, TRUE)) { if (match_optname(opts, fullname, 5, TRUE)) {
/* no duplicate complaint here */ /* no duplicate complaint here */
@@ -3302,6 +3307,7 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* WINCAP /* WINCAP
* tile_width:nn */ * tile_width:nn */
fullname = "tile_width"; fullname = "tile_width";
@@ -3346,6 +3352,7 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/* WINCAP /* WINCAP
* vary_msgcount:nn */ * vary_msgcount:nn */
fullname = "vary_msgcount"; fullname = "vary_msgcount";
@@ -3361,6 +3368,19 @@ boolean tinitial, tfrom_file;
} }
return retval; return retval;
} }
/*
* windowtype: option to choose the interface for binaries built
* with support for more than one interface (tty + X11, for instance).
*
* Ideally, 'windowtype' should be processed first, because it
* causes the wc_ and wc2_ flags to be set up.
* For user, making it be first in a config file is trivial, use
* OPTIONS=windowtype:Foo
* as the first non-comment line of the file.
* Making it first in NETHACKOPTIONS requires it to be at the _end_
* because option strings are processed from right to left.
*/
fullname = "windowtype"; fullname = "windowtype";
if (match_optname(opts, fullname, 3, TRUE)) { if (match_optname(opts, fullname, 3, TRUE)) {
if (duplicate) if (duplicate)
@@ -3370,6 +3390,7 @@ boolean tinitial, tfrom_file;
return FALSE; return FALSE;
} else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) {
char buf[WINTYPELEN]; char buf[WINTYPELEN];
nmcpy(buf, op, WINTYPELEN); nmcpy(buf, op, WINTYPELEN);
choose_windows(buf); choose_windows(buf);
} else } else
@@ -3385,6 +3406,7 @@ boolean tinitial, tfrom_file;
return FALSE; return FALSE;
} else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) {
char buf[WINTYPELEN]; char buf[WINTYPELEN];
nmcpy(buf, op, WINTYPELEN); nmcpy(buf, op, WINTYPELEN);
addto_windowchain(buf); addto_windowchain(buf);
} else } else
@@ -3452,6 +3474,7 @@ boolean tinitial, tfrom_file;
fullname = "menu_headings"; fullname = "menu_headings";
if (match_optname(opts, fullname, 12, TRUE)) { if (match_optname(opts, fullname, 12, TRUE)) {
int tmpattr; int tmpattr;
if (duplicate) if (duplicate)
complain_about_duplicate(opts, 1); complain_about_duplicate(opts, 1);
if (negated) { if (negated) {
@@ -3491,6 +3514,7 @@ boolean tinitial, tfrom_file;
return retval; return retval;
} }
} }
/* hilite fields in status prompt */ /* hilite fields in status prompt */
fullname = "hilite_status"; fullname = "hilite_status";
if (match_optname(opts, fullname, 13, TRUE)) { if (match_optname(opts, fullname, 13, TRUE)) {
@@ -3697,6 +3721,17 @@ boolean tinitial, tfrom_file;
if (boolopt[i].addr == &iflags.zerocomp) if (boolopt[i].addr == &iflags.zerocomp)
set_savepref(iflags.zerocomp ? "zerocomp" : "externalcomp"); set_savepref(iflags.zerocomp ? "zerocomp" : "externalcomp");
#endif #endif
if (boolopt[i].addr == &iflags.wc_ascii_map) {
/* toggling ascii_map; set tiled_map to its opposite;
what does it mean to turn off ascii map if tiled map
isn't supported? -- right now, we do nothing */
iflags.wc_tiled_map = negated;
} else if (boolopt[i].addr == &iflags.wc_tiled_map) {
/* toggling tiled_map; set ascii_map to its opposite;
as with ascii_map, what does it mean to turn off tiled
map if ascii map isn't supported? */
iflags.wc_ascii_map = negated;
}
/* only do processing below if setting with doset() */ /* only do processing below if setting with doset() */
if (initial) if (initial)
return retval; return retval;
@@ -3726,22 +3761,12 @@ boolean tinitial, tfrom_file;
vision_full_recalc = 1; /* delayed recalc */ vision_full_recalc = 1; /* delayed recalc */
if (iflags.use_color) if (iflags.use_color)
need_redraw = TRUE; /* darkroom refresh */ need_redraw = TRUE; /* darkroom refresh */
} else if (boolopt[i].addr == &iflags.wc_ascii_map) {
/* toggling ascii_map; set tiled_map to its opposite;
what does it mean to turn off ascii map if tiled map
isn't supported? -- right now, we do nothing */
iflags.wc_tiled_map = negated;
need_redraw = TRUE;
} else if (boolopt[i].addr == &iflags.wc_tiled_map) {
/* toggling tiled_map; set ascii_map to its opposite;
as with ascii_map, what does it mean to turn off tiled
map if ascii map isn't supported? */
iflags.wc_ascii_map = negated;
need_redraw = TRUE;
} else if (boolopt[i].addr == &flags.showrace } else if (boolopt[i].addr == &flags.showrace
|| boolopt[i].addr == &iflags.use_inverse || boolopt[i].addr == &iflags.use_inverse
|| boolopt[i].addr == &iflags.hilite_pile || boolopt[i].addr == &iflags.hilite_pile
|| boolopt[i].addr == &iflags.hilite_pet) { || boolopt[i].addr == &iflags.hilite_pet
|| boolopt[i].addr == &iflags.wc_ascii_map
|| boolopt[i].addr == &iflags.wc_tiled_map) {
need_redraw = TRUE; need_redraw = TRUE;
#ifdef STATUS_HILITES #ifdef STATUS_HILITES
} else if (boolopt[i].addr == &iflags.wc2_hitpointbar) { } else if (boolopt[i].addr == &iflags.wc2_hitpointbar) {
@@ -3886,8 +3911,10 @@ get_menu_cmd_key(ch)
char ch; char ch;
{ {
char *found = index(mapped_menu_op, ch); char *found = index(mapped_menu_op, ch);
if (found) { if (found) {
int idx = (int) (found - mapped_menu_op); int idx = (int) (found - mapped_menu_op);
ch = mapped_menu_cmds[idx]; ch = mapped_menu_cmds[idx];
} }
return ch; return ch;
@@ -3902,8 +3929,10 @@ map_menu_cmd(ch)
char ch; char ch;
{ {
char *found = index(mapped_menu_cmds, ch); char *found = index(mapped_menu_cmds, ch);
if (found) { if (found) {
int idx = (int) (found - mapped_menu_cmds); int idx = (int) (found - mapped_menu_cmds);
ch = mapped_menu_op[idx]; ch = mapped_menu_op[idx];
} }
return ch; return ch;
@@ -3919,6 +3948,7 @@ boolean dolist;
putstr(win, 0, "Menu control keys:"); putstr(win, 0, "Menu control keys:");
if (dolist) { if (dolist) {
int i; int i;
for (i = 0; i < SIZE(default_menu_cmd_info); i++) { for (i = 0; i < SIZE(default_menu_cmd_info); i++) {
Sprintf(buf, "%-8s %s", Sprintf(buf, "%-8s %s",
visctrl(get_menu_cmd_key(default_menu_cmd_info[i].cmd)), visctrl(get_menu_cmd_key(default_menu_cmd_info[i].cmd)),
@@ -4186,8 +4216,7 @@ doset() /* changing options via menu by Per Liboriussen */
any = zeroany; any = zeroany;
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED);
add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
"Other settings:", "Other settings:", MENU_UNSELECTED);
MENU_UNSELECTED);
for (i = 0; (name = othropt[i].name) != 0; i++) { for (i = 0; (name = othropt[i].name) != 0; i++) {
if ((is_wc_option(name) && !wc_supported(name)) if ((is_wc_option(name) && !wc_supported(name))
@@ -4216,7 +4245,8 @@ doset() /* changing options via menu by Per Liboriussen */
*/ */
for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) { for (pick_idx = 0; pick_idx < pick_cnt; ++pick_idx) {
opt_indx = pick_list[pick_idx].item.a_int - 1; opt_indx = pick_list[pick_idx].item.a_int - 1;
if (opt_indx < -1) opt_indx++; /* -1 offset for select_menu() */ if (opt_indx < -1)
opt_indx++; /* -1 offset for select_menu() */
if (opt_indx == OPT_OTHER_APEXC) { if (opt_indx == OPT_OTHER_APEXC) {
(void) special_handling("autopickup_exception", setinitial, (void) special_handling("autopickup_exception", setinitial,
fromfile); fromfile);
@@ -4342,6 +4372,7 @@ boolean setinitial, setfromfile;
if (!strcmp("menustyle", optname)) { if (!strcmp("menustyle", optname)) {
const char *style_name; const char *style_name;
menu_item *style_pick = (menu_item *) 0; menu_item *style_pick = (menu_item *) 0;
tmpwin = create_nhwindow(NHW_MENU); tmpwin = create_nhwindow(NHW_MENU);
start_menu(tmpwin); start_menu(tmpwin);
any = zeroany; any = zeroany;
@@ -4529,8 +4560,8 @@ boolean setinitial, setfromfile;
0, ATR_NONE, "compass ('east' or '3s' or '2n,4w')", 0, ATR_NONE, "compass ('east' or '3s' or '2n,4w')",
(gp == GPCOORDS_COMPASS) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_COMPASS) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_COMFULL; any.a_char = GPCOORDS_COMFULL;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, 0, ATR_NONE,
0, ATR_NONE, "full compass ('east' or '3south' or '2north,4west')", "full compass ('east' or '3south' or '2north,4west')",
(gp == GPCOORDS_COMFULL) ? MENU_SELECTED : MENU_UNSELECTED); (gp == GPCOORDS_COMFULL) ? MENU_SELECTED : MENU_UNSELECTED);
any.a_char = GPCOORDS_MAP; any.a_char = GPCOORDS_MAP;
add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP, add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP,
@@ -4596,7 +4627,7 @@ boolean setinitial, setfromfile;
0, ATR_NONE, "in same area", 0, ATR_NONE, "in same area",
(gf == GFILTER_AREA) ? MENU_SELECTED : MENU_UNSELECTED); (gf == GFILTER_AREA) ? MENU_SELECTED : MENU_UNSELECTED);
end_menu(tmpwin, end_menu(tmpwin,
"Select location filtering when going for next/previous map position:"); "Select location filtering when going for next/previous map position:");
if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &window_pick)) > 0) { if ((pick_cnt = select_menu(tmpwin, PICK_ONE, &window_pick)) > 0) {
iflags.getloc_filter = (window_pick[0].item.a_char - 1); iflags.getloc_filter = (window_pick[0].item.a_char - 1);
/* PICK_ONE doesn't unselect preselected entry when /* PICK_ONE doesn't unselect preselected entry when
@@ -4955,10 +4986,7 @@ boolean setinitial, setfromfile;
struct symsetentry *sl; struct symsetentry *sl;
int res, which_set, setcount = 0, chosen = -2; int res, which_set, setcount = 0, chosen = -2;
if (rogueflag) which_set = rogueflag ? ROGUESET : PRIMARY;
which_set = ROGUESET;
else
which_set = PRIMARY;
/* clear symset[].name as a flag to read_sym_file() to build list */ /* clear symset[].name as a flag to read_sym_file() to build list */
symset_name = symset[which_set].name; symset_name = symset[which_set].name;
@@ -5238,36 +5266,23 @@ char *buf;
Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj)); Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj));
else if (!strcmp(optname, "horsename")) else if (!strcmp(optname, "horsename"))
Sprintf(buf, "%s", horsename[0] ? horsename : none); Sprintf(buf, "%s", horsename[0] ? horsename : none);
else if (!strcmp(optname, "map_mode")) else if (!strcmp(optname, "map_mode")) {
i = iflags.wc_map_mode;
Sprintf(buf, "%s", Sprintf(buf, "%s",
iflags.wc_map_mode == MAP_MODE_TILES (i == MAP_MODE_TILES) ? "tiles"
? "tiles" : (i == MAP_MODE_ASCII4x6) ? "ascii4x6"
: iflags.wc_map_mode == MAP_MODE_ASCII4x6 : (i == MAP_MODE_ASCII6x8) ? "ascii6x8"
? "ascii4x6" : (i == MAP_MODE_ASCII8x8) ? "ascii8x8"
: iflags.wc_map_mode == MAP_MODE_ASCII6x8 : (i == MAP_MODE_ASCII16x8) ? "ascii16x8"
? "ascii6x8" : (i == MAP_MODE_ASCII7x12) ? "ascii7x12"
: iflags.wc_map_mode == MAP_MODE_ASCII8x8 : (i == MAP_MODE_ASCII8x12) ? "ascii8x12"
? "ascii8x8" : (i == MAP_MODE_ASCII16x12) ? "ascii16x12"
: iflags.wc_map_mode == MAP_MODE_ASCII16x8 : (i == MAP_MODE_ASCII12x16) ? "ascii12x16"
? "ascii16x8" : (i == MAP_MODE_ASCII10x18) ? "ascii10x18"
: iflags.wc_map_mode == MAP_MODE_ASCII7x12 : (i == MAP_MODE_ASCII_FIT_TO_SCREEN)
? "ascii7x12" ? "fit_to_screen"
: iflags.wc_map_mode == MAP_MODE_ASCII8x12 : defopt);
? "ascii8x12" } else if (!strcmp(optname, "menustyle"))
: iflags.wc_map_mode
== MAP_MODE_ASCII16x12
? "ascii16x12"
: iflags.wc_map_mode
== MAP_MODE_ASCII12x16
? "ascii12x16"
: iflags.wc_map_mode
== MAP_MODE_ASCII10x18
? "ascii10x18"
: iflags.wc_map_mode
== MAP_MODE_ASCII_FIT_TO_SCREEN
? "fit_to_screen"
: defopt);
else if (!strcmp(optname, "menustyle"))
Sprintf(buf, "%s", menutype[(int) flags.menu_style]); Sprintf(buf, "%s", menutype[(int) flags.menu_style]);
else if (!strcmp(optname, "menu_deselect_all")) else if (!strcmp(optname, "menu_deselect_all"))
Sprintf(buf, "%s", to_be_done); Sprintf(buf, "%s", to_be_done);
@@ -5299,13 +5314,10 @@ char *buf;
Sprintf(buf, "%u", iflags.msg_history); Sprintf(buf, "%u", iflags.msg_history);
#ifdef TTY_GRAPHICS #ifdef TTY_GRAPHICS
} else if (!strcmp(optname, "msg_window")) { } else if (!strcmp(optname, "msg_window")) {
Sprintf(buf, "%s", (iflags.prevmsg_window == 's') Sprintf(buf, "%s", (iflags.prevmsg_window == 's') ? "single"
? "single" : (iflags.prevmsg_window == 'c') ? "combination"
: (iflags.prevmsg_window == 'c') : (iflags.prevmsg_window == 'f') ? "full"
? "combination" : "reversed");
: (iflags.prevmsg_window == 'f')
? "full"
: "reversed");
#endif #endif
} else if (!strcmp(optname, "name")) { } else if (!strcmp(optname, "name")) {
Sprintf(buf, "%s", plname); Sprintf(buf, "%s", plname);
@@ -5589,8 +5601,9 @@ count_ape_maps(leave, grab)
int *leave, *grab; int *leave, *grab;
{ {
struct autopickup_exception *ape; struct autopickup_exception *ape;
int pass, totalapes, numapes[2] = { 0, 0 }; int pass, totalapes, numapes[2];
numapes[0] = numapes[1] = 0;
for (pass = AP_LEAVE; pass <= AP_GRAB; ++pass) { for (pass = AP_LEAVE; pass <= AP_GRAB; ++pass) {
ape = iflags.autopickup_exceptions[pass]; ape = iflags.autopickup_exceptions[pass];
while (ape) { while (ape) {
@@ -6075,53 +6088,56 @@ char *class_select;
return ret; return ret;
} }
struct wc_Opt wc_options[] = { { "ascii_map", WC_ASCII_MAP }, static struct wc_Opt wc_options[] = {
{ "color", WC_COLOR }, { "ascii_map", WC_ASCII_MAP },
{ "eight_bit_tty", WC_EIGHT_BIT_IN }, { "color", WC_COLOR },
{ "hilite_pet", WC_HILITE_PET }, { "eight_bit_tty", WC_EIGHT_BIT_IN },
{ "popup_dialog", WC_POPUP_DIALOG }, { "hilite_pet", WC_HILITE_PET },
{ "player_selection", WC_PLAYER_SELECTION }, { "popup_dialog", WC_POPUP_DIALOG },
{ "preload_tiles", WC_PRELOAD_TILES }, { "player_selection", WC_PLAYER_SELECTION },
{ "tiled_map", WC_TILED_MAP }, { "preload_tiles", WC_PRELOAD_TILES },
{ "tile_file", WC_TILE_FILE }, { "tiled_map", WC_TILED_MAP },
{ "tile_width", WC_TILE_WIDTH }, { "tile_file", WC_TILE_FILE },
{ "tile_height", WC_TILE_HEIGHT }, { "tile_width", WC_TILE_WIDTH },
{ "use_inverse", WC_INVERSE }, { "tile_height", WC_TILE_HEIGHT },
{ "align_message", WC_ALIGN_MESSAGE }, { "use_inverse", WC_INVERSE },
{ "align_status", WC_ALIGN_STATUS }, { "align_message", WC_ALIGN_MESSAGE },
{ "font_map", WC_FONT_MAP }, { "align_status", WC_ALIGN_STATUS },
{ "font_menu", WC_FONT_MENU }, { "font_map", WC_FONT_MAP },
{ "font_message", WC_FONT_MESSAGE }, { "font_menu", WC_FONT_MENU },
{ "font_message", WC_FONT_MESSAGE },
#if 0 #if 0
{"perm_invent", WC_PERM_INVENT}, {"perm_invent", WC_PERM_INVENT},
#endif #endif
{ "font_size_map", WC_FONTSIZ_MAP }, { "font_size_map", WC_FONTSIZ_MAP },
{ "font_size_menu", WC_FONTSIZ_MENU }, { "font_size_menu", WC_FONTSIZ_MENU },
{ "font_size_message", WC_FONTSIZ_MESSAGE }, { "font_size_message", WC_FONTSIZ_MESSAGE },
{ "font_size_status", WC_FONTSIZ_STATUS }, { "font_size_status", WC_FONTSIZ_STATUS },
{ "font_size_text", WC_FONTSIZ_TEXT }, { "font_size_text", WC_FONTSIZ_TEXT },
{ "font_status", WC_FONT_STATUS }, { "font_status", WC_FONT_STATUS },
{ "font_text", WC_FONT_TEXT }, { "font_text", WC_FONT_TEXT },
{ "map_mode", WC_MAP_MODE }, { "map_mode", WC_MAP_MODE },
{ "scroll_amount", WC_SCROLL_AMOUNT }, { "scroll_amount", WC_SCROLL_AMOUNT },
{ "scroll_margin", WC_SCROLL_MARGIN }, { "scroll_margin", WC_SCROLL_MARGIN },
{ "splash_screen", WC_SPLASH_SCREEN }, { "splash_screen", WC_SPLASH_SCREEN },
{ "vary_msgcount", WC_VARY_MSGCOUNT }, { "vary_msgcount", WC_VARY_MSGCOUNT },
{ "windowcolors", WC_WINDOWCOLORS }, { "windowcolors", WC_WINDOWCOLORS },
{ "mouse_support", WC_MOUSE_SUPPORT }, { "mouse_support", WC_MOUSE_SUPPORT },
{ (char *) 0, 0L } }; { (char *) 0, 0L }
};
struct wc_Opt wc2_options[] = { { "fullscreen", WC2_FULLSCREEN }, static struct wc_Opt wc2_options[] = {
{ "softkeyboard", WC2_SOFTKEYBOARD }, { "fullscreen", WC2_FULLSCREEN },
{ "wraptext", WC2_WRAPTEXT }, { "softkeyboard", WC2_SOFTKEYBOARD },
{ "use_darkgray", WC2_DARKGRAY }, { "wraptext", WC2_WRAPTEXT },
{ "hitpointbar", WC2_HITPOINTBAR }, { "use_darkgray", WC2_DARKGRAY },
{ "hilite_status", WC2_HILITE_STATUS }, { "hitpointbar", WC2_HITPOINTBAR },
/* name shown in 'O' menu is different */ { "hilite_status", WC2_HILITE_STATUS },
{ "status hilite rules", WC2_HILITE_STATUS }, /* name shown in 'O' menu is different */
/* statushilites doesn't have its own bit */ { "status hilite rules", WC2_HILITE_STATUS },
{ "statushilites", WC2_HILITE_STATUS }, /* statushilites doesn't have its own bit */
{ (char *) 0, 0L } }; { "statushilites", WC2_HILITE_STATUS },
{ (char *) 0, 0L }
};
/* /*
* If a port wants to change or ensure that the SET_IN_SYS, * If a port wants to change or ensure that the SET_IN_SYS,

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 pline.c $NHDT-Date: 1501803108 2017/08/03 23:31:48 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.61 $ */ /* NetHack 3.6 pline.c $NHDT-Date: 1510990667 2017/11/18 07:37:47 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.64 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -436,7 +436,8 @@ VA_DECL(const char *, s)
pbuf[BUFSZ - 1] = '\0'; /* sanity */ pbuf[BUFSZ - 1] = '\0'; /* sanity */
paniclog("impossible", pbuf); paniclog("impossible", pbuf);
pline("%s", VA_PASS1(pbuf)); pline("%s", VA_PASS1(pbuf));
pline("%s", VA_PASS1("Program in disorder - perhaps you'd better #quit.")); pline(VA_PASS1(
"Program in disorder! (Saving and reloading may fix this problem.)"));
program_state.in_impossible = 0; program_state.in_impossible = 0;
VA_END(); VA_END();
} }

View File

@@ -577,6 +577,18 @@ register struct obj *otmp;
if (++i >= A_MAX) if (++i >= A_MAX)
i = 0; i = 0;
} }
/* when using the potion (not the spell) also restore lost levels,
to make the potion more worth keeping around for players with
the spell or with a unihorn; this is better than full healing
in that it can restore all of them, not just half, and a
blessed potion restores them all at once */
if (otmp->otyp == POT_RESTORE_ABILITY &&
u.ulevel < u.ulevelmax) {
do {
pluslvl(FALSE);
} while (u.ulevel < u.ulevelmax && otmp->blessed);
}
} }
break; break;
case POT_HALLUCINATION: case POT_HALLUCINATION:

View File

@@ -1435,7 +1435,7 @@ create_trap(t, croom)
trap *t; trap *t;
struct mkroom *croom; struct mkroom *croom;
{ {
schar x, y; schar x = -1, y = -1;
coord tm; coord tm;
if (croom) if (croom)
@@ -1994,7 +1994,7 @@ create_altar(a, croom)
altar *a; altar *a;
struct mkroom *croom; struct mkroom *croom;
{ {
schar sproom, x, y; schar sproom, x = -1, y = -1;
aligntyp amask; aligntyp amask;
boolean croom_is_temple = TRUE; boolean croom_is_temple = TRUE;
int oldtyp; int oldtyp;

View File

@@ -204,8 +204,10 @@ vomiting_dialogue()
that message and "You can move again." (from vomit()'s that message and "You can move again." (from vomit()'s
nomul(-2)) with no intervening message; give one here to nomul(-2)) with no intervening message; give one here to
have more specific point at which hero became unable to move have more specific point at which hero became unable to move
[vomit() issues its own message for the cantvomit() case] */ [vomit() issues its own message for the cantvomit() case
You("%s!", !Hallucination ? "vomit" : "hurl chunks"); and for the FAINTING-or-worse case where stomach is empty] */
if (u.uhs < FAINTING)
You("%s!", !Hallucination ? "vomit" : "hurl chunks");
} }
vomit(); vomit();
break; break;

View File

@@ -129,11 +129,7 @@ getlin_hook_proc hook;
#endif /* NEWAUTOCOMP */ #endif /* NEWAUTOCOMP */
} else } else
tty_nhbell(); tty_nhbell();
#if defined(apollo)
} else if (c == '\n' || c == '\r') { } else if (c == '\n' || c == '\r') {
#else
} else if (c == '\n') {
#endif
#ifndef NEWAUTOCOMP #ifndef NEWAUTOCOMP
*bufp = 0; *bufp = 0;
#endif /* not NEWAUTOCOMP */ #endif /* not NEWAUTOCOMP */
@@ -213,7 +209,7 @@ register const char *s; /* chars allowed besides return */
!program_state.done_hup && !program_state.done_hup &&
#endif #endif
(c = tty_nhgetch()) != EOF) { (c = tty_nhgetch()) != EOF) {
if (c == '\n') if (c == '\n' || c == '\r')
break; break;
if (iflags.cbreak) { if (iflags.cbreak) {
@@ -223,7 +219,7 @@ register const char *s; /* chars allowed besides return */
morc = '\033'; morc = '\033';
break; break;
} }
if ((s && index(s, c)) || c == x) { if ((s && index(s, c)) || c == x || (x == '\n' && c == '\r')) {
morc = (char) c; morc = (char) c;
break; break;
} }

View File

@@ -1167,6 +1167,8 @@ tty_askname()
while ((c = tty_nhgetch()) != '\n') { while ((c = tty_nhgetch()) != '\n') {
if (c == EOF) if (c == EOF)
c = '\033'; c = '\033';
if (c == '\r')
break;
if (c == '\033') { if (c == '\033') {
ct = 0; ct = 0;
break; break;