Merge branch 'NetHack-3.6.2'

This commit is contained in:
nhmall
2018-09-28 20:01:41 -04:00
13 changed files with 168 additions and 89 deletions

View File

@@ -47,7 +47,6 @@ extern const char *enc_stat[]; /* encumbrance status from botl.c */
#ifdef DEBUG
extern int NDECL(wiz_debug_cmd_bury);
extern int NDECL(wiz_debug_cmd_traveldisplay);
#endif
#ifdef DUMB /* stuff commented out in extern.h, but needed here */
@@ -154,7 +153,6 @@ STATIC_PTR int NDECL(wiz_show_seenv);
STATIC_PTR int NDECL(wiz_show_vision);
STATIC_PTR int NDECL(wiz_smell);
STATIC_PTR int NDECL(wiz_intrinsic);
STATIC_PTR int NDECL(wiz_mon_polycontrol);
STATIC_PTR int NDECL(wiz_show_wmodes);
STATIC_DCL void NDECL(wiz_map_levltyp);
STATIC_DCL void NDECL(wiz_levltyp_legend);
@@ -399,14 +397,24 @@ doextlist(VOID_ARGS)
if (!*searchbuf) {
any.a_int = 2;
add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE,
/* was 's', but then using ':' handling within the interface
would only examine the two or three meta entries, not the
actual list of extended commands shown via separator lines;
having ':' as an explicit selector overrides the default
menu behavior for it; we retain 's' as a group accelerator */
add_menu(menuwin, NO_GLYPH, &any, ':', 's', ATR_NONE,
"Search extended commands", MENU_UNSELECTED);
} else {
Strcpy(buf, "Show all, clear search");
if (strlen(buf) + strlen(searchbuf) + strlen(" (\"\")") < QBUFSZ)
Sprintf(eos(buf), " (\"%s\")", searchbuf);
any.a_int = 3;
add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE,
/* specifying ':' as a group accelerator here is mostly a
statement of intent (we'd like to accept it as a synonym but
also want to hide it from general menu use) because it won't
work for interfaces which support ':' to search; use as a
general menu command takes precedence over group accelerator */
add_menu(menuwin, NO_GLYPH, &any, 's', ':', ATR_NONE,
buf, MENU_UNSELECTED);
}
if (wizard) {
@@ -415,7 +423,7 @@ doextlist(VOID_ARGS)
onelist ? "Show debugging commands in separate section"
: "Show all alphabetically, including debugging commands",
MENU_UNSELECTED);
}
}
any = zeroany;
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"", MENU_UNSELECTED);
@@ -434,8 +442,13 @@ doextlist(VOID_ARGS)
continue;
/* if searching, skip this command if it doesn't match */
if (*searchbuf
/* first try case-insensitive substring match */
&& !strstri(efp->ef_txt, searchbuf)
&& !strstri(efp->ef_desc, searchbuf))
&& !strstri(efp->ef_desc, searchbuf)
/* wildcard support; most interfaces use case-insensitve
pmatch rather than regexp for menu searching */
&& !pmatchi(searchbuf, efp->ef_txt)
&& !pmatchi(searchbuf, efp->ef_desc))
continue;
/* skip wizard mode commands if not in wizard mode;
when showing two sections, skip wizard mode commands
@@ -480,7 +493,7 @@ doextlist(VOID_ARGS)
menumode = 1 - menumode; /* toggle 0 -> 1, 1 -> 0 */
redisplay = TRUE;
break;
case 2: /* 's' when not searching yet: enable search */
case 2: /* ':' when not searching yet: enable search */
search = TRUE;
break;
case 3: /* 's' when already searching: disable search */
@@ -494,7 +507,7 @@ doextlist(VOID_ARGS)
onelist = 1 - onelist; /* toggle 0 -> 1, 1 -> 0 */
redisplay = TRUE;
break;
}
}
free((genericptr_t) selected);
} else {
search = FALSE;
@@ -878,16 +891,6 @@ wiz_level_tele(VOID_ARGS)
return 0;
}
/* #monpolycontrol command - choose new form for shapechangers, polymorphees */
STATIC_PTR int
wiz_mon_polycontrol(VOID_ARGS)
{
iflags.mon_polycontrol = !iflags.mon_polycontrol;
pline("Monster polymorph control is %s.",
iflags.mon_polycontrol ? "on" : "off");
return 0;
}
/* #levelchange command - adjust hero's experience level */
STATIC_PTR int
wiz_level_change(VOID_ARGS)
@@ -3062,8 +3065,6 @@ struct ext_func_tab extcmdlist[] = {
{ '\0', "migratemons", "migrate N random monsters",
wiz_migrate_mons, IFBURIED | AUTOCOMPLETE | WIZMODECMD },
#endif
{ '\0', "monpolycontrol", "control monster polymorphs",
wiz_mon_polycontrol, IFBURIED | AUTOCOMPLETE | WIZMODECMD },
{ M('m'), "monster", "use monster's special ability",
domonability, IFBURIED | AUTOCOMPLETE },
{ 'N', "name", "name a monster or an object",
@@ -3166,10 +3167,8 @@ struct ext_func_tab extcmdlist[] = {
{ 'w', "wield", "wield (put in use) a weapon", dowield },
{ M('w'), "wipe", "wipe off your face", dowipe, AUTOCOMPLETE },
#ifdef DEBUG
{ '\0', "wizdebug_bury", "wizard debug: bury objs under and around you",
{ '\0', "wizbury", "bury objs under and around you",
wiz_debug_cmd_bury, IFBURIED | AUTOCOMPLETE | WIZMODECMD },
{ '\0', "wizdebug_traveldisplay", "wizard debug: toggle travel display",
wiz_debug_cmd_traveldisplay, IFBURIED | AUTOCOMPLETE | WIZMODECMD },
#endif
{ C('e'), "wizdetect", "reveal hidden things within a small radius",
wiz_detect, IFBURIED | AUTOCOMPLETE | WIZMODECMD },

View File

@@ -897,17 +897,6 @@ int mode;
return TRUE;
}
#ifdef DEBUG
static boolean trav_debug = FALSE;
/* in this case, toggle display of travel debug info */
int wiz_debug_cmd_traveldisplay()
{
trav_debug = !trav_debug;
return 0;
}
#endif /* DEBUG */
/*
* Find a path from the destination (u.tx,u.ty) back to (u.ux,u.uy).
* A shortest path is returned. If guess is TRUE, consider various
@@ -1065,7 +1054,7 @@ int mode;
}
#ifdef DEBUG
if (trav_debug) {
if (iflags.trav_debug) {
/* Use of warning glyph is arbitrary. It stands out. */
tmp_at(DISP_ALL, warning_to_glyph(1));
for (i = 0; i < nn; ++i) {
@@ -1121,7 +1110,7 @@ int mode;
goto found;
}
#ifdef DEBUG
if (trav_debug) {
if (iflags.trav_debug) {
/* Use of warning glyph is arbitrary. It stands out. */
tmp_at(DISP_ALL, warning_to_glyph(2));
tmp_at(px, py);
@@ -2053,6 +2042,7 @@ boolean pick;
struct monst *mtmp;
struct trap *trap = t_at(u.ux, u.uy);
int trapflag = iflags.failing_untrap ? FORCETRAP : 0;
/* prevent recursion from affecting the hero all over again
[hero poly'd to iron golem enters water here, drown() inflicts
@@ -2118,7 +2108,7 @@ boolean pick;
if (!spottrap || spottraptyp != trap->ttyp) {
spottrap = trap;
spottraptyp = trap->ttyp;
dotrap(trap, 0); /* fall into arrow trap, etc. */
dotrap(trap, trapflag); /* fall into arrow trap, etc. */
spottrap = (struct trap *) 0;
spottraptyp = NO_TRAP;
}

View File

@@ -160,6 +160,7 @@ static struct Bool_Opt {
#else
{ "menu_overlay", (boolean *) 0, FALSE, SET_IN_FILE },
#endif
{ "monpolycontrol", &iflags.mon_polycontrol, FALSE, SET_IN_WIZGAME },
{ "mouse_support", &iflags.wc_mouse_support, TRUE, DISP_IN_GAME }, /*WC*/
#ifdef NEWS
{ "news", &iflags.news, TRUE, DISP_IN_GAME },
@@ -173,7 +174,7 @@ static struct Bool_Opt {
#else
{ "page_wait", (boolean *) 0, FALSE, SET_IN_FILE },
#endif
/* 3.6.2: move perm_invent from flags to inflags and out of save file */
/* 3.6.2: move perm_invent from flags to iflags and out of save file */
{ "perm_invent", &iflags.perm_invent, FALSE, SET_IN_GAME },
{ "pickup_thrown", &flags.pickup_thrown, TRUE, SET_IN_GAME },
{ "popup_dialog", &iflags.wc_popup_dialog, FALSE, SET_IN_GAME }, /*WC*/
@@ -221,6 +222,9 @@ static struct Bool_Opt {
{ "tombstone", &flags.tombstone, TRUE, SET_IN_GAME },
{ "toptenwin", &iflags.toptenwin, FALSE, SET_IN_GAME },
{ "travel", &flags.travelcmd, TRUE, SET_IN_GAME },
#ifdef DEBUG
{ "travel_debug", &iflags.trav_debug, FALSE, SET_IN_WIZGAME }, /*hack.c*/
#endif
{ "use_darkgray", &iflags.wc2_darkgray, TRUE, SET_IN_FILE },
#ifdef WIN32
{ "use_inverse", &iflags.wc_inverse, TRUE, SET_IN_GAME }, /*WC*/

View File

@@ -886,8 +886,7 @@ unsigned trflags;
/* then proceed to normal trap effect */
} else if (already_seen && !forcetrap) {
if ((Levitation || (Flying && !plunged))
&& (is_pit(ttype) || ttype == HOLE
|| ttype == BEAR_TRAP)) {
&& (is_pit(ttype) || ttype == HOLE || ttype == BEAR_TRAP)) {
You("%s over %s %s.", Levitation ? "float" : "fly",
a_your[trap->madeby_u],
defsyms[trap_to_defsym(ttype)].explanation);
@@ -1198,16 +1197,23 @@ unsigned trflags;
if (ttype == SPIKED_PIT) {
oldumort = u.umortality;
losehp(Maybe_Half_Phys(rnd(conj_pit ? 4 : adj_pit ? 6 : 10)),
/* note: these don't need locomotion() handling;
if fatal while poly'd and Unchanging, the
death reason will be overridden with
"killed while stuck in creature form" */
plunged
? "deliberately plunged into a pit of iron spikes"
: conj_pit ? "stepped into a pit of iron spikes"
: adj_pit ? "stumbled into a pit of iron spikes"
: "fell into a pit of iron spikes",
? "deliberately plunged into a pit of iron spikes"
: conj_pit
? "stepped into a pit of iron spikes"
: adj_pit
? "stumbled into a pit of iron spikes"
: "fell into a pit of iron spikes",
NO_KILLER_PREFIX);
if (!rn2(6))
poisoned("spikes", A_STR,
(conj_pit || adj_pit) ? "stepping on poison spikes"
: "fall onto poison spikes",
(conj_pit || adj_pit)
? "stepping on poison spikes"
: "fall onto poison spikes",
/* if damage triggered life-saving,
poison is limited to attrib loss */
(u.umortality > oldumort) ? 0 : 8, FALSE);
@@ -3912,7 +3918,14 @@ struct trap *ttmp;
there are objects covering this trap */
ttmp->tseen = 0; /* hack for check_here() */
/* trigger the trap */
iflags.failing_untrap++; /* spoteffects() -> dotrap(,FORCETRAP) */
spoteffects(TRUE); /* pickup() + dotrap() */
iflags.failing_untrap--;
/* this should no longer be necessary; before the failing_untrap
hack, Flying hero would not trigger an unseen bear trap and
setting it not-yet-seen above resulted in leaving it hidden */
if ((ttmp = t_at(u.ux, u.uy)) != 0)
ttmp->tseen = 1;
exercise(A_WIS, FALSE);
}
}
@@ -3991,16 +4004,6 @@ boolean force_failure;
}
} else if (under_u) {
dotrap(ttmp, 0);
} else if (ttype == BEAR_TRAP && (Levitation || Flying)) {
/* There was a report of oddities of the trap
vanishing from view due to tseen being cleared
(which was deliberate to work around a check_here()
issue). Since you won't actually end up in the trap
during the #untrap operation anyway due to
Levitation and Flying checks further along,
just avoid the whole "vanishing trap" scenario
by failing the #untrap operation right here. */
You("couldn't reach it from your vantage point.");
} else {
move_into_trap(ttmp);
}