diff --git a/dat/cmdhelp b/dat/cmdhelp index 811c9bdda..d7487750f 100644 --- a/dat/cmdhelp +++ b/dat/cmdhelp @@ -69,7 +69,7 @@ V Show long version and game history w Wield (put in use) a weapon W Wear a piece of armor x Swap wielded and secondary weapons -X Enter explore (discovery) mode (only if defined) +X Toggle two-weapon combat y Go northwest 1 space Y Go northwest until you are on top of something ^Y Go northwest until you are near something diff --git a/dat/help b/dat/help index 7f9ee92ab..07971cec2 100644 --- a/dat/help +++ b/dat/help @@ -147,7 +147,7 @@ Commands: w Wield weapon. w- means wield nothing, use bare hands. W Wear armor. x Swap wielded and secondary weapons. - X Switch the game to explore (discovery) mode. + X Toggle two-weapon combat. ^X Show your attributes. z Zap a wand. (Use y instead of z if number_pad is -1.) Z Cast a spell. (Use Y instead of Z if number_pad is -1.) diff --git a/dat/hh b/dat/hh index 1887547c7..b16b1c91c 100644 --- a/dat/hh +++ b/dat/hh @@ -32,7 +32,6 @@ O options set options \ known display list of what's been discovered v version display version number V history display game history -X explore switch the game to explore (discovery) mode ^A again redo the previous command (^A denotes the keystroke CTRL-A) ^R redraw redraw the screen ^P prevmsg repeat previous message (subsequent ^P's repeat earlier ones) @@ -70,6 +69,7 @@ T takeoff take off some armor w wield wield a weapon (w- wield nothing) W wear put on some armor x xchange swap wielded and secondary weapons +X twoweapon toggle two-weapon combat z zap zap a wand (use y instead of z if number_pad is -1) Z Zap cast a spell (use Y instead of Z if number_pad is -1) < up go up the stairs diff --git a/doc/Guidebook.mn b/doc/Guidebook.mn index f04f3b309..86094fe26 100644 --- a/doc/Guidebook.mn +++ b/doc/Guidebook.mn @@ -708,7 +708,8 @@ The latter is used as your secondary weapon when engaging in two-weapon combat. Note that if one of these slots is empty, the exchange still takes place. .lp X -Enter explore (discovery) mode, explained in its own section later. +Toggle two-weapon combat, if your character can do it. Also available +via the ``#twoweapon'' extended command .lp "" Since using this command by accident would be troublesome, you are asked to confirm your intent before switching to explore mode. By default @@ -2980,8 +2981,8 @@ with the .op -X command-line switch or with the .op playmode:explore -option. The other is to issue the `X' command while already -playing the game. Starting a new game in explore mode provides your +option. The other is to issue the ``#exploremode'' extended command while +already playing the game. Starting a new game in explore mode provides your character with a wand of wishing in initial inventory; switching via `X' during play does not. The other benefits of explore mode are left for the trepid reader to discover. diff --git a/include/config.h b/include/config.h index d8b067fc7..930bd549c 100644 --- a/include/config.h +++ b/include/config.h @@ -316,6 +316,11 @@ #endif /* CHDIR */ +/* If GENERIC_USERNAMES is defined, and the user name is found + * in that list, prompt for username instead. + * A public server should probably disable this. */ +#define GENERIC_USERNAMES "play player game games nethack nethacker" + /* * Section 3: Definitions that may vary with system type. diff --git a/src/cmd.c b/src/cmd.c index f7e858e01..5d9bcfc27 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -2411,7 +2411,7 @@ static const struct func_tab cmdlist[] = { {'W', FALSE, dowear}, {M('w'), FALSE, dowipe}, {'x', FALSE, doswapweapon}, - {'X', TRUE, enter_explore_mode}, + {'X', FALSE, dotwoweapon}, /* 'y', 'Y' : go nw */ {'z', FALSE, dozap}, {'Z', TRUE, docast}, @@ -2456,6 +2456,7 @@ struct ext_func_tab extcmdlist[] = { {"dip", "dip an object into something", dodip, FALSE}, {"enhance", "advance or check weapon and spell skills", enhance_weapon_skill, TRUE}, + {"exploremode", "enter explore mode", enter_explore_mode, TRUE}, {"force", "force a lock", doforce, FALSE}, {"invoke", "invoke an object's powers", doinvoke, TRUE}, {"jump", "jump to a location", dojump, FALSE}, diff --git a/src/fountain.c b/src/fountain.c index 482b0ed76..e87748e0a 100644 --- a/src/fountain.c +++ b/src/fountain.c @@ -456,7 +456,7 @@ register struct obj *obj; long money = money_cnt(invent); struct obj *otmp; if (money > 10) { - /* Amount to loose. Might get rounded up as fountains don't pay change... */ + /* Amount to lose. Might get rounded up as fountains don't pay change... */ money = somegold(money) / 10; for (otmp = invent; otmp && money > 0; otmp = otmp->nobj) if (otmp->oclass == COIN_CLASS) { int denomination = objects[otmp->otyp].oc_cost; diff --git a/src/pickup.c b/src/pickup.c index d044cf46f..0b6abf06d 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -1451,6 +1451,36 @@ int x, y; return FALSE; } +int +do_loot_cont(cobjp) +struct obj **cobjp; +{ + struct obj *cobj = *cobjp; + if (!cobj) return 0; + if (cobj->olocked) { + pline("%s locked.", cobj->lknown ? "It is" : + "Hmmm, it turns out to be"); + cobj->lknown = 1; + return 0; + } + cobj->lknown = 1; + + if (cobj->otyp == BAG_OF_TRICKS) { + int tmp; + You("carefully open the bag..."); + pline("It develops a huge set of teeth and bites you!"); + tmp = rnd(10); + losehp(Maybe_Half_Phys(tmp), "carnivorous bag", KILLED_BY_AN); + makeknown(BAG_OF_TRICKS); + return 1; + } + + You("%sopen %s...", + (!cobj->cknown || !cobj->lknown) ? "carefully " : "", + the(xname(cobj))); + return use_container(cobjp, 0); +} + int doloot() /* loot a container on the floor or loot saddle from mon. */ { @@ -1486,46 +1516,62 @@ lootcont: if (container_at(cc.x, cc.y, FALSE)) { boolean any = FALSE; + int num_conts = 0; if (!able_to_loot(cc.x, cc.y, TRUE)) return 0; - for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) { - nobj = cobj->nexthere; - if (Is_container(cobj)) { - c = ynq(safe_qbuf(qbuf, "There is ", " here, loot it?", - cobj, doname, ansimpleoname, "a container")); - if (c == 'q') return (timepassed); - if (c == 'n') continue; - any = TRUE; + for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = cobj->nexthere) + if (Is_container(cobj)) num_conts++; - if (cobj->olocked) { - pline("%s locked.", cobj->lknown ? "It is" : - "Hmmm, it turns out to be"); - cobj->lknown = 1; - continue; + if (num_conts > 1) { + /* use a menu to loot many containers */ + int n, i; + winid win; + anything any; + menu_item *pick_list = NULL; + + any.a_void = 0; + win = create_nhwindow(NHW_MENU); + start_menu(win); + + for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = cobj->nexthere) + if (Is_container(cobj)) { + any.a_obj = cobj; + add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, doname(cobj), MENU_UNSELECTED); } - cobj->lknown = 1; + end_menu(win, "Loot which containers?"); + n = select_menu(win, PICK_ANY, &pick_list); + destroy_nhwindow(win); - if (cobj->otyp == BAG_OF_TRICKS) { - int tmp; - You("carefully open the bag..."); - pline("It develops a huge set of teeth and bites you!"); - tmp = rnd(10); - losehp(Maybe_Half_Phys(tmp), "carnivorous bag", KILLED_BY_AN); - makeknown(BAG_OF_TRICKS); - timepassed = 1; - continue; + if (n > 0) { + for (i = 0; i < n; i++) { + timepassed |= do_loot_cont(&pick_list[i].item.a_obj); + if (multi < 0 || !pick_list[i].item.a_obj) { + free((genericptr_t) pick_list); + return 1; + } } - - You("%sopen %s...", - (!cobj->cknown || !cobj->lknown) ? "carefully " : "", - the(xname(cobj))); - timepassed |= use_container(&cobj, 0); - /* might have triggered chest trap or magic bag explosion */ - if (multi < 0 || !cobj) return 1; } + if (pick_list) free((genericptr_t) pick_list); + if (n != 0) c = 'y'; + } else { + for (cobj = level.objects[cc.x][cc.y]; cobj; cobj = nobj) { + nobj = cobj->nexthere; + + if (Is_container(cobj)) { + c = ynq(safe_qbuf(qbuf, "There is ", " here, loot it?", + cobj, doname, ansimpleoname, "a container")); + if (c == 'q') return (timepassed); + if (c == 'n') continue; + any = TRUE; + + timepassed |= do_loot_cont(&cobj); + /* might have triggered chest trap or magic bag explosion */ + if (multi < 0 || !cobj) return 1; + } + } + if (any) c = 'y'; } - if (any) c = 'y'; } else if (IS_GRAVE(levl[cc.x][cc.y].typ)) { You("need to dig up the grave to effectively loot it..."); } diff --git a/src/role.c b/src/role.c index 59624c528..2e2cbabae 100644 --- a/src/role.c +++ b/src/role.c @@ -1332,12 +1332,15 @@ plnamesuffix() char *sptr, *eptr; int i; +#ifdef GENERIC_USERNAMES /* some generic user names will be ignored in favor of prompting */ i = (int)strlen(plname); - if ((i >= 4 && !strncmpi(plname, "player", i)) || /* play[er] */ - (i >= 4 && !strncmpi(plname, "games", i)) || /* game[s] */ - (i >= 7 && !strncmpi(plname, "nethacker", i))) /* nethack[er] */ + eptr = GENERIC_USERNAMES; + sptr = strstri(eptr, plname); + if (sptr && ((sptr == eptr && (sptr[i] == ' ' || sptr[i] == '\0')) + || sptr[i] == ' ' || sptr[i] == '\0')) *plname = '\0'; /* call askname() */ +#endif do { if (!*plname) askname(); /* fill plname[] if necessary */