diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 04d4f53a1..af1de2a6c 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 could get that message, move a bit, then get "you can move again" 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 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 @@ -471,6 +472,7 @@ charisma affects the leeway in demon lord bribes make Vlad slightly tougher reduce the amount of gold laying on the floor 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 @@ -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 re-displayed incorrectly by ^P for msg_window={full,combo,reverse} 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 misspelled pilemark.xbm (as pilemark.xpm) unix: options file with CR+LF line ends and an invalid option line resulted in diff --git a/src/apply.c b/src/apply.c index ca72cc466..130a53d33 100644 --- a/src/apply.c +++ b/src/apply.c @@ -1861,8 +1861,8 @@ struct obj *obj; verbalize(you_buy_it); useupf(corpse, 1L); } - can = hold_another_object(can, "You make, but cannot pick up, %s.", - doname(can), (const char *) 0); + (void) hold_another_object(can, "You make, but cannot pick up, %s.", + doname(can), (const char *) 0); } else impossible("Tinning failed."); } @@ -2807,8 +2807,8 @@ struct obj *obj; pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } - otmp = hold_another_object( - otmp, "You drop %s!", doname(otmp), (const char *) 0); + (void) hold_another_object(otmp, "You drop %s!", + doname(otmp), (const char *) 0); break; default: /* to floor beneath mon */ diff --git a/src/artifact.c b/src/artifact.c index 25fc17118..a7678551a 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -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. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1496,8 +1496,8 @@ struct obj *obj; obj->age = 0; return 0; } - b_effect = (obj->blessed - && (Role_switch == oart->role || !oart->role)); + b_effect = (obj->blessed && (oart->role == Role_switch + || oart->role == NON_PM)); recharge(otmp, b_effect ? 1 : obj->cursed ? -1 : 0); update_inventory(); break; diff --git a/src/dig.c b/src/dig.c index 364d1cce6..497de8cd4 100644 --- a/src/dig.c +++ b/src/dig.c @@ -1863,16 +1863,33 @@ bury_objs(x, y) int x, y; { 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) { 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); + } /* don't expect any engravings here, but just in case */ del_engr_at(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 */ diff --git a/src/do_name.c b/src/do_name.c index 38b90fc45..6e3bfd981 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -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; void -getpos_sethilite(f, d) -void FDECL((*f), (int)); -boolean FDECL((*d), (int,int)); +getpos_sethilite(gp_hilitef, gp_getvalidf) +void FDECL((*gp_hilitef), (int)); +boolean FDECL((*gp_getvalidf), (int,int)); { - getpos_hilitefunc = f; - getpos_getvalid = d; + getpos_hilitefunc = gp_hilitef; + getpos_getvalid = gp_getvalidf; } const char *const gloc_descr[NUM_GLOCS][4] = { diff --git a/src/eat.c b/src/eat.c index a1b4bc33d..dc33cca8a 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1616,6 +1616,8 @@ struct obj *otmp; sick_time = (Sick > 1L) ? Sick - 1L : 1L; make_sick(sick_time, corpse_xname(otmp, "rotted", CXN_NORMAL), TRUE, SICK_VOMITABLE); + + pline("(It must have died too long ago to be safe to eat.)"); } if (carried(otmp)) useup(otmp); @@ -3152,12 +3154,18 @@ skipfloor: void 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 dealing with some esoteric body_part() */ Your("jaw gapes convulsively."); - else + } else { 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 viable while eating but not for Vomiting countdown where hero might diff --git a/src/exper.c b/src/exper.c index 06456e0c0..675375ebe 100644 --- a/src/exper.c +++ b/src/exper.c @@ -293,9 +293,11 @@ boolean incr; /* true iff via incremental experience growth */ u.uexp = newuexp(u.ulevel); } ++u.ulevel; + pline("Welcome %sto experience level %d.", + u.ulevelmax < u.ulevel ? "" : "back ", + u.ulevel); if (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 */ reset_rndmonst(NON_PM); /* new monster selection */ } diff --git a/src/monst.c b/src/monst.c index fef0b8aac..5efce983d 100644 --- a/src/monst.c +++ b/src/monst.c @@ -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. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2369,8 +2369,8 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_POIS | M1_SWIM, M2_NOPOLY | M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_BLUE), -/* standard demons & devils - */ + /* standard demons & devils + */ #define SEDUCTION_ATTACKS_YES \ 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) @@ -2395,8 +2395,8 @@ struct permonst _mons2[] = { MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, M3_INFRAVISIBLE | M3_INFRAVISION, CLR_GRAY), - /* Used by AD&D for a type of demon, originally one of the Furies */ - /* and spelled this way */ + /* Used by AD&D for a type of demon, originally one of the Furies + and spelled this way */ MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), (G_HELL | G_NOCORPSE | G_SGROUP | 2), 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_PRINCE | M2_MALE, 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), 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, M2_NOPOLY | M2_STALK | M2_HOSTILE | M2_PNAME | M2_STRONG | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION | M3_DISPLACES, HI_LORD), -/* other demons - */ + /* other demons + */ #ifdef MAIL MON("mail daemon", S_DEMON, LVL(56, 24, 10, 127, 0), (G_NOGEN | G_NOCORPSE), @@ -2711,14 +2712,12 @@ struct permonst _mons2[] = { /* * 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), (G_NOGEN | G_NOCORPSE | G_UNIQ), 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), - /* Note: * Worm tail must be between the normal monsters and the special * quest & pseudo-character ones because an optimization in the @@ -2862,8 +2861,8 @@ struct permonst _mons2[] = { | M2_COLLECT | M2_MAGIC, M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), #if 0 /* OBSOLETE */ - /* Two for elves - one of each sex. - */ + /* Two for elves - one of each sex. + */ MON("Earendil", S_HUMAN, LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), diff --git a/src/options.c b/src/options.c index bfd42b189..1228f1a90 100644 --- a/src/options.c +++ b/src/options.c @@ -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. */ /* NetHack may be freely redistributed. See license for details. */ @@ -106,8 +106,7 @@ static struct Bool_Opt { #endif { "confirm", &flags.confirm, TRUE, SET_IN_GAME }, { "dark_room", &flags.dark_room, TRUE, SET_IN_GAME }, - { "eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, - SET_IN_GAME }, /*WC*/ + { "eight_bit_tty", &iflags.wc_eight_bit_input, FALSE, SET_IN_GAME }, /*WC*/ #ifdef TTY_GRAPHICS { "extmenu", &iflags.extmenu, FALSE, SET_IN_GAME }, #else @@ -408,8 +407,9 @@ static struct Comp_Opt { #endif { "whatis_coord", "show coordinates when auto-describing cursor position", 1, SET_IN_GAME }, - { "whatis_filter", "filter coordinate locations when targeting next or previous", - 1, SET_IN_GAME }, + { "whatis_filter", + "filter coordinate locations when targeting next or previous", + 1, SET_IN_GAME }, { "windowcolors", "the foreground/background colors of windows", /*WC*/ 80, 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_invert_all", MENU_INVERT_ALL, "Invert selection" }, { "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_search", MENU_SEARCH, "Search and toggle matching items" }, }; @@ -713,8 +714,8 @@ initoptions_init() iflags.getpos_coords = GPCOORDS_NONE; /* hero's role, race, &c haven't been chosen yet */ - flags.initrole = flags.initrace = flags.initgend = flags.initalign = - ROLE_NONE; + flags.initrole = flags.initrace = flags.initgend = flags.initalign + = ROLE_NONE; /* Set the default monster and object class symbols. */ init_symbols(); @@ -1165,14 +1166,14 @@ int on_or_off; /*-- ON --*/ if (iflags.opt_booldup) 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; for (k = 0; k < SIZE(boolopt); ++k) *optptr++ = 0; if (iflags.opt_compdup) 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; for (k = 0; k < SIZE(compopt); ++k) *optptr++ = 0; @@ -1233,7 +1234,7 @@ int iscompound; /* 0 == boolean option, 1 == compound */ */ #else /* !MAC */ config_error_add("%s option specified multiple times: %s", - iscompound ? "compound" : "boolean", opts); + iscompound ? "compound" : "boolean", opts); #endif /* ?MAC */ return; } @@ -1458,7 +1459,7 @@ const char *prompt; static const struct { const char *name; - const xchar msgtyp; + xchar msgtyp; const char *descr; } msgtype_names[] = { { "show", MSGTYP_NORMAL, "Show message normally" }, @@ -1514,11 +1515,9 @@ msgtype_add(typ, pattern) int typ; char *pattern; { - struct plinemsg_type *tmp - = (struct plinemsg_type *) alloc(sizeof (struct plinemsg_type)); + struct plinemsg_type + *tmp = (struct plinemsg_type *) alloc(sizeof (struct plinemsg_type)); - if (!tmp) - return FALSE; tmp->msgtype = typ; tmp->regex = regex_init(); if (!regex_compile(pattern, tmp->regex)) { @@ -1670,7 +1669,8 @@ const char *errmsg; } 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; } regex_free(match); @@ -1901,7 +1901,7 @@ boolean tinitial, tfrom_file; } if (strlen(opts) > BUFSZ / 2) { config_error_add("Option too long, max length is %i characters", - (BUFSZ / 2)); + (BUFSZ / 2)); return FALSE; } @@ -2025,8 +2025,7 @@ boolean tinitial, tfrom_file; /* We always check for duplicates on the remaining compound options, although individual option processing can choose to complain or not */ - duplicate = - duplicate_opt_detection(opts, 1); /* 1 means check compounds */ + duplicate = duplicate_opt_detection(opts, 1); /* 1: check compounds */ fullname = "pettype"; if (match_optname(opts, fullname, 3, TRUE)) { @@ -2485,7 +2484,8 @@ boolean tinitial, tfrom_file; forig = fruit_from_name(pl_fruit, FALSE, (int *) 0); 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; } } @@ -2681,6 +2681,7 @@ boolean tinitial, tfrom_file; } return retval; } + /* WINCAP * align_message:[left|top|right|bottom] */ fullname = "align_message"; @@ -2707,7 +2708,8 @@ boolean tinitial, tfrom_file; } return retval; } - /* the order to list the pack */ + + /* the order to list inventory */ fullname = "packorder"; if (match_optname(opts, fullname, 4, TRUE)) { if (duplicate) @@ -2831,9 +2833,10 @@ boolean tinitial, tfrom_file; } /* 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], - abuf[BUFSZ]; + abuf[BUFSZ]; int oc_sym; boolean badopt = FALSE, compat = (strlen(opts) <= 6), use_menu; @@ -2855,7 +2858,7 @@ boolean tinitial, tfrom_file; if (flags.menu_style == MENU_TRADITIONAL || flags.menu_style == MENU_COMBINATION) { use_menu = FALSE; - Sprintf(qbuf, "New pickup_types: [%s am] (%s)", ocl, + Sprintf(qbuf, "New %s: [%s am] (%s)", fullname, ocl, *tbuf ? tbuf : "all"); getlin(qbuf, abuf); op = mungspaces(abuf); @@ -2871,7 +2874,7 @@ boolean tinitial, tfrom_file; } } if (negated) { - bad_negation("pickup_types", TRUE); + bad_negation(fullname, TRUE); return FALSE; } while (*op == ' ') @@ -2890,8 +2893,7 @@ boolean tinitial, tfrom_file; op++; } if (badopt) { - config_error_add("Unknown %s parameter '%s'", - "pickup_types", op); + config_error_add("Unknown %s parameter '%s'", fullname, op); return FALSE; } } @@ -3256,10 +3258,11 @@ boolean tinitial, tfrom_file; } return retval; } + /* WINCAP * scroll_amount:nn */ 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) complain_about_duplicate(opts, 1); op = string_for_opt(opts, negated); @@ -3271,10 +3274,11 @@ boolean tinitial, tfrom_file; } return retval; } + /* WINCAP * scroll_margin:nn */ 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) complain_about_duplicate(opts, 1); op = string_for_opt(opts, negated); @@ -3286,6 +3290,7 @@ boolean tinitial, tfrom_file; } return retval; } + fullname = "subkeyvalue"; if (match_optname(opts, fullname, 5, TRUE)) { /* no duplicate complaint here */ @@ -3302,6 +3307,7 @@ boolean tinitial, tfrom_file; } return retval; } + /* WINCAP * tile_width:nn */ fullname = "tile_width"; @@ -3346,6 +3352,7 @@ boolean tinitial, tfrom_file; } return retval; } + /* WINCAP * vary_msgcount:nn */ fullname = "vary_msgcount"; @@ -3361,6 +3368,19 @@ boolean tinitial, tfrom_file; } 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"; if (match_optname(opts, fullname, 3, TRUE)) { if (duplicate) @@ -3370,6 +3390,7 @@ boolean tinitial, tfrom_file; return FALSE; } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { char buf[WINTYPELEN]; + nmcpy(buf, op, WINTYPELEN); choose_windows(buf); } else @@ -3385,6 +3406,7 @@ boolean tinitial, tfrom_file; return FALSE; } else if ((op = string_for_env_opt(fullname, opts, FALSE)) != 0) { char buf[WINTYPELEN]; + nmcpy(buf, op, WINTYPELEN); addto_windowchain(buf); } else @@ -3452,6 +3474,7 @@ boolean tinitial, tfrom_file; fullname = "menu_headings"; if (match_optname(opts, fullname, 12, TRUE)) { int tmpattr; + if (duplicate) complain_about_duplicate(opts, 1); if (negated) { @@ -3491,6 +3514,7 @@ boolean tinitial, tfrom_file; return retval; } } + /* hilite fields in status prompt */ fullname = "hilite_status"; if (match_optname(opts, fullname, 13, TRUE)) { @@ -3697,6 +3721,17 @@ boolean tinitial, tfrom_file; if (boolopt[i].addr == &iflags.zerocomp) set_savepref(iflags.zerocomp ? "zerocomp" : "externalcomp"); #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() */ if (initial) return retval; @@ -3726,22 +3761,12 @@ boolean tinitial, tfrom_file; vision_full_recalc = 1; /* delayed recalc */ if (iflags.use_color) 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 || boolopt[i].addr == &iflags.use_inverse || 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; #ifdef STATUS_HILITES } else if (boolopt[i].addr == &iflags.wc2_hitpointbar) { @@ -3886,8 +3911,10 @@ get_menu_cmd_key(ch) char ch; { char *found = index(mapped_menu_op, ch); + if (found) { int idx = (int) (found - mapped_menu_op); + ch = mapped_menu_cmds[idx]; } return ch; @@ -3902,8 +3929,10 @@ map_menu_cmd(ch) char ch; { char *found = index(mapped_menu_cmds, ch); + if (found) { int idx = (int) (found - mapped_menu_cmds); + ch = mapped_menu_op[idx]; } return ch; @@ -3919,6 +3948,7 @@ boolean dolist; putstr(win, 0, "Menu control keys:"); if (dolist) { int i; + for (i = 0; i < SIZE(default_menu_cmd_info); i++) { Sprintf(buf, "%-8s %s", 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; add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, "", MENU_UNSELECTED); add_menu(tmpwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings, - "Other settings:", - MENU_UNSELECTED); + "Other settings:", MENU_UNSELECTED); for (i = 0; (name = othropt[i].name) != 0; i++) { 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) { 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) { (void) special_handling("autopickup_exception", setinitial, fromfile); @@ -4342,6 +4372,7 @@ boolean setinitial, setfromfile; if (!strcmp("menustyle", optname)) { const char *style_name; menu_item *style_pick = (menu_item *) 0; + tmpwin = create_nhwindow(NHW_MENU); start_menu(tmpwin); any = zeroany; @@ -4529,8 +4560,8 @@ boolean setinitial, setfromfile; 0, ATR_NONE, "compass ('east' or '3s' or '2n,4w')", (gp == GPCOORDS_COMPASS) ? MENU_SELECTED : MENU_UNSELECTED); any.a_char = GPCOORDS_COMFULL; - add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, - 0, ATR_NONE, "full compass ('east' or '3south' or '2north,4west')", + add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_COMFULL, 0, ATR_NONE, + "full compass ('east' or '3south' or '2north,4west')", (gp == GPCOORDS_COMFULL) ? MENU_SELECTED : MENU_UNSELECTED); any.a_char = GPCOORDS_MAP; add_menu(tmpwin, NO_GLYPH, &any, GPCOORDS_MAP, @@ -4596,7 +4627,7 @@ boolean setinitial, setfromfile; 0, ATR_NONE, "in same area", (gf == GFILTER_AREA) ? MENU_SELECTED : MENU_UNSELECTED); 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) { iflags.getloc_filter = (window_pick[0].item.a_char - 1); /* PICK_ONE doesn't unselect preselected entry when @@ -4955,10 +4986,7 @@ boolean setinitial, setfromfile; struct symsetentry *sl; int res, which_set, setcount = 0, chosen = -2; - if (rogueflag) - which_set = ROGUESET; - else - which_set = PRIMARY; + which_set = rogueflag ? ROGUESET : PRIMARY; /* clear symset[].name as a flag to read_sym_file() to build list */ symset_name = symset[which_set].name; @@ -5238,36 +5266,23 @@ char *buf; Sprintf(buf, "%s", rolestring(flags.initgend, genders, adj)); else if (!strcmp(optname, "horsename")) 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", - iflags.wc_map_mode == MAP_MODE_TILES - ? "tiles" - : iflags.wc_map_mode == MAP_MODE_ASCII4x6 - ? "ascii4x6" - : iflags.wc_map_mode == MAP_MODE_ASCII6x8 - ? "ascii6x8" - : iflags.wc_map_mode == MAP_MODE_ASCII8x8 - ? "ascii8x8" - : iflags.wc_map_mode == MAP_MODE_ASCII16x8 - ? "ascii16x8" - : iflags.wc_map_mode == MAP_MODE_ASCII7x12 - ? "ascii7x12" - : iflags.wc_map_mode == MAP_MODE_ASCII8x12 - ? "ascii8x12" - : 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")) + (i == MAP_MODE_TILES) ? "tiles" + : (i == MAP_MODE_ASCII4x6) ? "ascii4x6" + : (i == MAP_MODE_ASCII6x8) ? "ascii6x8" + : (i == MAP_MODE_ASCII8x8) ? "ascii8x8" + : (i == MAP_MODE_ASCII16x8) ? "ascii16x8" + : (i == MAP_MODE_ASCII7x12) ? "ascii7x12" + : (i == MAP_MODE_ASCII8x12) ? "ascii8x12" + : (i == MAP_MODE_ASCII16x12) ? "ascii16x12" + : (i == MAP_MODE_ASCII12x16) ? "ascii12x16" + : (i == MAP_MODE_ASCII10x18) ? "ascii10x18" + : (i == MAP_MODE_ASCII_FIT_TO_SCREEN) + ? "fit_to_screen" + : defopt); + } else if (!strcmp(optname, "menustyle")) Sprintf(buf, "%s", menutype[(int) flags.menu_style]); else if (!strcmp(optname, "menu_deselect_all")) Sprintf(buf, "%s", to_be_done); @@ -5299,13 +5314,10 @@ char *buf; Sprintf(buf, "%u", iflags.msg_history); #ifdef TTY_GRAPHICS } else if (!strcmp(optname, "msg_window")) { - Sprintf(buf, "%s", (iflags.prevmsg_window == 's') - ? "single" - : (iflags.prevmsg_window == 'c') - ? "combination" - : (iflags.prevmsg_window == 'f') - ? "full" - : "reversed"); + Sprintf(buf, "%s", (iflags.prevmsg_window == 's') ? "single" + : (iflags.prevmsg_window == 'c') ? "combination" + : (iflags.prevmsg_window == 'f') ? "full" + : "reversed"); #endif } else if (!strcmp(optname, "name")) { Sprintf(buf, "%s", plname); @@ -5589,8 +5601,9 @@ count_ape_maps(leave, grab) int *leave, *grab; { 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) { ape = iflags.autopickup_exceptions[pass]; while (ape) { @@ -6075,53 +6088,56 @@ char *class_select; return ret; } -struct wc_Opt wc_options[] = { { "ascii_map", WC_ASCII_MAP }, - { "color", WC_COLOR }, - { "eight_bit_tty", WC_EIGHT_BIT_IN }, - { "hilite_pet", WC_HILITE_PET }, - { "popup_dialog", WC_POPUP_DIALOG }, - { "player_selection", WC_PLAYER_SELECTION }, - { "preload_tiles", WC_PRELOAD_TILES }, - { "tiled_map", WC_TILED_MAP }, - { "tile_file", WC_TILE_FILE }, - { "tile_width", WC_TILE_WIDTH }, - { "tile_height", WC_TILE_HEIGHT }, - { "use_inverse", WC_INVERSE }, - { "align_message", WC_ALIGN_MESSAGE }, - { "align_status", WC_ALIGN_STATUS }, - { "font_map", WC_FONT_MAP }, - { "font_menu", WC_FONT_MENU }, - { "font_message", WC_FONT_MESSAGE }, +static struct wc_Opt wc_options[] = { + { "ascii_map", WC_ASCII_MAP }, + { "color", WC_COLOR }, + { "eight_bit_tty", WC_EIGHT_BIT_IN }, + { "hilite_pet", WC_HILITE_PET }, + { "popup_dialog", WC_POPUP_DIALOG }, + { "player_selection", WC_PLAYER_SELECTION }, + { "preload_tiles", WC_PRELOAD_TILES }, + { "tiled_map", WC_TILED_MAP }, + { "tile_file", WC_TILE_FILE }, + { "tile_width", WC_TILE_WIDTH }, + { "tile_height", WC_TILE_HEIGHT }, + { "use_inverse", WC_INVERSE }, + { "align_message", WC_ALIGN_MESSAGE }, + { "align_status", WC_ALIGN_STATUS }, + { "font_map", WC_FONT_MAP }, + { "font_menu", WC_FONT_MENU }, + { "font_message", WC_FONT_MESSAGE }, #if 0 - {"perm_invent", WC_PERM_INVENT}, + {"perm_invent", WC_PERM_INVENT}, #endif - { "font_size_map", WC_FONTSIZ_MAP }, - { "font_size_menu", WC_FONTSIZ_MENU }, - { "font_size_message", WC_FONTSIZ_MESSAGE }, - { "font_size_status", WC_FONTSIZ_STATUS }, - { "font_size_text", WC_FONTSIZ_TEXT }, - { "font_status", WC_FONT_STATUS }, - { "font_text", WC_FONT_TEXT }, - { "map_mode", WC_MAP_MODE }, - { "scroll_amount", WC_SCROLL_AMOUNT }, - { "scroll_margin", WC_SCROLL_MARGIN }, - { "splash_screen", WC_SPLASH_SCREEN }, - { "vary_msgcount", WC_VARY_MSGCOUNT }, - { "windowcolors", WC_WINDOWCOLORS }, - { "mouse_support", WC_MOUSE_SUPPORT }, - { (char *) 0, 0L } }; - -struct wc_Opt wc2_options[] = { { "fullscreen", WC2_FULLSCREEN }, - { "softkeyboard", WC2_SOFTKEYBOARD }, - { "wraptext", WC2_WRAPTEXT }, - { "use_darkgray", WC2_DARKGRAY }, - { "hitpointbar", WC2_HITPOINTBAR }, - { "hilite_status", WC2_HILITE_STATUS }, - /* name shown in 'O' menu is different */ - { "status hilite rules", WC2_HILITE_STATUS }, - /* statushilites doesn't have its own bit */ - { "statushilites", WC2_HILITE_STATUS }, - { (char *) 0, 0L } }; + { "font_size_map", WC_FONTSIZ_MAP }, + { "font_size_menu", WC_FONTSIZ_MENU }, + { "font_size_message", WC_FONTSIZ_MESSAGE }, + { "font_size_status", WC_FONTSIZ_STATUS }, + { "font_size_text", WC_FONTSIZ_TEXT }, + { "font_status", WC_FONT_STATUS }, + { "font_text", WC_FONT_TEXT }, + { "map_mode", WC_MAP_MODE }, + { "scroll_amount", WC_SCROLL_AMOUNT }, + { "scroll_margin", WC_SCROLL_MARGIN }, + { "splash_screen", WC_SPLASH_SCREEN }, + { "vary_msgcount", WC_VARY_MSGCOUNT }, + { "windowcolors", WC_WINDOWCOLORS }, + { "mouse_support", WC_MOUSE_SUPPORT }, + { (char *) 0, 0L } +}; +static struct wc_Opt wc2_options[] = { + { "fullscreen", WC2_FULLSCREEN }, + { "softkeyboard", WC2_SOFTKEYBOARD }, + { "wraptext", WC2_WRAPTEXT }, + { "use_darkgray", WC2_DARKGRAY }, + { "hitpointbar", WC2_HITPOINTBAR }, + { "hilite_status", WC2_HILITE_STATUS }, + /* name shown in 'O' menu is different */ + { "status hilite rules", WC2_HILITE_STATUS }, + /* statushilites doesn't have its own bit */ + { "statushilites", WC2_HILITE_STATUS }, + { (char *) 0, 0L } +}; /* * If a port wants to change or ensure that the SET_IN_SYS, diff --git a/src/pline.c b/src/pline.c index 270272042..d6ee70266 100644 --- a/src/pline.c +++ b/src/pline.c @@ -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. */ /* NetHack may be freely redistributed. See license for details. */ @@ -436,7 +436,8 @@ VA_DECL(const char *, s) pbuf[BUFSZ - 1] = '\0'; /* sanity */ paniclog("impossible", 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; VA_END(); } diff --git a/src/potion.c b/src/potion.c index 4925b27b0..5daa9fbcc 100644 --- a/src/potion.c +++ b/src/potion.c @@ -577,6 +577,18 @@ register struct obj *otmp; if (++i >= A_MAX) 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; case POT_HALLUCINATION: diff --git a/src/sp_lev.c b/src/sp_lev.c index 5d3d69778..bb1af2c94 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1435,7 +1435,7 @@ create_trap(t, croom) trap *t; struct mkroom *croom; { - schar x, y; + schar x = -1, y = -1; coord tm; if (croom) @@ -1994,7 +1994,7 @@ create_altar(a, croom) altar *a; struct mkroom *croom; { - schar sproom, x, y; + schar sproom, x = -1, y = -1; aligntyp amask; boolean croom_is_temple = TRUE; int oldtyp; diff --git a/src/timeout.c b/src/timeout.c index a85baf552..b8535bbd5 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -204,8 +204,10 @@ vomiting_dialogue() that message and "You can move again." (from vomit()'s nomul(-2)) with no intervening message; give one here to have more specific point at which hero became unable to move - [vomit() issues its own message for the cantvomit() case] */ - You("%s!", !Hallucination ? "vomit" : "hurl chunks"); + [vomit() issues its own message for the cantvomit() case + and for the FAINTING-or-worse case where stomach is empty] */ + if (u.uhs < FAINTING) + You("%s!", !Hallucination ? "vomit" : "hurl chunks"); } vomit(); break; diff --git a/win/tty/getline.c b/win/tty/getline.c index f3dd6cbf2..a73fa4060 100644 --- a/win/tty/getline.c +++ b/win/tty/getline.c @@ -129,11 +129,7 @@ getlin_hook_proc hook; #endif /* NEWAUTOCOMP */ } else tty_nhbell(); -#if defined(apollo) } else if (c == '\n' || c == '\r') { -#else - } else if (c == '\n') { -#endif #ifndef NEWAUTOCOMP *bufp = 0; #endif /* not NEWAUTOCOMP */ @@ -213,7 +209,7 @@ register const char *s; /* chars allowed besides return */ !program_state.done_hup && #endif (c = tty_nhgetch()) != EOF) { - if (c == '\n') + if (c == '\n' || c == '\r') break; if (iflags.cbreak) { @@ -223,7 +219,7 @@ register const char *s; /* chars allowed besides return */ morc = '\033'; break; } - if ((s && index(s, c)) || c == x) { + if ((s && index(s, c)) || c == x || (x == '\n' && c == '\r')) { morc = (char) c; break; } diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 821239c68..32dc6b3c5 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -1167,6 +1167,8 @@ tty_askname() while ((c = tty_nhgetch()) != '\n') { if (c == EOF) c = '\033'; + if (c == '\r') + break; if (c == '\033') { ct = 0; break;