Merge branch 'NetHack-3.6.2'
This commit is contained in:
45
src/cmd.c
45
src/cmd.c
@@ -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 },
|
||||
|
||||
18
src/hack.c
18
src/hack.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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*/
|
||||
|
||||
39
src/trap.c
39
src/trap.c
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user