Merge branch 'NetHack-3.6.0' of https://rodney.nethack.org:20040/git/NHsource into NetHack-3.6.0
This commit is contained in:
+1
-1
@@ -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
@@ -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
@@ -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
@@ -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 ### */
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 \
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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();
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 */
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user