Merge branch 'NetHack-3.6.0' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.6.0

This commit is contained in:
nhmall
2016-01-06 20:21:29 -05:00
33 changed files with 449 additions and 135 deletions
+1 -1
View File
@@ -218,7 +218,7 @@ MONSTER:random,random
LEVEL:"medusa-3" LEVEL:"medusa-3"
FLAGS: noteleport,mazelevel FLAGS: noteleport,mazelevel,shortsighted
INIT_MAP:solidfill,' ' INIT_MAP:solidfill,' '
GEOMETRY:center,center GEOMETRY:center,center
# #
+33 -8
View File
@@ -573,7 +573,7 @@ according its victims the dignity of hatred. It wouldn't even notice them.
# #
# #
# #
%title Equal Rites (9) %title Equal Rites (10)
# p. 118 (Signet edition; passage starts mid-sentence and ends mid-paragraph) # p. 118 (Signet edition; passage starts mid-sentence and ends mid-paragraph)
%passage 1 %passage 1
[...] it is well known that a vital ingredient of success is not knowing [...] it is well known that a vital ingredient of success is not knowing
@@ -650,11 +650,7 @@ rewrite them so that they don't apply to you.
[Equal Rites, by Terry Pratchett] [Equal Rites, by Terry Pratchett]
%e passage %e passage
# pp. 119-120 ("what is happening here?" actually omits "is" but # pp. 119-120 (next passage is a direct continuation of this one)
# must be a typo--fixed here to avoid bug reports;
# 'broomstick' is Esk's disguised wizard's staff;
# passage continues with questions about destination and
# why go overland when the river goes to the same place)
%passage 7 %passage 7
The town was smaller than Ohulan, and very different because it lay on the The town was smaller than Ohulan, and very different because it lay on the
junction of three trade routes quite apart from the river itself. It was junction of three trade routes quite apart from the river itself. It was
@@ -678,6 +674,13 @@ nevertheless, there were still people misguided enough to endure all this,
plus long nights in uncomfortable surroundings, merely to get their hands plus long nights in uncomfortable surroundings, merely to get their hands
on perfectly ordinary large boxes of jewels. on perfectly ordinary large boxes of jewels.
[Equal Rites, by Terry Pratchett]
%e passage
# pp. 120-121 (this passage is a direct continuation of preceding one;
# "I said, what is happening here?" actually omits "is"
# but must be a typo--fixed here to avoid bug reports;
# 'broomstick' is Esk's disguised wizard's staff)
%passage 8
So a town like Zemphis was the place where caravans split, mingled and So a town like Zemphis was the place where caravans split, mingled and
came together again, as dozens of merchants and travellers banded together came together again, as dozens of merchants and travellers banded together
for protection against the socially disadvantaged on the trails ahead. for protection against the socially disadvantaged on the trails ahead.
@@ -704,10 +707,32 @@ He explained about the caravans. The child nodded.
"Precisely." "Precisely."
"Where to?"
"All sorts of places. Sto Lat, Pseudopolis... Ankh-Morpork, of course...."
"But the river goes there," said Esk, reasonably. "Barges. The Zoons."
"Ah, yes," said the merchant, "but they charge high prices and they can't
carry everything and, anyway, no one trusts them much."
"But they're very honest!"
"Huh, yes," he said. "But you know what they say: never trust an honest
man." He smiled knowingly.
"Who says that?"
"They do. You know. People," he said, a certain uneasiness entering his
voice.
"Oh," said Esk. She thought about it. "They must be very silly," she said
primly. "Thank you, anyway."
[Equal Rites, by Terry Pratchett] [Equal Rites, by Terry Pratchett]
%e passage %e passage
# pp. 127-128 (this time broomstick is Granny's defective witch's broomstick) # pp. 127-128 (this time broomstick is Granny's defective witch's broomstick)
%passage 8 %passage 9
The broomstick lay between two trestles. Granny Weatherwax sat on a rock The broomstick lay between two trestles. Granny Weatherwax sat on a rock
outcrop while a dwarf half her height, wearing an apron that was a mass of outcrop while a dwarf half her height, wearing an apron that was a mass of
pockets, walked around the broom and occasionally poked it. pockets, walked around the broom and occasionally poked it.
@@ -759,7 +784,7 @@ back of his skull.
[Equal Rites, by Terry Pratchett] [Equal Rites, by Terry Pratchett]
%e passage %e passage
# p. 185 (actually uses four periods to mark a sentence ending in a elipsis) # p. 185 (actually uses four periods to mark a sentence ending in a elipsis)
%passage 9 %passage 10
There may be universes where librarianship is considered a peaceful sort of There may be universes where librarianship is considered a peaceful sort of
occupation, and where the risks are limited to large volumes falling off occupation, and where the risks are limited to large volumes falling off
the shelves on to one's head, but the keeper of a /magic/ library is no job the shelves on to one's head, but the keeper of a /magic/ library is no job
+24 -1
View File
@@ -83,6 +83,20 @@ fix "killing by kicking something weird" when kicking an object causes death
guard macros available for mextra fields similar to those for oextra fields guard macros available for mextra fields similar to those for oextra fields
compile-time option for an alternate paniclog format for public server use compile-time option for an alternate paniclog format for public server use
make monsters forget where they stepped when fleeing or teleporting make monsters forget where they stepped when fleeing or teleporting
requiver pickup_thrown objects if quiver is empty
make mimics mimicing walls or trees also block light
stepping onto lava destroyed non-fireproof water walking boots but left other
vulnerable boot types intact
fix death reason when eating tainted glob of <monster> (not corpse)
use appropriate place name for drum of earthquake shakes
fix unmapped branch stairs on sokoban level
redraw map when hilite_pile is toggled to display the highlighting
make commands that accept a count prefix for item selection
show "Count:" like command repeating does
make vault guard accept names starting with number
fix weight of containers in special levels
make the raven medusa level shortsighted
fix possible segfault in lev_comp when map was too tall
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes
@@ -91,6 +105,8 @@ tty: M-N gave "Unknown command 'M-" with "'." finishing the sentence on the
line below it, leaving bogus '.' displayed on the top row of the map line below it, leaving bogus '.' displayed on the top row of the map
tty: specifying all four of role, race, gender, and alignment still prompted tty: specifying all four of role, race, gender, and alignment still prompted
for confirmation with "Is this ok?" before starting play for confirmation with "Is this ok?" before starting play
tty: responding with <return> or <enter> duing role, race, &c selection
behaved same as <escape> to quit; now it will pick [random] instead
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/tty: fix compile warning about 'has_colors' for some configurations unix/tty: fix compile warning about 'has_colors' for some configurations
@@ -112,10 +128,17 @@ General New Features
-------------------- --------------------
naming Sting or Orcrist now breaks illiterate conduct naming Sting or Orcrist now breaks illiterate conduct
different feedback for reading a scroll of mail created by writing with marker different feedback for reading a scroll of mail created by writing with marker
wizard mode #wizintrinsic
reading non-cursed scroll of enchant weapon uncurses welded tin opener reading non-cursed scroll of enchant weapon uncurses welded tin opener
if hero has no jumping ability but knows the jumping spell, the #jump command if hero has no jumping ability but knows the jumping spell, the #jump command
will attempt to cast the spell will attempt to cast the spell
allow moving cursor to monsters with 'm' (nearest first) and 'M' (furthest
first) when asked for map location, or to objects with 'o' and 'O'
allow picking a used inventory letter from menu when #adjusting
zapping wand of opening at yourself, unlock carried boxes
dissolve iron bars by force-fighting with wielded potion of acid
poison breath leaves a trail of poison gas
allow knife and stiletto as possible tin opening tools
wizard mode #wizintrinsic command
additional tribute passages for The Colour of Magic, The Light Fantastic, additional tribute passages for The Colour of Magic, The Light Fantastic,
Equal Rites, Snuff, and Raising Steam Equal Rites, Snuff, and Raising Steam
compile-time options SIMPLE_MAIL and SERVER_ADMIN_MSG for public server use compile-time options SIMPLE_MAIL and SERVER_ADMIN_MSG for public server use
+8 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 extern.h $NHDT-Date: 1451955077 2016/01/05 00:51:17 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.530 $ */ /* NetHack 3.6 extern.h $NHDT-Date: 1452123455 2016/01/06 23:37:35 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.535 $ */
/* Copyright (c) Steve Creps, 1988. */ /* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -204,6 +204,7 @@ E int FDECL(isok, (int, int));
E int FDECL(get_adjacent_loc, E int FDECL(get_adjacent_loc,
(const char *, const char *, XCHAR_P, XCHAR_P, coord *)); (const char *, const char *, XCHAR_P, XCHAR_P, coord *));
E const char *FDECL(click_to_cmd, (int, int, int)); E const char *FDECL(click_to_cmd, (int, int, int));
E char FDECL(get_count, (char *, CHAR_P, long, long *));
#ifdef HANGUPHANDLING #ifdef HANGUPHANDLING
E void FDECL(hangup, (int)); E void FDECL(hangup, (int));
E void NDECL(end_of_input); E void NDECL(end_of_input);
@@ -498,6 +499,7 @@ E void FDECL(endmultishot, (BOOLEAN_P));
E void FDECL(hitfloor, (struct obj *)); E void FDECL(hitfloor, (struct obj *));
E void FDECL(hurtle, (int, int, int, BOOLEAN_P)); E void FDECL(hurtle, (int, int, int, BOOLEAN_P));
E void FDECL(mhurtle, (struct monst *, int, int, int)); E void FDECL(mhurtle, (struct monst *, int, int, int));
E boolean FDECL(throwing_weapon, (struct obj *));
E void FDECL(throwit, (struct obj *, long, BOOLEAN_P)); E void FDECL(throwit, (struct obj *, long, BOOLEAN_P));
E int FDECL(omon_adj, (struct monst *, struct obj *, BOOLEAN_P)); E int FDECL(omon_adj, (struct monst *, struct obj *, BOOLEAN_P));
E int FDECL(thitmonst, (struct monst *, struct obj *)); E int FDECL(thitmonst, (struct monst *, struct obj *));
@@ -1201,6 +1203,7 @@ E boolean FDECL(bad_location, (XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P,
XCHAR_P, XCHAR_P)); XCHAR_P, XCHAR_P));
E void FDECL(place_lregion, (XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, E void FDECL(place_lregion, (XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P,
XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, d_level *)); XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, d_level *));
E void NDECL(fixup_special);
E void NDECL(fumaroles); E void NDECL(fumaroles);
E void NDECL(movebubbles); E void NDECL(movebubbles);
E void NDECL(water_friction); E void NDECL(water_friction);
@@ -1498,9 +1501,10 @@ E boolean FDECL(lined_up, (struct monst *));
E struct obj *FDECL(m_carrying, (struct monst *, int)); E struct obj *FDECL(m_carrying, (struct monst *, int));
E void FDECL(m_useupall, (struct monst *, struct obj *)); E void FDECL(m_useupall, (struct monst *, struct obj *));
E void FDECL(m_useup, (struct monst *, struct obj *)); E void FDECL(m_useup, (struct monst *, struct obj *));
E void FDECL(m_throw, E void FDECL(m_throw, (struct monst *, int, int, int, int, int, struct obj *));
(struct monst *, int, int, int, int, int, struct obj *)); E void FDECL(hit_bars, (struct obj **, int, int, int, int,
E boolean FDECL(hits_bars, (struct obj **, int, int, int, int)); BOOLEAN_P, BOOLEAN_P));
E boolean FDECL(hits_bars, (struct obj **, int, int, int, int, int, int));
/* ### muse.c ### */ /* ### muse.c ### */
+3
View File
@@ -29,6 +29,9 @@
#define EXT_ENCUMBER 4 /* Overtaxed */ #define EXT_ENCUMBER 4 /* Overtaxed */
#define OVERLOADED 5 /* Overloaded */ #define OVERLOADED 5 /* Overloaded */
/* weight increment of heavy iron ball */
#define IRON_BALL_W_INCR 160
/* hunger states - see hu_stat in eat.c */ /* hunger states - see hu_stat in eat.c */
#define SATIATED 0 #define SATIATED 0
#define NOT_HUNGRY 1 #define NOT_HUNGRY 1
+10
View File
@@ -159,6 +159,16 @@ struct monst {
#define is_vampshifter(mon) \ #define is_vampshifter(mon) \
((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LORD \ ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LORD \
|| (mon)->cham == PM_VLAD_THE_IMPALER) || (mon)->cham == PM_VLAD_THE_IMPALER)
/* mimic appearances that block vision/light */
#define is_lightblocker_mappear(mon) \
(is_obj_mappear(mon, BOULDER) || \
((mon)->m_ap_type == M_AP_FURNITURE \
&& ((mon)->mappearance == S_hcdoor \
|| (mon)->mappearance == S_vcdoor \
|| (mon)->mappearance < S_ndoor /* = walls */ \
|| (mon)->mappearance == S_tree)))
#define is_door_mappear(mon) ((mon)->m_ap_type == M_AP_FURNITURE \ #define is_door_mappear(mon) ((mon)->m_ap_type == M_AP_FURNITURE \
&& ((mon)->mappearance == S_hcdoor || (mon)->mappearance == S_vcdoor)) && ((mon)->mappearance == S_hcdoor || (mon)->mappearance == S_vcdoor))
#define is_obj_mappear(mon,otyp) ((mon)->m_ap_type == M_AP_OBJECT \ #define is_obj_mappear(mon,otyp) ((mon)->m_ap_type == M_AP_OBJECT \
-2
View File
@@ -773,8 +773,6 @@ beautiful()
: "ugly"); : "ugly");
} }
#define WEAK 3 /* from eat.c */
static const char look_str[] = "look %s."; static const char look_str[] = "look %s.";
STATIC_OVL int STATIC_OVL int
+61 -20
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 cmd.c $NHDT-Date: 1451082253 2015/12/25 22:24:13 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.212 $ */ /* NetHack 3.6 cmd.c $NHDT-Date: 1452123457 2016/01/06 23:37:37 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.216 $ */
/* 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. */
@@ -3864,6 +3864,60 @@ int x, y, mod;
return cmd; return cmd;
} }
char
get_count(allowchars, inkey, maxcount, count)
char *allowchars;
char inkey;
long maxcount;
long *count;
{
char qbuf[QBUFSZ];
int key;
long cnt = 0L;
boolean backspaced = FALSE;
/* this should be done in port code so that we have erase_char
and kill_char available; we can at least fake erase_char */
#define STANDBY_erase_char '\177'
for (;;) {
if (inkey) {
key = inkey;
inkey = '\0';
} else
key = readchar();
if (digit(key)) {
cnt = 10L * cnt + (long) (key - '0');
if (cnt < 0)
cnt = 0;
else if (maxcount > 0 && cnt > maxcount)
cnt = maxcount;
} else if (key == '\b' || key == STANDBY_erase_char) {
cnt = cnt / 10;
backspaced = TRUE;
} else if (key == '\033') {
break;
} else if (!allowchars || index(allowchars, key)) {
*count = cnt;
break;
}
if (cnt > 9 || backspaced) {
clear_nhwindow(WIN_MESSAGE);
if (backspaced && !cnt) {
Sprintf(qbuf, "Count: ");
} else {
Sprintf(qbuf, "Count: %ld", cnt);
backspaced = FALSE;
}
pline1(qbuf);
mark_synch();
}
}
return key;
}
STATIC_OVL char * STATIC_OVL char *
parse() parse()
{ {
@@ -3882,25 +3936,12 @@ parse()
#ifdef ALTMETA #ifdef ALTMETA
alt_esc = iflags.altmeta; /* readchar() hack */ alt_esc = iflags.altmeta; /* readchar() hack */
#endif #endif
if (!Cmd.num_pad || (foo = readchar()) == 'n') if (!Cmd.num_pad || (foo = readchar()) == 'n') {
for (;;) { long tmpmulti = multi;
foo = readchar();
if (foo >= '0' && foo <= '9') { foo = get_count(NULL, '\0', LARGEST_INT, &tmpmulti);
multi = 10 * multi + foo - '0'; last_multi = multi = tmpmulti;
if (multi < 0 || multi >= LARGEST_INT) }
multi = LARGEST_INT;
if (multi > 9) {
clear_nhwindow(WIN_MESSAGE);
Sprintf(in_line, "Count: %d", multi);
pline1(in_line);
mark_synch();
}
last_multi = multi;
if (!multi && foo == '0')
prezero = TRUE;
} else
break; /* not a digit */
}
#ifdef ALTMETA #ifdef ALTMETA
alt_esc = FALSE; /* readchar() reset */ alt_esc = FALSE; /* readchar() reset */
#endif #endif
+1 -2
View File
@@ -1201,8 +1201,7 @@ set_mimic_blocking()
for (mon = fmon; mon; mon = mon->nmon) { for (mon = fmon; mon; mon = mon->nmon) {
if (DEADMONSTER(mon)) if (DEADMONSTER(mon))
continue; continue;
if (mon->minvis && (is_door_mappear(mon) if (mon->minvis && is_lightblocker_mappear(mon)) {
|| is_obj_mappear(mon,BOULDER))) {
if (See_invisible) if (See_invisible)
block_point(mon->mx, mon->my); block_point(mon->mx, mon->my);
else else
+130 -3
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 do_name.c $NHDT-Date: 1450178550 2015/12/15 11:22:30 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.80 $ */ /* NetHack 3.6 do_name.c $NHDT-Date: 1452064740 2016/01/06 07:19:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.84 $ */
/* 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. */
@@ -6,6 +6,9 @@
STATIC_DCL char *NDECL(nextmbuf); STATIC_DCL char *NDECL(nextmbuf);
STATIC_DCL void FDECL(getpos_help, (BOOLEAN_P, const char *)); STATIC_DCL void FDECL(getpos_help, (BOOLEAN_P, const char *));
STATIC_DCL int FDECL(CFDECLSPEC cmp_coord_distu, (const void *,
const void *));
STATIC_OVL void FDECL(gather_locs, (coord **, int *, BOOLEAN_P));
STATIC_DCL void NDECL(do_mname); STATIC_DCL void NDECL(do_mname);
STATIC_DCL boolean FDECL(alreadynamed, (struct monst *, char *, char *)); STATIC_DCL boolean FDECL(alreadynamed, (struct monst *, char *, char *));
STATIC_DCL void FDECL(do_oname, (struct obj *)); STATIC_DCL void FDECL(do_oname, (struct obj *));
@@ -30,7 +33,7 @@ nextmbuf()
/* function for getpos() to highlight desired map locations. /* function for getpos() to highlight desired map locations.
* parameter value 0 = initialize, 1 = highlight, 2 = done * parameter value 0 = initialize, 1 = highlight, 2 = done
*/ */
void FDECL((*getpos_hilitefunc), (int)) = (void FDECL((*), (int))) 0; static void FDECL((*getpos_hilitefunc), (int)) = (void FDECL((*), (int))) 0;
void void
getpos_sethilite(f) getpos_sethilite(f)
@@ -55,6 +58,8 @@ const char *goal;
putstr(tmpwin, 0, "Use [HJKL] to move the cursor 8 units at a time."); putstr(tmpwin, 0, "Use [HJKL] to move the cursor 8 units at a time.");
putstr(tmpwin, 0, "Or enter a background symbol (ex. <)."); putstr(tmpwin, 0, "Or enter a background symbol (ex. <).");
putstr(tmpwin, 0, "Use @ to move the cursor on yourself."); putstr(tmpwin, 0, "Use @ to move the cursor on yourself.");
putstr(tmpwin, 0, "Use m or M to move the cursor to next monster.");
putstr(tmpwin, 0, "Use o or O to move the cursor to next object.");
if (getpos_hilitefunc) if (getpos_hilitefunc)
putstr(tmpwin, 0, "Use $ to display valid locations."); putstr(tmpwin, 0, "Use $ to display valid locations.");
putstr(tmpwin, 0, "Use # to toggle automatic description."); putstr(tmpwin, 0, "Use # to toggle automatic description.");
@@ -71,6 +76,80 @@ const char *goal;
destroy_nhwindow(tmpwin); destroy_nhwindow(tmpwin);
} }
STATIC_OVL int
cmp_coord_distu(a, b)
const void *a;
const void *b;
{
const coord *c1 = a;
const coord *c2 = b;
int dx, dy, dist_1, dist_2;
dx = u.ux - c1->x;
dy = u.uy - c1->y;
dist_1 = dx * dx + dy * dy;
dx = u.ux - c2->x;
dy = u.uy - c2->y;
dist_2 = dx * dx + dy * dy;
return dist_1 - dist_2;
}
/* gather locations for monsters or objects shown on the map */
STATIC_OVL void
gather_locs(arr_p, cnt_p, do_mons)
coord **arr_p;
int *cnt_p;
boolean do_mons;
{
int x, y, pass, glyph, idx;
*cnt_p = idx = 0;
for (pass = 0; pass < 2; pass++) {
if (pass) {
/* *cnt_p + 1: always allocate a non-zero amount */
*arr_p = (coord *) alloc(sizeof (coord) * (*cnt_p + 1));
if (!*cnt_p) {
/* needed for caller's mon[0].x,.y==u.ux,.uy check */
(*arr_p)[0].x = (*arr_p)[0].y = 0;
break;
}
}
for (x = 1; x < COLNO; x++)
for (y = 0; y < ROWNO; y++) {
glyph = glyph_at(x, y);
if (do_mons) {
/* unlike '/M', this skips monsters revealed by
* warning glyphs and remembered invisible ones;
* TODO: skip worm tails
*/
if (glyph_is_monster(glyph)) {
if (!pass) {
++*cnt_p;
} else {
(*arr_p)[idx].x = x;
(*arr_p)[idx].y = y;
++idx;
}
}
} else { /* objects */
/* TODO: skip boulders and rocks */
if (glyph_is_object(glyph)) {
if (!pass) {
++*cnt_p;
} else {
(*arr_p)[idx].x = x;
(*arr_p)[idx].y = y;
++idx;
}
}
}
}
} /* pass */
if (*cnt_p)
qsort(*arr_p, *cnt_p, sizeof (coord), cmp_coord_distu);
}
int int
getpos(ccp, force, goal) getpos(ccp, force, goal)
coord *ccp; coord *ccp;
@@ -85,6 +164,8 @@ const char *goal;
static const char pick_chars[] = ".,;:"; static const char pick_chars[] = ".,;:";
const char *cp; const char *cp;
boolean hilite_state = FALSE; boolean hilite_state = FALSE;
coord *monarr = (coord *) 0, *objarr = (coord *) 0;
int moncount = 0, monidx = 0, objcount = 0, objidx = 0;
if (!goal) if (!goal)
goal = "desired location"; goal = "desired location";
@@ -192,7 +273,7 @@ const char *goal;
if (c == '?' || redraw_cmd(c)) { if (c == '?' || redraw_cmd(c)) {
if (c == '?') if (c == '?')
getpos_help(force, goal); getpos_help(force, goal);
else /* ^R */ else /* ^R */
docrt(); /* redraw */ docrt(); /* redraw */
/* update message window to reflect that we're still targetting */ /* update message window to reflect that we're still targetting */
show_goal_msg = TRUE; show_goal_msg = TRUE;
@@ -217,10 +298,52 @@ const char *goal;
cx = u.ux; cx = u.ux;
cy = u.uy; cy = u.uy;
goto nxtc; goto nxtc;
} else if (c == 'm' || c == 'M') {
if (!monarr) {
gather_locs(&monarr, &moncount, TRUE);
/* when hero is first element (always, unless unseen),
we want first increment to reach 1 (nearest aside
from hero) or first decrement to reach moncount-1
(farthest); if hero is not first element, we want
first increment to end up with 0 (nearest monster),
first decrement should still choose moncount-1 */
monidx = (monarr[0].x == u.ux && monarr[0].y == u.uy) ? 0
: (c == 'm') ? -1 : 0;
}
if (moncount) {
if (c == 'm') {
monidx = (monidx + 1) % moncount;
} else {
if (--monidx < 0)
monidx = moncount - 1;
}
cx = monarr[monidx].x;
cy = monarr[monidx].y;
goto nxtc;
}
} else if (c == 'o' || c == 'O') {
if (!objarr) {
gather_locs(&objarr, &objcount, FALSE);
/* ready for first increment to change to zero
or first decrement to change to objcount-1 */
objidx = (c == 'o') ? -1 : 0;
}
if (objcount) {
if (c == 'o') {
objidx = (objidx + 1) % objcount;
} else {
if (--objidx < 0)
objidx = objcount - 1;
}
cx = objarr[objidx].x;
cy = objarr[objidx].y;
goto nxtc;
}
} else { } else {
if (!index(quitchars, c)) { if (!index(quitchars, c)) {
char matching[MAXPCHARS]; char matching[MAXPCHARS];
int pass, lo_x, lo_y, hi_x, hi_y, k = 0; int pass, lo_x, lo_y, hi_x, hi_y, k = 0;
(void) memset((genericptr_t) matching, 0, sizeof matching); (void) memset((genericptr_t) matching, 0, sizeof matching);
for (sidx = 1; sidx < MAXPCHARS; sidx++) for (sidx = 1; sidx < MAXPCHARS; sidx++)
if (c == defsyms[sidx].sym || c == (int) showsyms[sidx]) if (c == defsyms[sidx].sym || c == (int) showsyms[sidx])
@@ -307,6 +430,10 @@ const char *goal;
clear_nhwindow(WIN_MESSAGE); clear_nhwindow(WIN_MESSAGE);
ccp->x = cx; ccp->x = cx;
ccp->y = cy; ccp->y = cy;
if (monarr)
free((genericptr_t) monarr);
if (objarr)
free((genericptr_t) objarr);
getpos_hilitefunc = (void FDECL((*), (int))) 0; getpos_hilitefunc = (void FDECL((*), (int))) 0;
return result; return result;
} }
+1 -1
View File
@@ -325,7 +325,7 @@ boolean with_you;
xyflags = mtmp->mtrack[0].y; xyflags = mtmp->mtrack[0].y;
xlocale = mtmp->mtrack[1].x; xlocale = mtmp->mtrack[1].x;
ylocale = mtmp->mtrack[1].y; ylocale = mtmp->mtrack[1].y;
memset(mtmp->mtrack, MTSZ, sizeof(coord)); memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
if (mtmp == u.usteed) if (mtmp == u.usteed)
return; /* don't place steed on the map */ return; /* don't place steed on the map */
+1 -2
View File
@@ -16,7 +16,6 @@ STATIC_DCL void FDECL(check_shop_obj, (struct obj *, XCHAR_P, XCHAR_P,
BOOLEAN_P)); BOOLEAN_P));
STATIC_DCL void FDECL(breakmsg, (struct obj *, BOOLEAN_P)); STATIC_DCL void FDECL(breakmsg, (struct obj *, BOOLEAN_P));
STATIC_DCL boolean FDECL(toss_up, (struct obj *, BOOLEAN_P)); STATIC_DCL boolean FDECL(toss_up, (struct obj *, BOOLEAN_P));
STATIC_DCL boolean FDECL(throwing_weapon, (struct obj *));
STATIC_DCL void FDECL(sho_obj_return_to_u, (struct obj * obj)); STATIC_DCL void FDECL(sho_obj_return_to_u, (struct obj * obj));
STATIC_DCL boolean FDECL(mhurtle_step, (genericptr_t, int, int)); STATIC_DCL boolean FDECL(mhurtle_step, (genericptr_t, int, int));
@@ -943,7 +942,7 @@ boolean hitsroof;
} }
/* return true for weapon meant to be thrown; excludes ammo */ /* return true for weapon meant to be thrown; excludes ammo */
STATIC_OVL boolean boolean
throwing_weapon(obj) throwing_weapon(obj)
struct obj *obj; struct obj *obj;
{ {
+2
View File
@@ -1431,6 +1431,8 @@ struct obj *otmp;
case ELVEN_DAGGER: case ELVEN_DAGGER:
case ORCISH_DAGGER: case ORCISH_DAGGER:
case ATHAME: case ATHAME:
case KNIFE:
case STILETTO:
case CRYSKNIFE: case CRYSKNIFE:
tmp = 3; tmp = 3;
break; break;
+16
View File
@@ -827,6 +827,9 @@ int mode;
} else if (mode == TEST_TRAV) { } else if (mode == TEST_TRAV) {
struct obj *obj; struct obj *obj;
/* never travel through boulders in Sokoban */
if (Sokoban) return FALSE;
/* don't pick two boulders in a row, unless there's a way thru */ /* don't pick two boulders in a row, unless there's a way thru */
if (sobj_at(BOULDER, ux, uy) && !Sokoban) { if (sobj_at(BOULDER, ux, uy) && !Sokoban) {
if (!Passes_walls if (!Passes_walls
@@ -1434,6 +1437,19 @@ domove()
} }
} }
if (context.forcefight && levl[x][y].typ == IRONBARS && uwep) {
struct obj *obj = uwep;
if (breaktest(obj)) {
if (obj->quan > 1L)
obj = splitobj(obj, 1L);
else
setuwep((struct obj *)0);
freeinv(obj);
}
hit_bars(&obj, u.ux, u.uy, x, y, TRUE, TRUE);
return;
}
/* specifying 'F' with no monster wastes a turn */ /* specifying 'F' with no monster wastes a turn */
if (context.forcefight if (context.forcefight
/* remembered an 'I' && didn't use a move command */ /* remembered an 'I' && didn't use a move command */
+28 -39
View File
@@ -434,6 +434,7 @@ struct obj *obj;
{ {
struct obj *otmp, *prev; struct obj *otmp, *prev;
int saved_otyp = (int) obj->otyp; /* for panic */ int saved_otyp = (int) obj->otyp; /* for panic */
boolean obj_was_thrown;
if (obj->where != OBJ_FREE) if (obj->where != OBJ_FREE)
panic("addinv: obj not free"); panic("addinv: obj not free");
@@ -442,6 +443,7 @@ struct obj *obj;
obj->no_charge = 0; /* should not be set in hero's invent */ obj->no_charge = 0; /* should not be set in hero's invent */
if (Has_contents(obj)) if (Has_contents(obj))
picked_container(obj); /* clear no_charge */ picked_container(obj); /* clear no_charge */
obj_was_thrown = obj->was_thrown;
obj->was_thrown = 0; /* not meaningful for invent */ obj->was_thrown = 0; /* not meaningful for invent */
addinv_core1(obj); addinv_core1(obj);
@@ -476,6 +478,10 @@ struct obj *obj;
} }
obj->where = OBJ_INVENT; obj->where = OBJ_INVENT;
/* fill empty quiver if obj was thrown */
if (flags.pickup_thrown && !uquiver && obj_was_thrown
&& (throwing_weapon(obj) || is_ammo(obj)))
setuqwep(obj);
added: added:
addinv_core2(obj); addinv_core2(obj);
carry_obj_effects(obj); /* carrying affects the obj */ carry_obj_effects(obj); /* carrying affects the obj */
@@ -964,8 +970,8 @@ register const char *let, *word;
boolean allownone = FALSE; boolean allownone = FALSE;
boolean useboulder = FALSE; boolean useboulder = FALSE;
xchar foox = 0; xchar foox = 0;
long cnt, prevcnt; long cnt;
boolean prezero; boolean cntgiven = FALSE;
long dummymask; long dummymask;
if (*let == ALLOW_COUNT) if (*let == ALLOW_COUNT)
@@ -1157,9 +1163,7 @@ register const char *let, *word;
} }
for (;;) { for (;;) {
cnt = 0; cnt = 0;
if (allowcnt == 2) cntgiven = FALSE;
allowcnt = 1; /* abort previous count */
prezero = FALSE;
if (!buf[0]) { if (!buf[0]) {
Sprintf(qbuf, "What do you want to %s? [*]", word); Sprintf(qbuf, "What do you want to %s? [*]", word);
} else { } else {
@@ -1169,28 +1173,17 @@ register const char *let, *word;
ilet = readchar(); ilet = readchar();
else else
ilet = yn_function(qbuf, (char *) 0, '\0'); ilet = yn_function(qbuf, (char *) 0, '\0');
if (digit(ilet) && !allowcnt) { if (digit(ilet)) {
pline("No count allowed with this command."); long tmpcnt = 0;
continue; if (!allowcnt) {
} pline("No count allowed with this command.");
if (ilet == '0') continue;
prezero = TRUE; }
while (digit(ilet)) { ilet = get_count(NULL, ilet, LARGEST_INT, &tmpcnt);
if (ilet != '?' && ilet != '*') if (tmpcnt) {
savech(ilet); cnt = tmpcnt;
/* accumulate unless cnt has overflowed */ cntgiven = TRUE;
if (allowcnt < 3) {
prevcnt = cnt;
cnt = 10L * cnt + (long) (ilet - '0');
/* signal presence of cnt */
allowcnt = (cnt >= prevcnt) ? 2 : 3;
} }
ilet = readchar();
}
if (allowcnt == 3) {
/* overflow detected; force cnt to be invalid */
cnt = -1L;
allowcnt = 2;
} }
if (index(quitchars, ilet)) { if (index(quitchars, ilet)) {
if (flags.verbose) if (flags.verbose)
@@ -1231,9 +1224,7 @@ register const char *let, *word;
continue; continue;
if (allowcnt && ctmp >= 0) { if (allowcnt && ctmp >= 0) {
cnt = ctmp; cnt = ctmp;
if (!cnt) cntgiven = TRUE;
prezero = TRUE;
allowcnt = 2;
} }
if (ilet == '\033') { if (ilet == '\033') {
if (flags.verbose) if (flags.verbose)
@@ -1261,23 +1252,21 @@ register const char *let, *word;
* to your money supply. The LRS is the tax bureau * to your money supply. The LRS is the tax bureau
* from Larn. * from Larn.
*/ */
if (allowcnt == 2 && cnt <= 0) { if (cntgiven && cnt <= 0) {
if (cnt < 0 || !prezero) if (cnt < 0)
pline_The( pline_The(
"LRS would be very interested to know you have that much."); "LRS would be very interested to know you have that much.");
return (struct obj *) 0; return (struct obj *) 0;
} }
} }
if (allowcnt == 2 && !strcmp(word, "throw")) { if (cntgiven && !strcmp(word, "throw")) {
/* permit counts for throwing gold, but don't accept /* permit counts for throwing gold, but don't accept
* counts for other things since the throw code will * counts for other things since the throw code will
* split off a single item anyway */ * split off a single item anyway */
if (ilet != def_oc_syms[COIN_CLASS].sym if (cnt == 0)
&& !(otmp && otmp->oclass == COIN_CLASS))
allowcnt = 1;
if (cnt == 0 && prezero)
return (struct obj *) 0; return (struct obj *) 0;
if (cnt > 1) { if (cnt > 1 && (ilet != def_oc_syms[COIN_CLASS].sym
&& !(otmp && otmp->oclass == COIN_CLASS))) {
You("can only throw one item at a time."); You("can only throw one item at a time.");
continue; continue;
} }
@@ -1305,7 +1294,7 @@ register const char *let, *word;
silly_thing(word, otmp); silly_thing(word, otmp);
return (struct obj *) 0; return (struct obj *) 0;
} }
if (allowcnt == 2) { /* cnt given */ if (cntgiven) {
if (cnt == 0) if (cnt == 0)
return (struct obj *) 0; return (struct obj *) 0;
if (cnt != otmp->quan) { if (cnt != otmp->quan) {
@@ -2193,7 +2182,7 @@ char avoidlet;
} }
end_menu(win, "Inventory letters used:"); end_menu(win, "Inventory letters used:");
n = select_menu(win, PICK_NONE, &selected); n = select_menu(win, PICK_ONE, &selected);
if (n > 0) { if (n > 0) {
ret = selected[0].item.a_char; ret = selected[0].item.a_char;
free((genericptr_t) selected); free((genericptr_t) selected);
+1 -3
View File
@@ -19,7 +19,6 @@ STATIC_DCL void FDECL(maze0xy, (coord *));
STATIC_DCL boolean FDECL(put_lregion_here, (XCHAR_P, XCHAR_P, XCHAR_P, STATIC_DCL boolean FDECL(put_lregion_here, (XCHAR_P, XCHAR_P, XCHAR_P,
XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P, XCHAR_P,
XCHAR_P, BOOLEAN_P, d_level *)); XCHAR_P, BOOLEAN_P, d_level *));
STATIC_DCL void NDECL(fixup_special);
STATIC_DCL void NDECL(setup_waterlevel); STATIC_DCL void NDECL(setup_waterlevel);
STATIC_DCL void NDECL(unsetup_waterlevel); STATIC_DCL void NDECL(unsetup_waterlevel);
@@ -362,7 +361,7 @@ d_level *lev;
static boolean was_waterlevel; /* ugh... this shouldn't be needed */ static boolean was_waterlevel; /* ugh... this shouldn't be needed */
/* this is special stuff that the level compiler cannot (yet) handle */ /* this is special stuff that the level compiler cannot (yet) handle */
STATIC_OVL void void
fixup_special() fixup_special()
{ {
register lev_region *r = lregions; register lev_region *r = lregions;
@@ -577,7 +576,6 @@ register const char *s;
if (*protofile) { if (*protofile) {
Strcat(protofile, LEV_EXT); Strcat(protofile, LEV_EXT);
if (load_special(protofile)) { if (load_special(protofile)) {
fixup_special();
/* some levels can end up with monsters /* some levels can end up with monsters
on dead mon list, including light source monsters */ on dead mon list, including light source monsters */
dmonsfree(); dmonsfree();
+3 -2
View File
@@ -1653,6 +1653,8 @@ struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */
remove_monster(mtmp->mx, mtmp->my); remove_monster(mtmp->mx, mtmp->my);
if (emits_light(mptr)) if (emits_light(mptr))
del_light_source(LS_MONSTER, monst_to_any(mtmp)); del_light_source(LS_MONSTER, monst_to_any(mtmp));
if (mtmp->m_ap_type)
seemimic(mtmp);
newsym(mtmp->mx, mtmp->my); newsym(mtmp->mx, mtmp->my);
unstuck(mtmp); unstuck(mtmp);
fill_pit(mtmp->mx, mtmp->my); fill_pit(mtmp->mx, mtmp->my);
@@ -2616,8 +2618,7 @@ void
seemimic(mtmp) seemimic(mtmp)
register struct monst *mtmp; register struct monst *mtmp;
{ {
boolean is_blocker_appear = (is_door_mappear(mtmp) boolean is_blocker_appear = (is_lightblocker_mappear(mtmp));
|| is_obj_mappear(mtmp, BOULDER));
if (has_mcorpsenm(mtmp)) if (has_mcorpsenm(mtmp))
freemcorpsenm(mtmp); freemcorpsenm(mtmp);
+1 -1
View File
@@ -272,7 +272,7 @@ boolean fleemsg;
mtmp->mflee = 1; mtmp->mflee = 1;
} }
/* ignore recently-stepped spaces when made to flee */ /* ignore recently-stepped spaces when made to flee */
memset(mtmp->mtrack, MTSZ, sizeof(coord)); memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
} }
STATIC_OVL void STATIC_OVL void
+44 -15
View File
@@ -318,7 +318,9 @@ struct obj *obj; /* missile (or stack providing it) */
|| IS_ROCK(levl[bhitpos.x + dx][bhitpos.y + dy].typ) || IS_ROCK(levl[bhitpos.x + dx][bhitpos.y + dy].typ)
|| closed_door(bhitpos.x + dx, bhitpos.y + dy) || closed_door(bhitpos.x + dx, bhitpos.y + dy)
|| (levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS || (levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS
&& hits_bars(&singleobj, bhitpos.x, bhitpos.y, 0, 0))) { && hits_bars(&singleobj,
bhitpos.x, bhitpos.y,
bhitpos.x + dx, bhitpos.y + dy, 0, 0))) {
(void) drop_throw(singleobj, 0, bhitpos.x, bhitpos.y); (void) drop_throw(singleobj, 0, bhitpos.x, bhitpos.y);
return; return;
} }
@@ -455,7 +457,10 @@ struct obj *obj; /* missile (or stack providing it) */
|| closed_door(bhitpos.x + dx, bhitpos.y + dy) || closed_door(bhitpos.x + dx, bhitpos.y + dy)
/* missile might hit iron bars */ /* missile might hit iron bars */
|| (levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS || (levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS
&& hits_bars(&singleobj, bhitpos.x, bhitpos.y, !rn2(5), 0)) && hits_bars(&singleobj,
bhitpos.x, bhitpos.y,
bhitpos.x + dx, bhitpos.y + dy,
!rn2(5), 0))
/* Thrown objects "sink" */ /* Thrown objects "sink" */
|| IS_SINK(levl[bhitpos.x][bhitpos.y].typ)) { || IS_SINK(levl[bhitpos.x][bhitpos.y].typ)) {
if (singleobj) /* hits_bars might have destroyed it */ if (singleobj) /* hits_bars might have destroyed it */
@@ -831,11 +836,45 @@ int type;
return (struct obj *) 0; return (struct obj *) 0;
} }
void
hit_bars(objp, objx, objy, barsx, barsy, your_fault, from_invent)
struct obj **objp; /* *objp will be set to NULL if object breaks */
int objx, objy, barsx, barsy;
boolean your_fault, from_invent;
{
struct obj *otmp = *objp;
int obj_type = otmp->otyp;
boolean unbreakable = (levl[barsx][barsy].wall_info & W_NONDIGGABLE) != 0;
if (your_fault
? hero_breaks(otmp, objx, objy, from_invent)
: breaks(otmp, objx, objy)) {
*objp = 0; /* object is now gone */
/* breakage makes its own noises */
if (obj_type == POT_ACID) {
if (cansee(barsx, barsy) && !unbreakable)
pline_The("iron bars are dissolved!");
else
You_hear(Hallucination ? "angry snakes!" : "a hissing noise.");
if (!unbreakable)
dissolve_bars(barsx, barsy);
}
}
else if (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL)
pline("Whang!");
else if (otmp->oclass == COIN_CLASS
|| objects[obj_type].oc_material == GOLD
|| objects[obj_type].oc_material == SILVER)
pline("Clink!");
else
pline("Clonk!");
}
/* TRUE iff thrown/kicked/rolled object doesn't pass through iron bars */ /* TRUE iff thrown/kicked/rolled object doesn't pass through iron bars */
boolean boolean
hits_bars(obj_p, x, y, always_hit, whodidit) hits_bars(obj_p, x, y, barsx, barsy, always_hit, whodidit)
struct obj **obj_p; /* *obj_p will be set to NULL if object breaks */ struct obj **obj_p; /* *obj_p will be set to NULL if object breaks */
int x, y; int x, y, barsx, barsy;
int always_hit; /* caller can force a hit for items which would fit through */ int always_hit; /* caller can force a hit for items which would fit through */
int whodidit; /* 1==hero, 0=other, -1==just check whether it'll pass thru */ int whodidit; /* 1==hero, 0=other, -1==just check whether it'll pass thru */
{ {
@@ -885,17 +924,7 @@ int whodidit; /* 1==hero, 0=other, -1==just check whether it'll pass thru */
} }
if (hits && whodidit != -1) { if (hits && whodidit != -1) {
if (whodidit ? hero_breaks(otmp, x, y, FALSE) : breaks(otmp, x, y)) hit_bars(obj_p, x,y, barsx,barsy, whodidit, FALSE);
*obj_p = otmp = 0; /* object is now gone */
/* breakage makes its own noises */
else if (obj_type == BOULDER || obj_type == HEAVY_IRON_BALL)
pline("Whang!");
else if (otmp->oclass == COIN_CLASS
|| objects[obj_type].oc_material == GOLD
|| objects[obj_type].oc_material == SILVER)
pline("Clink!");
else
pline("Clonk!");
} }
return hits; return hits;
+19 -1
View File
@@ -426,6 +426,23 @@ int force;
} }
} }
const char *
generic_lvl_desc()
{
if (Is_astralevel(&u.uz))
return "astral plane";
else if (In_endgame(&u.uz))
return "plane";
else if (Is_sanctum(&u.uz))
return "sanctum";
else if (In_sokoban(&u.uz))
return "puzzle";
else if (In_V_tower(&u.uz))
return "tower";
else
return "dungeon";
}
/* /*
* The player is trying to extract something from his/her instrument. * The player is trying to extract something from his/her instrument.
*/ */
@@ -537,7 +554,8 @@ struct obj *instr;
consume_obj_charge(instr, TRUE); consume_obj_charge(instr, TRUE);
You("produce a heavy, thunderous rolling!"); You("produce a heavy, thunderous rolling!");
pline_The("entire dungeon is shaking around you!"); pline_The("entire %s is shaking around you!",
generic_lvl_desc());
do_earthquake((u.ulevel - 1) / 3 + 1); do_earthquake((u.ulevel - 1) / 3 + 1);
/* shake up monsters in a much larger radius... */ /* shake up monsters in a much larger radius... */
awaken_monsters(ROWNO * COLNO); awaken_monsters(ROWNO * COLNO);
+13 -5
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 objnam.c $NHDT-Date: 1451683056 2016/01/01 21:17:36 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.162 $ */ /* NetHack 3.6 objnam.c $NHDT-Date: 1452043772 2016/01/06 01:29:32 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.163 $ */
/* 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. */
@@ -1102,6 +1102,8 @@ register struct obj *otmp;
|| is_flammable(otmp)); || is_flammable(otmp));
} }
/* format a corpse name (xname() omits monster type; doname() calls us);
eatcorpse() also uses us for death reason when eating tainted glob */
char * char *
corpse_xname(otmp, adjective, cxn_flags) corpse_xname(otmp, adjective, cxn_flags)
struct obj *otmp; struct obj *otmp;
@@ -1118,10 +1120,14 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
/* include "an" for "an ogre corpse */ /* include "an" for "an ogre corpse */
any_prefix = (cxn_flags & CXN_ARTICLE) != 0, any_prefix = (cxn_flags & CXN_ARTICLE) != 0,
/* leave off suffix (do_name() appends "corpse" itself) */ /* leave off suffix (do_name() appends "corpse" itself) */
omit_corpse = (cxn_flags & CXN_NOCORPSE) != 0, possessive = FALSE; omit_corpse = (cxn_flags & CXN_NOCORPSE) != 0,
possessive = FALSE,
glob = (otmp->otyp != CORPSE && otmp->globby);
const char *mname; const char *mname;
if (omndx == NON_PM) { /* paranoia */ if (glob) {
mname = OBJ_NAME(objects[otmp->otyp]); /* "glob of <monster>" */
} else if (omndx == NON_PM) { /* paranoia */
mname = "thing"; mname = "thing";
/* [Possible enhancement: check whether corpse has monster traits /* [Possible enhancement: check whether corpse has monster traits
attached in order to use priestname() for priests and minions.] */ attached in order to use priestname() for priests and minions.] */
@@ -1172,7 +1178,9 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
any_prefix = FALSE; any_prefix = FALSE;
} }
if (!omit_corpse) { if (glob) {
; /* omit_corpse doesn't apply; quantity is always 1 */
} else if (!omit_corpse) {
Strcat(nambuf, " corpse"); Strcat(nambuf, " corpse");
/* makeplural(nambuf) => append "s" to "corpse" */ /* makeplural(nambuf) => append "s" to "corpse" */
if (otmp->quan > 1L && !ignore_quan) { if (otmp->quan > 1L && !ignore_quan) {
@@ -3525,7 +3533,7 @@ typfnd:
} }
otmp->owt = weight(otmp); otmp->owt = weight(otmp);
if (very && otmp->otyp == HEAVY_IRON_BALL) if (very && otmp->otyp == HEAVY_IRON_BALL)
otmp->owt += 160; otmp->owt += IRON_BALL_W_INCR;
return otmp; return otmp;
} }
+1
View File
@@ -3384,6 +3384,7 @@ boolean tinitial, tfrom_file;
need_redraw = TRUE; /* darkroom refresh */ need_redraw = TRUE; /* darkroom refresh */
} else if ((boolopt[i].addr) == &iflags.use_inverse } else if ((boolopt[i].addr) == &iflags.use_inverse
|| (boolopt[i].addr) == &flags.showrace || (boolopt[i].addr) == &flags.showrace
|| (boolopt[i].addr) == &iflags.hilite_pile
|| (boolopt[i].addr) == &iflags.hilite_pet) { || (boolopt[i].addr) == &iflags.hilite_pet) {
need_redraw = TRUE; need_redraw = TRUE;
#ifdef TEXTCOLOR #ifdef TEXTCOLOR
+1 -1
View File
@@ -2271,7 +2271,7 @@ struct obj *sobj;
You("are being punished for your misbehavior!"); You("are being punished for your misbehavior!");
if (Punished) { if (Punished) {
Your("iron ball gets heavier."); Your("iron ball gets heavier.");
uball->owt += 160 * (1 + sobj->cursed); uball->owt += IRON_BALL_W_INCR * (1 + sobj->cursed);
return; return;
} }
if (amorphous(youmonst.data) || is_whirly(youmonst.data) if (amorphous(youmonst.data) || is_whirly(youmonst.data)
-2
View File
@@ -3118,8 +3118,6 @@ quit:
return 0; return 0;
} }
#define HUNGRY 2
STATIC_OVL long STATIC_OVL long
getprice(obj, shk_buying) getprice(obj, shk_buying)
register struct obj *obj; register struct obj *obj;
+12 -6
View File
@@ -1873,11 +1873,12 @@ struct mkroom *croom;
} }
} }
} else { } else {
struct obj *cobj = container_obj[container_idx - 1];
remove_object(otmp); remove_object(otmp);
if (container_obj[container_idx - 1]) if (cobj) {
(void) add_to_container(container_obj[container_idx - 1], (void) add_to_container(cobj, otmp);
otmp); cobj->owt = weight(cobj);
else { } else {
obj_extract_self(otmp); obj_extract_self(otmp);
obfree(otmp, NULL); obfree(otmp, NULL);
return; return;
@@ -5863,11 +5864,16 @@ sp_lev *lvl;
count_features(); count_features();
if (coder->premapped)
sokoban_detect();
if (coder->solidify) if (coder->solidify)
solidify_map(); solidify_map();
/* This must be done before sokoban_detect(),
* otherwise branch stairs won't be premapped. */
fixup_special();
if (coder->premapped)
sokoban_detect();
if (coder->frame) { if (coder->frame) {
struct sp_frame *tmpframe; struct sp_frame *tmpframe;
do { do {
+1 -1
View File
@@ -980,7 +980,7 @@ register int x, y;
} }
} }
memset(mtmp->mtrack, MTSZ, sizeof(coord)); memset(mtmp->mtrack, 0, sizeof(mtmp->mtrack));
place_monster(mtmp, x, y); /* put monster down */ place_monster(mtmp, x, y); /* put monster down */
update_monster_region(mtmp); update_monster_region(mtmp);
+9 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 trap.c $NHDT-Date: 1451176031 2015/12/27 00:27:11 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.252 $ */ /* NetHack 3.6 trap.c $NHDT-Date: 1452039453 2016/01/06 00:17:33 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.253 $ */
/* 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. */
@@ -1889,7 +1889,9 @@ int style;
if (dist > 0 && isok(bhitpos.x + dx, bhitpos.y + dy) if (dist > 0 && isok(bhitpos.x + dx, bhitpos.y + dy)
&& levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS) { && levl[bhitpos.x + dx][bhitpos.y + dy].typ == IRONBARS) {
x2 = bhitpos.x, y2 = bhitpos.y; /* object stops here */ x2 = bhitpos.x, y2 = bhitpos.y; /* object stops here */
if (hits_bars(&singleobj, x2, y2, !rn2(20), 0)) { if (hits_bars(&singleobj,
x2, y2, x2+dx, y2+dy,
!rn2(20), 0)) {
if (!singleobj) { if (!singleobj) {
used_up = TRUE; used_up = TRUE;
launch_drop_spot((struct obj *) 0, 0, 0); launch_drop_spot((struct obj *) 0, 0, 0);
@@ -4999,13 +5001,13 @@ lava_effects()
&& objects[obj->otyp].oc_oprop != FIRE_RES && objects[obj->otyp].oc_oprop != FIRE_RES
&& obj->otyp != SCR_FIRE && obj->otyp != SPE_FIREBALL && obj->otyp != SCR_FIRE && obj->otyp != SPE_FIREBALL
&& !obj_resists(obj, 0, 0)) /* for invocation items */ && !obj_resists(obj, 0, 0)) /* for invocation items */
obj->in_use = TRUE; obj->in_use = 1;
/* Check whether we should burn away boots *first* so we know whether to /* Check whether we should burn away boots *first* so we know whether to
* make the player sink into the lava. Assumption: water walking only * make the player sink into the lava. Assumption: water walking only
* comes from boots. * comes from boots.
*/ */
if (Wwalking && uarmf && is_organic(uarmf) && !uarmf->oerodeproof) { if (uarmf && is_organic(uarmf) && !uarmf->oerodeproof) {
obj = uarmf; obj = uarmf;
pline("%s into flame!", Yobjnam2(obj, "burst")); pline("%s into flame!", Yobjnam2(obj, "burst"));
iflags.in_lava_effects++; /* (see above) */ iflags.in_lava_effects++; /* (see above) */
@@ -5119,6 +5121,9 @@ sink_into_lava()
You("sink below the surface and die."); You("sink below the surface and die.");
burn_away_slime(); /* add insult to injury? */ burn_away_slime(); /* add insult to injury? */
done(DISSOLVED); done(DISSOLVED);
/* can only get here via life-saving; try to get away from lava */
u.utrap = 0;
(void) safe_teleds(TRUE);
} else if (!u.umoved) { } else if (!u.umoved) {
/* can't fully turn into slime while in lava, but might not /* can't fully turn into slime while in lava, but might not
have it be burned away until you've come awfully close */ have it be burned away until you've come awfully close */
+1 -1
View File
@@ -380,7 +380,7 @@ invault()
getlin(Deaf ? "You are required to sign in with your name. -" : getlin(Deaf ? "You are required to sign in with your name. -" :
"\"Hello stranger, who are you?\" -", buf); "\"Hello stranger, who are you?\" -", buf);
(void) mungspaces(buf); (void) mungspaces(buf);
} while (!letter(buf[0]) && --trycount > 0); } while (!buf[0] && --trycount > 0);
if (u.ualign.type == A_LAWFUL if (u.ualign.type == A_LAWFUL
/* ignore trailing text, in case player includes rank */ /* ignore trailing text, in case player includes rank */
+2 -2
View File
@@ -175,9 +175,9 @@ register struct rm *lev;
if (obj->otyp == BOULDER) if (obj->otyp == BOULDER)
return 1; return 1;
/* Mimics mimicing a door or boulder block light. */ /* Mimics mimicing a door or boulder or ... block light. */
if ((mon = m_at(x, y)) && (!mon->minvis || See_invisible) if ((mon = m_at(x, y)) && (!mon->minvis || See_invisible)
&& (is_door_mappear(mon) || is_obj_mappear(mon,BOULDER))) && is_lightblocker_mappear(mon))
return 1; return 1;
return 0; return 0;
+2 -2
View File
@@ -304,12 +304,12 @@ struct monst *mon;
if (ptr == &mons[PM_SHADE] && !shade_glare(otmp)) if (ptr == &mons[PM_SHADE] && !shade_glare(otmp))
tmp = 0; tmp = 0;
/* "very heavy iron ball"; weight increase is in increments of 160 */ /* "very heavy iron ball"; weight increase is in increments */
if (otyp == HEAVY_IRON_BALL && tmp > 0) { if (otyp == HEAVY_IRON_BALL && tmp > 0) {
int wt = (int) objects[HEAVY_IRON_BALL].oc_weight; int wt = (int) objects[HEAVY_IRON_BALL].oc_weight;
if ((int) otmp->owt > wt) { if ((int) otmp->owt > wt) {
wt = ((int) otmp->owt - wt) / 160; wt = ((int) otmp->owt - wt) / IRON_BALL_W_INCR;
tmp += rnd(4 * wt); tmp += rnd(4 * wt);
if (tmp > 25) if (tmp > 25)
tmp = 25; /* objects[].oc_wldam */ tmp = 25; /* objects[].oc_wldam */
+12 -1
View File
@@ -2368,7 +2368,13 @@ boolean ordinary;
} }
if (u.utrap) { /* escape web or bear trap */ if (u.utrap) { /* escape web or bear trap */
(void) openholdingtrap(&youmonst, &learn_it); (void) openholdingtrap(&youmonst, &learn_it);
} else { /* trigger previously escaped trapdoor */ } else {
struct obj *otmp;
/* unlock carried boxes */
for (otmp = invent; otmp; otmp = otmp->nobj)
if (Is_box(otmp))
(void) boxlock(otmp, obj);
/* trigger previously escaped trapdoor */
(void) openfallingtrap(&youmonst, TRUE, &learn_it); (void) openfallingtrap(&youmonst, TRUE, &learn_it);
} }
break; break;
@@ -3097,6 +3103,7 @@ struct obj **pobj; /* object tossed/used, set to NULL
/* iron bars will block anything big enough */ /* iron bars will block anything big enough */
if ((weapon == THROWN_WEAPON || weapon == KICKED_WEAPON) if ((weapon == THROWN_WEAPON || weapon == KICKED_WEAPON)
&& typ == IRONBARS && hits_bars(pobj, x - ddx, y - ddy, && typ == IRONBARS && hits_bars(pobj, x - ddx, y - ddy,
bhitpos.x, bhitpos.y,
point_blank ? 0 : !rn2(5), 1)) { point_blank ? 0 : !rn2(5), 1)) {
/* caveat: obj might now be null... */ /* caveat: obj might now be null... */
obj = *pobj; obj = *pobj;
@@ -4305,6 +4312,10 @@ short exploding_wand_typ;
} }
break; /* ZT_COLD */ break; /* ZT_COLD */
case ZT_POISON_GAS:
(void) create_gas_cloud(x, y, 1, 8);
break;
case ZT_ACID: case ZT_ACID:
if (lev->typ == IRONBARS) { if (lev->typ == IRONBARS) {
if ((lev->wall_info & W_NONDIGGABLE) != 0) { if ((lev->wall_info & W_NONDIGGABLE) != 0) {
+3 -1
View File
@@ -1351,7 +1351,7 @@ sp_lev *sp;
register char *s1, *s2; register char *s1, *s2;
int max_len = 0; int max_len = 0;
int max_hig = 0; int max_hig = 0;
char *tmpmap[ROWNO]; char *tmpmap[MAP_Y_LIM+1];
int dx, dy; int dx, dy;
char *mbuf; char *mbuf;
@@ -1378,6 +1378,8 @@ sp_lev *sp;
/* Then parse it now */ /* Then parse it now */
while (map && *map) { while (map && *map) {
if (max_hig > MAP_Y_LIM)
break;
tmpmap[max_hig] = (char *) alloc(max_len); tmpmap[max_hig] = (char *) alloc(max_len);
s1 = index(map, '\n'); s1 = index(map, '\n');
if (s1) { if (s1) {
+5 -4
View File
@@ -441,7 +441,8 @@ makepicks:
Strcpy(pbuf, "Pick a role or profession"); Strcpy(pbuf, "Pick a role or profession");
end_menu(win, pbuf); end_menu(win, pbuf);
n = select_menu(win, PICK_ONE, &selected); n = select_menu(win, PICK_ONE, &selected);
choice = (n == 1) ? selected[0].item.a_int : ROLE_NONE; choice = (n == 1) ? selected[0].item.a_int
: (n == 0) ? ROLE_RANDOM : ROLE_NONE;
if (selected) if (selected)
free((genericptr_t) selected), selected = 0; free((genericptr_t) selected), selected = 0;
destroy_nhwindow(win); destroy_nhwindow(win);
@@ -526,7 +527,7 @@ makepicks:
end_menu(win, pbuf); end_menu(win, pbuf);
n = select_menu(win, PICK_ONE, &selected); n = select_menu(win, PICK_ONE, &selected);
choice = (n == 1) ? selected[0].item.a_int choice = (n == 1) ? selected[0].item.a_int
: ROLE_NONE; : (n == 0) ? ROLE_RANDOM : ROLE_NONE;
if (selected) if (selected)
free((genericptr_t) selected), selected = 0; free((genericptr_t) selected), selected = 0;
destroy_nhwindow(win); destroy_nhwindow(win);
@@ -615,7 +616,7 @@ makepicks:
end_menu(win, pbuf); end_menu(win, pbuf);
n = select_menu(win, PICK_ONE, &selected); n = select_menu(win, PICK_ONE, &selected);
choice = (n == 1) ? selected[0].item.a_int choice = (n == 1) ? selected[0].item.a_int
: ROLE_NONE; : (n == 0) ? ROLE_RANDOM : ROLE_NONE;
if (selected) if (selected)
free((genericptr_t) selected), selected = 0; free((genericptr_t) selected), selected = 0;
destroy_nhwindow(win); destroy_nhwindow(win);
@@ -700,7 +701,7 @@ makepicks:
end_menu(win, pbuf); end_menu(win, pbuf);
n = select_menu(win, PICK_ONE, &selected); n = select_menu(win, PICK_ONE, &selected);
choice = (n == 1) ? selected[0].item.a_int choice = (n == 1) ? selected[0].item.a_int
: ROLE_NONE; : (n == 0) ? ROLE_RANDOM : ROLE_NONE;
if (selected) if (selected)
free((genericptr_t) selected), selected = 0; free((genericptr_t) selected), selected = 0;
destroy_nhwindow(win); destroy_nhwindow(win);