Merge branch 'NetHack-3.6.0'

This commit is contained in:
nhmall
2015-12-31 18:46:20 -05:00
37 changed files with 913 additions and 346 deletions
+1 -1
View File
@@ -708,7 +708,7 @@ LOOP [28] {
MONSTER:random,random MONSTER:random,random
} }
MAZEWALK:(4, 2), south MAZEWALK:(4, 2), south, false
# Stairs up, not in the fog maze # Stairs up, not in the fog maze
STAIR:(00,00,70,18),(02,03,68,15),up STAIR:(00,00,70,18),(02,03,68,15),up
+1 -1
View File
@@ -1140,7 +1140,7 @@ DOOR:closed,(37,8)
DOOR:closed,(47,8) DOOR:closed,(47,8)
DOOR:closed,(73,5) DOOR:closed,(73,5)
DOOR:closed,(2,15) DOOR:closed,(2,15)
MAZEWALK:(36,8),west MAZEWALK:(36,8),west,false
STAIR:(42,8),up STAIR:(42,8),up
WALLIFY WALLIFY
+246 -4
View File
@@ -5265,7 +5265,8 @@ ag-rreeeed arr-angement, ye ken!"
# #
# #
# #
%title Snuff (2) %title Snuff (16)
# p. 168 (Harper edition; 'ax' is spelled without the 'e' there...)
%passage 1 %passage 1
They were crude weapons, to be sure, but a flint axe hitting your head does They were crude weapons, to be sure, but a flint axe hitting your head does
not need a degree in physics. not need a degree in physics.
@@ -5273,9 +5274,250 @@ not need a degree in physics.
[Snuff, by Terry Pratchett] [Snuff, by Terry Pratchett]
%e passage %e passage
%passage 2 %passage 2
It is a strange thing to find yourself doing something you It is a strange thing to find yourself doing something you have apparently
have apparently always wanted to do, when in fact up until always wanted to do, when in fact up until that moment you had never known
that moment you had never known that you always wanted to do it... that you always wanted to do it...
[Snuff, by Terry Pratchett]
%e passage
# p. 2 (the subject is goblins)
%passage 3
At this point, Lord Vetinari, Patrician of Ankh-Morpork, stopped reading
and stared at nothing. After a few seconds, nothing was eclipsed by the
form of Drumknott, his secretary (who, it must be said, had spent a career
turning himself as much like nothing as anything).
Drumknott said, "You look pensive, my lord," to which observation he
appended a most delicate question mark, which gradually evaporated.
"Awash with tears, Drumknott, awash with tears."
Drumknott stopped dusting the impeccably shiny black lacquered desk.
"Pastor Oats is a very persuasive writer, isn't he, sir...?"
"Indeed he is, Drumknott, but the basic problem remains and it is this:
humanity may come to terms with the dwarf, the troll and even the orc,
terrifying though all these have proved to be at times, and you know why
this is, Drumknott?"
The secretary carefully folded the duster he had been using and looked at
the ceiling. "I would venture to suggest, my lord, that in their violence
we recognize ourselves?"
"Oh, well done, Drumknott, I shall make a cynic of you yet! Predators
respect other predators, do they not? They may perhaps even respect the
prey: the lion may lie down with the lamb, even if only the lion is
likely to get up again, but the lion will not lie down with the rat.
Vermin, Drumknott, an entire race reduced to vermin!"
[Snuff, by Terry Pratchett]
%e passage
# p. 6
%passage 4
Vimes grunted. "Where there are policemen there's crime, sergeant,
remember that."
"Yes, I do, sir, although I think it sounds better with a little reordering
of the words."
[Snuff, by Terry Pratchett]
%e passage
# pp. 46-47 (passage starts mid-paragraph and ends mid-paragraph; it's a
# long slog for a weak punchline...)
%passage 5
"[...] The third earl, 'Mad' Jack Ramkin, had a brother called
Woolsthorpe, probably for his sins. He was something of a scholar and
would have been sent to the university to become a wizard were it not for
the fact that his brother let it be known that any male sibling of his who
took up a profession that involved wearing a dress would be disinherited
with a cleaver.
"Nevertheless, young Woolsthorpe persevered in his studies in natural
philosophy in the way a gentleman should, by digging into any suspicious-
looking burial mounds he could find in the neighborhood, filling up his
lizard press with as many rare species as he could collect, and drying
samples of any flowers he could find before they became extinct. The
story runs that, on one warm summer day, he dozed off under an apple tree
and was awakened when an apple fell on his head. A lesser man, as his
biographer put it, would have seen nothing untoward about this, but
Woolsthorpe surmised that, since apples and practically everything else
always fell down, then the world would eventually become dangerously
unbalanced... unless there was another agency involved that natural
philosophy had yet to discover. He lost no time in dragging one of the
footmen to the orchard and ordering him, on the pain of dismissal, to lie
under the tree until an apple hit him on the head! The possibility of
this happening was increased by another footman who had been told by
Woolsthorpe to shake the tree vigorously until the required apple fell.
Woolsthorpe was ready to observe this from a distance.
"Who can imagine his joy when the inevitable apple fell and a second apple
was seen rising from the tree and disappearing at speed into the vaults of
heaven, proving the hypothesis that what goes up must come down, provided
that what goes down must come up, thus safeguarding the equilibrium of the
Universe. Regrettably, this only works with apples and, amazingly, only
the apples on this one tree, /Malus equilibria/! I hear that someone has
worked out that the apples at the top of the tree fill with gas and fly up
when the tree is disturbed so that it can set its seeds some way off.
Wonderful thing, nature, shame the fruit tastes like dog's business,"
Willikins added as Young Sam spat some out. [...]
[Snuff, by Terry Pratchett]
%e passage
# p. 100
%passage 6
"Look, Willikins, I don't like to involve you in all this. It's only a
hunch, after all."
Willikins waved this away. "You wouldn't keep me out of it for a big
clock, sir, because all this is tickling my fancy as well. I shall lay
out a selection of cutting edges for you in your dressing room, sir, and I
myself will go up to the copse half an hour before you're due to be there,
with my trusty bow and an assortment of favorite playthings. It's nearly
full moon, clear skies, there'll be shadows everywhere, and I'll be
standing in the darkest one of them."
Vimes looked at him for a moment and said, "Could I please amend that
suggestion? Could you not be there in the second darkest shadow one hour
before midnight, to see who steps into the darkest shadow?"
"Ah yes, that's why you command the watch, sir," said Willikins, and to
Vimes's shock there was a hint of a tear in the man's voice. "You're
listening to the street, aren't you, sir, yes?"
Vimes shrugged. "No streets here, Willikins."
Willikins shook his head. "Once a street boy, always a street boy, sir.
It comes with us, in the pinch. Mothers go, fathers go--if we ever knew
who they were--but the Street, well, the Street looks after us. In the
pinch it keeps us alive."
[Snuff, by Terry Pratchett]
%e passage
# p. 116 (passage ends mid-paragraph)
%passage 7
Well, we live and learn, Vimes thought, or perhaps more importantly, we
learn and live. [...]
[Snuff, by Terry Pratchett]
%e passage
# p. 153
%passage 8
In the country, there is always somebody watching you, he thought as they
sped along. Well, there was always somebody watching you in the city, too,
but that was generally in the hope that you might drop dead and they could
run off with your wallet. They were never /interested/. But here he
thought he could feel many eyes on him. Maybe they belonged to squirrels
or badgers, or whatever the damn things were that Vimes heard at night;
gorillas, possibly.
[Snuff, by Terry Pratchett]
%e passage
# pp. 169-170
%passage 9
"Well, sir, it looks as though they're pleased to see us, yes?"
Feeney's relief and hope should have been bottled and sold to despairing
people everywhere. Vimes just nodded, because the ranks were pulling
apart, leaving a pathway of sorts, at the end of which there was,
inarguably, a corpse. It was a mild relief to see that it was a goblin
corpse, but no corpse is good news, particularly when seen in a grimy low
light and especially for the corpse. And yet something inside him exulted
and cried /Hallelujah!/, because here was a corpse and he was a copper
and this was a crime and this place was smoky and dirty and full of
suspicious-looking goblins and here was a /crime/. His world. Yes, here
was /his/ world.
[Snuff, by Terry Pratchett]
%e passage
# p. 211
%passage 10
Vimes lay back in the bed, enjoying the wonderful sensation of gradually
being eaten by the pillows, and said to Sybil, "Do the Rust family have a
place down here?"
Too late he reflected that this might be a bad move because she might well
have told him all about it on one of those occasions when, so unusally for
a married man, he was not paying much attention to what his wife was
saying, and therefore he might be the cause of grumpiness in those
precious, warm minutes before sleep. All he could see of her right now
was the very tip of her nose, as the pillows claimed her, but she mumbled,
drowsily, "Oh, they bought Hangnail Manor ten years or so ago, after the
Marquis of Fantailer murdered his wife with a pruning knife in the
pineapple house. Don't you remember? You spent weeks searching the city
for him. In the end everybody seemed to think he'd gone off to Fourecks
and disguised himself by not calling himself the Marquis of Fantailer."
"Oh yes," said Vimes, "and I remember that a lot of his chums were quite
indignant about the investigation! They said he'd only done one murder,
and it was his wife's fault for having the bad taste to die after just one
little stab!"
[Snuff, by Terry Pratchett]
%e passage
# p. 212 (passage starts mid-paragraph and ends mid-paragraph)
%passage 11
[...] he had heard that writers spent all day in their dressing gowns
drinking champagne.(1) [...]
(1) This is, of course, absolutely true.
[Snuff, by Terry Pratchett]
%e passage
# p. 217 (passage starts mid-paragraph and ends mid-paragraph)
%passage 12
"[...] and the Summoning Dark is /real/. It's not all in your head,
commander: no matter what you hear, I sometimes hear it too. Oh dear,
you of all people must recognize a substition when you're possessed by it?
It's the opposite of superstition: it's real even if you don't believe
in it. [...]"
[Snuff, by Terry Pratchett]
%e passage
# p. 233
%passage 13
Vimes frowned. He couldn't remember ever going into a church or a temple
or one of the numerous other places of more or less spirituality for any
other reason than the occasional requirements of the job. These days he
tended to go in for reasons of Sybil, i.e., his wife dragging him along
so that he could be seen, and, if possible, seen remaining awake.
No, the world of next worlds, afterlives, and purgatorial destinations
simply did not fit into his head. Whether you wanted it or not, you were
born, you did the best you could, and then, whether you really wanted to
or not, you died. They were the only certainties, and so the best thing
for a copper to do was to get on with the job. And it was about time
that Sam Vimes got back to doing his.
[Snuff, by Terry Pratchett]
%e passage
# p. 254 (passage starts mid-paragraph)
%passage 14
[...] And maybe if I distinguish myself I can get a job in the city, so
that my mum can live in a place where you don't lie awake at night
listening to the mice fighting the cockroaches--hooray!(1)
(1) Regrettably, Constable Upshot was overly hopeful: in Ankh-Morpork the
mice and cockroaches had decided to forget their differences and gang up
on the humans.
[Snuff, by Terry Pratchett]
%e passage
# p. 403 (passage starts mid-paragraph)
%passage 15
"[...] And I remember reading somewhere that you would arrest the gods
for doing it wrong."
Vimes shook his head. "I'm sure I never said anything of the sort! But
law is order and order is law and it must be the highest thing. The world
runs on it, the heavens run on it and without order, lad, one second
cannot follow another."
[Snuff, by Terry Pratchett]
%e passage
# p. 404 (footnote)
%passage 16
The sound of the gentle rattle of china cup on china saucer drives away
all demons, a little-known fact.
[Snuff, by Terry Pratchett] [Snuff, by Terry Pratchett]
%e passage %e passage
+21 -2
View File
@@ -1947,8 +1947,27 @@ option.
There is a section of this Guidebook that discusses that. There is a section of this Guidebook that discusses that.
.pg .pg
The default name of the configuration file varies on different The default name of the configuration file varies on different
operating systems, but NETHACKOPTIONS can also be set to operating systems. On DOS and Windows, it is ``defaults.nh''
the full name of a file you want to use (possibly preceded by an `@'). in the same folder as nethack.exe or nethackW.exe. On Unix, linux
and Mac OS X it is ``.nethackrc'' in the user's home directory.
NETHACKOPTIONS can also be set to the full name of a file you
want to use (possibly preceded by an `@').
.pg
Here is a short example of config file contents:
.sd
\fB# Set your character's role, race, gender, and alignment.\fP
\fBOPTIONS=role:Valkyrie, race:Human, gender:female, align:lawful\fP
\fB# Turn on autopickup, and set automatically picked up object types\fP
\fBOPTIONS=autopickup,pickup_types:$"=/!?+\fP
\fB# Show colored text if possible\fP
\fBOPTIONS=color\fP
\fB# Show lit corridors differently\fP
\fBOPTIONS=lit_corridor\fP
\fB# No startup splash screen. Windows GUI only.\fP
\fBOPTIONS=!splash_screen\fP
.ed
.hn 2 .hn 2
Customization options Customization options
.pg .pg
+24 -2
View File
@@ -2346,8 +2346,30 @@ There is a section of this Guidebook that discusses that.
%.pg %.pg
The default name of the configuration file varies on different The default name of the configuration file varies on different
operating systems, but NETHACKOPTIONS can also be set to operating systems. On DOS and Windows, it is ``{\tt defaults.nh}''
the full name of a file you want to use (possibly preceded by an `{\tt @}'). in the same folder as nethack.exe or nethackW.exe. On Unix, linux
and Mac OS X it is ``{\tt.nethackrc}'' in the user's home directory.
NETHACKOPTIONS can also be set to the full name of a file you
want to use (possibly preceded by an `{\tt @}').
%.pg
Here is a short example of config file contents:
%.sd
\begin{verbatim}
# Set your character's role, race, gender, and alignment.
OPTIONS=role:Valkyrie, race:Human, gender:female, align:lawful
# Turn on autopickup, and set automatically picked up object types
OPTIONS=autopickup,pickup_types:$"=/!?+
# Show colored text if possible
OPTIONS=color
# Show lit corridors differently
OPTIONS=lit_corridor
# No startup splash screen. Windows GUI only.
OPTIONS=!splash_screen
\end{verbatim}
%.ed
%.hn 2 %.hn 2
\subsection*{Customization options} \subsection*{Customization options}
+30 -5
View File
@@ -5,7 +5,7 @@ General Fixes and Modified Features
doc/*.6 man pages and corresponding doc/*.txt text copies were out of date doc/*.6 man pages and corresponding doc/*.txt text copies were out of date
data.base entry for "lava" had wrong first name for Don Woods' attribution data.base entry for "lava" had wrong first name for Don Woods' attribution
cursed genocide of "none" sent in monsters, but "that's enough tries" didn't cursed genocide of "none" sent in monsters, but "that's enough tries" didn't
update MAXPLAYERS documentation in sysconf file and allow 0 for it update MAXPLAYERS documentation in sysconf file and accept 0 for 'no limit'
wizard mode: don't include feedback about named fruit for ^X and enlightenment wizard mode: don't include feedback about named fruit for ^X and enlightenment
looking at distant objects while wearing the Eyes of the Overworld made their looking at distant objects while wearing the Eyes of the Overworld made their
up-close descriptions known when not intended up-close descriptions known when not intended
@@ -41,7 +41,6 @@ don't show the old level when you die going down the stairs because of an
new high score with ", while helpless" attribute appended would erroneously new high score with ", while helpless" attribute appended would erroneously
result in ", while helpless" being appended to all scores result in ", while helpless" being appended to all scores
allow bright aliases for colors in menucolors allow bright aliases for colors in menucolors
make MAXPLAYERS option in sysconf accept 0 value
avoid hearing yelps when you are deaf avoid hearing yelps when you are deaf
make corpse visible if stethoscope told you about it being there make corpse visible if stethoscope told you about it being there
sceptre of might database entry word change sceptre of might database entry word change
@@ -57,6 +56,27 @@ do not autopickup unpaid items in shops
death due an unseen gas spore's explosion resulted in "killed by a died" death due an unseen gas spore's explosion resulted in "killed by a died"
allow optional parameter "true", "yes", "false", or "no" for boolean options allow optional parameter "true", "yes", "false", or "no" for boolean options
actually make the castle chest not trapped actually make the castle chest not trapped
level-drain resistance wasn't shown during enlightenment if it was conferred
by worn/wielded equipment or by lycanthropy
wizard mode enlightenment now shows more reasons for various intrinsics
rehumanizing after being poly'd into vampire left hero with ability to sense
humans and elves
Warn_of_mon wouldn't have been able to sense giant ants if any creature were
to have that ability, caused by using 0 instead of NON_PM for 'none'
tone down energy vortex's drain energy attack
fix message typo if tame mind flayer dies trying to eat Medusa's brains
use alternate rejection message if attempting to name an unnameable monster
with the name it already has
cockatrice corpse no longer leaves multiple statues for shape-shifted vampire
alter name of monster causing hero's death if name contains characters that
could cause confusion when using record, logfile, or xlogfile later
teleporting or polymorphing a sink via ring drop shouldn't depend upon being
able to see it happen
change "unlockable chest" to "broken chest" so that it won't be misunderstood
("capable of being unlocked" vs intended "not capable of being locked")
use doname instead of xname when using '/' or ';' to look at objects on map
when a pet moves reluctantly, name the top item of the pile it is reluctant
to step on if the hero sees or remembers any object(s) at that spot
Platform- and/or Interface-Specific Fixes Platform- and/or Interface-Specific Fixes
@@ -68,12 +88,17 @@ tty: specifying all four of role, race, gender, and alignment still prompted
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
unix: options file with CR+LF line ends and an invalid option line resulted in
"ad option line: "whatever-the-line-was
because embedded carriage return character changed cursor's position
win32gui: getversionstring() was overflowing the provided Help About buffer win32gui: getversionstring() was overflowing the provided Help About buffer
win32gui: guard against buffer overflow in in mswin_getlin() win32gui: guard against buffer overflow in in mswin_getlin()
MacOSX: initial binary release was built from out of date source code that MacOSX: initial binary release was built from out of date source code that
had 'BETA' and 'DEBUG' inappropriately enabled had 'BETA' and 'DEBUG' inappropriately enabled
X11: core bug for '`' (backtick) command was only noticed by X11 interface, MacOSX: force TIMED_DELAY build option on so that 'runmode' run-time option
which issued impossible message "add_menu: called before start_menu" is functional
X11: core bug for '`' (backtick) and #terrain commands was only noticed by
X11 interface: impossible "add_menu: called before start_menu"
General New Features General New Features
@@ -84,7 +109,7 @@ 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
additional passages for Raising Steam additional tribute passages for Snuff and for Raising Steam
Platform- and/or Interface-Specific New Features Platform- and/or Interface-Specific New Features
+5 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 extern.h $NHDT-Date: 1450432755 2015/12/18 09:59:15 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.521 $ */ /* NetHack 3.6 extern.h $NHDT-Date: 1451174855 2015/12/27 00:07:35 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.526 $ */
/* 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. */
@@ -835,6 +835,7 @@ E char *FDECL(lcase, (char *));
E char *FDECL(ucase, (char *)); E char *FDECL(ucase, (char *));
E char *FDECL(upstart, (char *)); E char *FDECL(upstart, (char *));
E char *FDECL(mungspaces, (char *)); E char *FDECL(mungspaces, (char *));
E char *FDECL(strip_newline, (char *));
E char *FDECL(eos, (char *)); E char *FDECL(eos, (char *));
E boolean FDECL(str_end_is, (const char *, const char *)); E boolean FDECL(str_end_is, (const char *, const char *));
E char *FDECL(strkitten, (char *, CHAR_P)); E char *FDECL(strkitten, (char *, CHAR_P));
@@ -1350,6 +1351,7 @@ E void FDECL(golemeffects, (struct monst *, int, int));
E boolean FDECL(angry_guards, (BOOLEAN_P)); E boolean FDECL(angry_guards, (BOOLEAN_P));
E void NDECL(pacify_guards); E void NDECL(pacify_guards);
E void FDECL(decide_to_shapeshift, (struct monst *, int)); E void FDECL(decide_to_shapeshift, (struct monst *, int));
E boolean FDECL(vamp_stone, (struct monst *));
/* ### mondata.c ### */ /* ### mondata.c ### */
@@ -2297,6 +2299,7 @@ E void NDECL(timer_sanity_check);
E void FDECL(formatkiller, (char *, unsigned, int, BOOLEAN_P)); E void FDECL(formatkiller, (char *, unsigned, int, BOOLEAN_P));
E void FDECL(topten, (int, time_t)); E void FDECL(topten, (int, time_t));
E void FDECL(prscore, (int, char **)); E void FDECL(prscore, (int, char **));
E struct toptenentry *NDECL(get_rnd_toptenentry);
E struct obj *FDECL(tt_oname, (struct obj *)); E struct obj *FDECL(tt_oname, (struct obj *));
/* ### track.c ### */ /* ### track.c ### */
@@ -2609,6 +2612,7 @@ E void FDECL(new_were, (struct monst *));
E int FDECL(were_summon, (struct permonst *, BOOLEAN_P, int *, char *)); E int FDECL(were_summon, (struct permonst *, BOOLEAN_P, int *, char *));
E void NDECL(you_were); E void NDECL(you_were);
E void FDECL(you_unwere, (BOOLEAN_P)); E void FDECL(you_unwere, (BOOLEAN_P));
E void FDECL(set_ulycn, (int));
/* ### wield.c ### */ /* ### wield.c ### */
+1 -3
View File
@@ -318,9 +318,7 @@ struct savefile_info {
#define PL_NSIZ 32 /* name of player, ghost, shopkeeper */ #define PL_NSIZ 32 /* name of player, ghost, shopkeeper */
#define PL_CSIZ 32 /* sizeof pl_character */ #define PL_CSIZ 32 /* sizeof pl_character */
#define PL_FSIZ 32 /* fruit name */ #define PL_FSIZ 32 /* fruit name */
#define PL_PSIZ \ #define PL_PSIZ 63 /* player-given names for pets, other monsters, objects */
63 /* player-given names for pets, other \
* monsters, objects */
#define MAXDUNGEON 16 /* current maximum number of dungeons */ #define MAXDUNGEON 16 /* current maximum number of dungeons */
#define MAXLEVEL 32 /* max number of levels in one dungeon */ #define MAXLEVEL 32 /* max number of levels in one dungeon */
+1 -3
View File
@@ -95,9 +95,7 @@ struct obj {
Bitfield(recharged, 3); /* number of times it's been recharged */ Bitfield(recharged, 3); /* number of times it's been recharged */
#define on_ice recharged /* corpse on ice */ #define on_ice recharged /* corpse on ice */
Bitfield(lamplit, 1); /* a light-source -- can be lit */ Bitfield(lamplit, 1); /* a light-source -- can be lit */
Bitfield( Bitfield(globby, 1); /* combines with like types on adjacent squares */
globby,
1); /* globby; will combine with like types on adjacent squares */
Bitfield(greased, 1); /* covered with grease */ Bitfield(greased, 1); /* covered with grease */
Bitfield(nomerge, 1); /* set temporarily to prevent merging */ Bitfield(nomerge, 1); /* set temporarily to prevent merging */
Bitfield(was_thrown, 1); /* thrown by hero since last picked up */ Bitfield(was_thrown, 1); /* thrown by hero since last picked up */
+2 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 patchlevel.h $NHDT-Date: 1450306740 2015/12/16 22:59:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.115 $ */ /* NetHack 3.6 patchlevel.h $NHDT-Date: 1451600769 2015/12/31 22:26:09 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.116 $ */
/* 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. */
@@ -15,7 +15,7 @@
*/ */
#define EDITLEVEL 0 #define EDITLEVEL 0
#define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2015" #define COPYRIGHT_BANNER_A "NetHack, Copyright 1985-2016"
#define COPYRIGHT_BANNER_B \ #define COPYRIGHT_BANNER_B \
" By Stichting Mathematisch Centrum and M. Stephenson." " By Stichting Mathematisch Centrum and M. Stephenson."
/* COPYRIGHT_BANNER_C is generated by makedefs into date.h */ /* COPYRIGHT_BANNER_C is generated by makedefs into date.h */
+4 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 unixconf.h $NHDT-Date: 1447755973 2015/11/17 10:26:13 $ $NHDT-Branch: master $:$NHDT-Revision: 1.24 $ */ /* NetHack 3.6 unixconf.h $NHDT-Date: 1451342112 2015/12/28 22:35:12 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.25 $ */
/* 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. */
@@ -130,6 +130,9 @@
*/ */
/* #define TIMED_DELAY */ /* usleep() */ /* #define TIMED_DELAY */ /* usleep() */
#endif #endif
#if defined(MACOSX) && !defined(TIMED_DELAY)
#define TIMED_DELAY
#endif
/* /*
* If you define MAIL, then the player will be notified of new mail * If you define MAIL, then the player will be notified of new mail
+4 -5
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 allmain.c $NHDT-Date: 1450231173 2015/12/16 01:59:33 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.67 $ */ /* NetHack 3.6 allmain.c $NHDT-Date: 1451344214 2015/12/28 23:10:14 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.68 $ */
/* 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. */
@@ -296,10 +296,7 @@ boolean resuming;
change = 2; change = 2;
if (change && !Unchanging) { if (change && !Unchanging) {
if (multi >= 0) { if (multi >= 0) {
if (occupation) stop_occupation();
stop_occupation();
else
nomul(0);
if (change == 1) if (change == 1)
polyself(0); polyself(0);
else else
@@ -491,6 +488,8 @@ stop_occupation()
context.botl = 1; /* in case u.uhs changed */ context.botl = 1; /* in case u.uhs changed */
nomul(0); nomul(0);
pushch(0); pushch(0);
} else if (multi >= 0) {
nomul(0);
} }
} }
+20 -17
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 artifact.c $NHDT-Date: 1446369462 2015/11/01 09:17:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.96 $ */ /* NetHack 3.6 artifact.c $NHDT-Date: 1451081581 2015/12/25 22:13:01 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.99 $ */
/* 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. */
@@ -18,13 +18,12 @@ extern boolean notonhead; /* for long worms */
#define get_artifact(o) \ #define get_artifact(o) \
(((o) && (o)->oartifact) ? &artilist[(int) (o)->oartifact] : 0) (((o) && (o)->oartifact) ? &artilist[(int) (o)->oartifact] : 0)
STATIC_DCL boolean STATIC_DCL boolean FDECL(bane_applies, (const struct artifact *,
FDECL(bane_applies, (const struct artifact *, struct monst *)); struct monst *));
STATIC_DCL int FDECL(spec_applies, (const struct artifact *, struct monst *)); STATIC_DCL int FDECL(spec_applies, (const struct artifact *, struct monst *));
STATIC_DCL int FDECL(arti_invoke, (struct obj *)); STATIC_DCL int FDECL(arti_invoke, (struct obj *));
STATIC_DCL boolean STATIC_DCL boolean FDECL(Mb_hit, (struct monst * magr, struct monst *mdef,
FDECL(Mb_hit, (struct monst * magr, struct monst *mdef, struct obj *, int *, struct obj *, int *, int, BOOLEAN_P, char *));
int, BOOLEAN_P, char *));
STATIC_DCL unsigned long FDECL(abil_to_spfx, (long *)); STATIC_DCL unsigned long FDECL(abil_to_spfx, (long *));
STATIC_DCL uchar FDECL(abil_to_adtyp, (long *)); STATIC_DCL uchar FDECL(abil_to_adtyp, (long *));
STATIC_DCL boolean FDECL(untouchable, (struct obj *, BOOLEAN_P)); STATIC_DCL boolean FDECL(untouchable, (struct obj *, BOOLEAN_P));
@@ -462,12 +461,13 @@ boolean being_worn;
*/ */
void void
set_artifact_intrinsic(otmp, on, wp_mask) set_artifact_intrinsic(otmp, on, wp_mask)
register struct obj *otmp; struct obj *otmp;
boolean on; boolean on;
long wp_mask; long wp_mask;
{ {
long *mask = 0; long *mask = 0;
register const struct artifact *oart = get_artifact(otmp); register const struct artifact *art, *oart = get_artifact(otmp);
register struct obj *obj;
register uchar dtyp; register uchar dtyp;
register long spfx; register long spfx;
@@ -489,19 +489,21 @@ long wp_mask;
mask = &EDisint_resistance; mask = &EDisint_resistance;
else if (dtyp == AD_DRST) else if (dtyp == AD_DRST)
mask = &EPoison_resistance; mask = &EPoison_resistance;
else if (dtyp == AD_DRLI)
mask = &EDrain_resistance;
if (mask && wp_mask == W_ART && !on) { if (mask && wp_mask == W_ART && !on) {
/* find out if some other artifact also confers this intrinsic */ /* find out if some other artifact also confers this intrinsic;
/* if so, leave the mask alone */ if so, leave the mask alone */
register struct obj *obj; for (obj = invent; obj; obj = obj->nobj) {
for (obj = invent; obj; obj = obj->nobj)
if (obj != otmp && obj->oartifact) { if (obj != otmp && obj->oartifact) {
register const struct artifact *art = get_artifact(obj); art = get_artifact(obj);
if (art->cary.adtyp == dtyp) { if (art->cary.adtyp == dtyp) {
mask = (long *) 0; mask = (long *) 0;
break; break;
} }
} }
}
} }
if (mask) { if (mask) {
if (on) if (on)
@@ -514,10 +516,9 @@ long wp_mask;
spfx = (wp_mask != W_ART) ? oart->spfx : oart->cspfx; spfx = (wp_mask != W_ART) ? oart->spfx : oart->cspfx;
if (spfx && wp_mask == W_ART && !on) { if (spfx && wp_mask == W_ART && !on) {
/* don't change any spfx also conferred by other artifacts */ /* don't change any spfx also conferred by other artifacts */
register struct obj *obj;
for (obj = invent; obj; obj = obj->nobj) for (obj = invent; obj; obj = obj->nobj)
if (obj != otmp && obj->oartifact) { if (obj != otmp && obj->oartifact) {
register const struct artifact *art = get_artifact(obj); art = get_artifact(obj);
spfx &= ~art->cspfx; spfx &= ~art->cspfx;
} }
} }
@@ -1738,6 +1739,7 @@ long *abil;
{ &EAntimagic, AD_MAGM }, { &EAntimagic, AD_MAGM },
{ &EDisint_resistance, AD_DISN }, { &EDisint_resistance, AD_DISN },
{ &EPoison_resistance, AD_DRST }, { &EPoison_resistance, AD_DRST },
{ &EDrain_resistance, AD_DRLI },
}; };
int k; int k;
@@ -1792,7 +1794,6 @@ long *abil;
long wornmask = (W_ARM | W_ARMC | W_ARMH | W_ARMS long wornmask = (W_ARM | W_ARMC | W_ARMH | W_ARMS
| W_ARMG | W_ARMF | W_ARMU | W_ARMG | W_ARMF | W_ARMU
| W_AMUL | W_RINGL | W_RINGR | W_TOOL | W_AMUL | W_RINGL | W_RINGR | W_TOOL
/* [do W_ART and W_ARTI actually belong here?] */
| W_ART | W_ARTI); | W_ART | W_ARTI);
if (u.twoweap) if (u.twoweap)
@@ -1808,7 +1809,9 @@ long *abil;
if (art) { if (art) {
if (dtyp) { if (dtyp) {
if (art->cary.adtyp == dtyp || art->defn.adtyp == dtyp) if (art->cary.adtyp == dtyp /* carried */
|| (art->defn.adtyp == dtyp /* defends while worn */
&& (obj->owornmask & ~(W_ART | W_ARTI))))
return obj; return obj;
} }
if (spfx) { if (spfx) {
+59 -21
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 attrib.c $NHDT-Date: 1449269911 2015/12/04 22:58:31 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.51 $ */ /* NetHack 3.6 attrib.c $NHDT-Date: 1451111134 2015/12/26 06:25:34 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.54 $ */
/* Copyright 1988, 1989, 1990, 1992, M. Stephenson */ /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -83,10 +83,21 @@ static const struct innate {
{ 0, 0, 0, 0 } }, { 0, 0, 0, 0 } },
/* Intrinsics conferred by race */ /* Intrinsics conferred by race */
elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired" }, dwa_abil[] = { { 1, &HInfravision, "", "" },
{ 0, 0, 0, 0 } }, { 0, 0, 0, 0 } },
orc_abil[] = { { 1, &(HPoison_resistance), "", "" }, { 0, 0, 0, 0 } }; elf_abil[] = { { 1, &HInfravision, "", "" },
{ 4, &HSleep_resistance, "awake", "tired" },
{ 0, 0, 0, 0 } },
gno_abil[] = { { 1, &HInfravision, "", "" },
{ 0, 0, 0, 0 } },
orc_abil[] = { { 1, &HInfravision, "", "" },
{ 1, &HPoison_resistance, "", "" },
{ 0, 0, 0, 0 } },
hum_abil[] = { { 0, 0, 0, 0 } };
STATIC_DCL void NDECL(exerper); STATIC_DCL void NDECL(exerper);
STATIC_DCL void FDECL(postadjabil, (long *)); STATIC_DCL void FDECL(postadjabil, (long *));
@@ -686,15 +697,19 @@ long frommask;
} }
else if (frommask == FROMRACE) else if (frommask == FROMRACE)
switch (Race_switch) { switch (Race_switch) {
case PM_DWARF:
abil = dwa_abil;
break;
case PM_ELF: case PM_ELF:
abil = elf_abil; abil = elf_abil;
break; break;
case PM_GNOME:
abil = gno_abil;
break;
case PM_ORC: case PM_ORC:
abil = orc_abil; abil = orc_abil;
break; break;
case PM_HUMAN: case PM_HUMAN:
case PM_DWARF:
case PM_GNOME:
default: default:
break; break;
} }
@@ -707,31 +722,50 @@ long frommask;
return (struct innate *) 0; return (struct innate *) 0;
} }
/* /* reasons for innate ability */
* returns 1 if FROMRACE or FROMEXPER and exper level == 1 #define FROM_NONE 0
* returns 2 if FROMEXPER and exper level > 1 #define FROM_ROLE 1 /* from experience at level 1 */
* otherwise returns 0 #define FROM_RACE 2
*/ #define FROM_EXP 3 /* from experience for some level > 1 */
#define FROM_FORM 4
#define FROM_LYCN 5
/* check whether particular ability has been obtained via innate attribute */
STATIC_OVL int STATIC_OVL int
innately(ability) innately(ability)
long *ability; long *ability;
{ {
const struct innate *iptr; const struct innate *iptr;
if ((iptr = check_innate_abil(ability, FROMEXPER)) != 0)
return (iptr->ulevel == 1) ? FROM_ROLE : FROM_EXP;
if ((iptr = check_innate_abil(ability, FROMRACE)) != 0) if ((iptr = check_innate_abil(ability, FROMRACE)) != 0)
return 1; return FROM_RACE;
else if ((iptr = check_innate_abil(ability, FROMEXPER)) != 0) if ((*ability & FROMFORM) != 0L)
return (iptr->ulevel == 1) ? 1 : 2; return FROM_FORM;
return 0; return FROM_NONE;
} }
int int
is_innate(propidx) is_innate(propidx)
int propidx; int propidx;
{ {
int innateness;
/* innately() would report FROM_FORM for this; caller wants specificity */
if (propidx == DRAIN_RES && u.ulycn >= LOW_PM)
return FROM_LYCN;
if ((innateness = innately(&u.uprops[propidx].intrinsic)) != FROM_NONE)
return innateness;
if (propidx == JUMPING && Role_if(PM_KNIGHT)
/* knight has intrinsic jumping, but extrinsic is more versatile so
ignore innateness if equipment is going to claim responsibility */
&& !u.uprops[propidx].extrinsic)
return FROM_ROLE;
if (propidx == BLINDED && !haseyes(youmonst.data)) if (propidx == BLINDED && !haseyes(youmonst.data))
return 1; return FROM_FORM;
return innately(&u.uprops[propidx].intrinsic); return FROM_NONE;
} }
char * char *
@@ -750,14 +784,18 @@ int propidx; /* special cases can have negative values */
if (propidx >= 0) { if (propidx >= 0) {
char *p; char *p;
struct obj *obj = (struct obj *) 0; struct obj *obj = (struct obj *) 0;
int innate = is_innate(propidx); int innateness = is_innate(propidx);
if (innate == 2) if (innateness == FROM_EXP)
Strcpy(buf, " because of your experience"); Strcpy(buf, " because of your experience");
else if (innate == 1) else if (innateness == FROM_LYCN)
Strcpy(buf, " due to your lycanthropy");
else if (innateness == FROM_FORM)
Strcpy(buf, " from current creature form");
else if (innateness == FROM_ROLE || innateness == FROM_RACE)
Strcpy(buf, " innately"); Strcpy(buf, " innately");
else if (wizard else if (wizard
&& (obj = what_gives(&u.uprops[propidx].extrinsic))) && (obj = what_gives(&u.uprops[propidx].extrinsic)) != 0)
Sprintf(buf, because_of, obj->oartifact Sprintf(buf, because_of, obj->oartifact
? bare_artifactname(obj) ? bare_artifactname(obj)
: ysimple_name(obj)); : ysimple_name(obj));
+3 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 cmd.c $NHDT-Date: 1450473780 2015/12/18 21:23:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.211 $ */ /* NetHack 3.6 cmd.c $NHDT-Date: 1451082253 2015/12/25 22:24:13 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.212 $ */
/* 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. */
@@ -1176,6 +1176,7 @@ doterrain(VOID_ARGS)
* a legend for the levl[][].typ codes dump * a legend for the levl[][].typ codes dump
*/ */
men = create_nhwindow(NHW_MENU); men = create_nhwindow(NHW_MENU);
start_menu(men);
any = zeroany; any = zeroany;
any.a_int = 1; any.a_int = 1;
add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE, add_menu(men, NO_GLYPH, &any, 0, 0, ATR_NONE,
@@ -2040,7 +2041,7 @@ int final;
: "certain monsters"); : "certain monsters");
you_are(buf, ""); you_are(buf, "");
} }
if (Warn_of_mon && context.warntype.speciesidx) { if (Warn_of_mon && context.warntype.speciesidx >= LOW_PM) {
Sprintf(buf, "aware of the presence of %s", Sprintf(buf, "aware of the presence of %s",
makeplural(mons[context.warntype.speciesidx].mname)); makeplural(mons[context.warntype.speciesidx].mname));
you_are(buf, from_what(WARN_OF_MON)); you_are(buf, from_what(WARN_OF_MON));
+31 -13
View File
@@ -270,6 +270,8 @@ register struct obj *obj;
STATIC_DCL void STATIC_DCL void
polymorph_sink() polymorph_sink()
{ {
uchar sym = S_sink;
if (levl[u.ux][u.uy].typ != SINK) if (levl[u.ux][u.uy].typ != SINK)
return; return;
@@ -278,24 +280,33 @@ polymorph_sink()
switch (rn2(4)) { switch (rn2(4)) {
default: default:
case 0: case 0:
sym = S_fountain;
levl[u.ux][u.uy].typ = FOUNTAIN; levl[u.ux][u.uy].typ = FOUNTAIN;
level.flags.nfountains++; level.flags.nfountains++;
break; break;
case 1: case 1:
sym = S_throne;
levl[u.ux][u.uy].typ = THRONE; levl[u.ux][u.uy].typ = THRONE;
break; break;
case 2: case 2:
sym = S_altar;
levl[u.ux][u.uy].typ = ALTAR; levl[u.ux][u.uy].typ = ALTAR;
levl[u.ux][u.uy].altarmask = Align2amask(rn2((int) A_LAWFUL + 2) - 1); levl[u.ux][u.uy].altarmask = Align2amask(rn2((int) A_LAWFUL + 2) - 1);
break; break;
case 3: case 3:
sym = S_room;
levl[u.ux][u.uy].typ = ROOM; levl[u.ux][u.uy].typ = ROOM;
make_grave(u.ux, u.uy, (char *) 0); make_grave(u.ux, u.uy, (char *) 0);
if (levl[u.ux][u.uy].typ == GRAVE)
sym = S_grave;
break; break;
} }
pline_The("sink transforms into %s!", (levl[u.ux][u.uy].typ == THRONE) /* give message even if blind; we know we're not levitating,
? "a throne" so can feel the outcome even if we can't directly see it */
: an(surface(u.ux, u.uy))); if (levl[u.ux][u.uy].typ != ROOM)
pline_The("sink transforms into %s!", an(defsyms[sym].explanation));
else
pline_The("sink vanishes.");
newsym(u.ux, u.uy); newsym(u.ux, u.uy);
} }
@@ -407,11 +418,24 @@ register struct obj *obj;
/* Not the same as aggravate monster; besides, it's obvious. */ /* Not the same as aggravate monster; besides, it's obvious. */
pline("Several flies buzz around the sink."); pline("Several flies buzz around the sink.");
break; break;
case RIN_TELEPORTATION:
nosink = teleport_sink();
/* give message even if blind; we know we're not levitating,
so can feel the outcome even if we can't directly see it */
pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
ideed = FALSE;
break;
case RIN_POLYMORPH:
polymorph_sink();
nosink = TRUE;
/* for S_room case, same message as for teleportation is given */
ideed = (levl[u.ux][u.uy].typ != ROOM);
break;
default: default:
ideed = FALSE; ideed = FALSE;
break; break;
} }
if (!Blind && !ideed && obj->otyp != RIN_HUNGER) { if (!Blind && !ideed) {
ideed = TRUE; ideed = TRUE;
switch (obj->otyp) { /* effects that need eyes */ switch (obj->otyp) { /* effects that need eyes */
case RIN_ADORNMENT: case RIN_ADORNMENT:
@@ -449,20 +473,14 @@ register struct obj *obj;
case RIN_WARNING: case RIN_WARNING:
pline_The("sink glows %s for a moment.", hcolor(NH_WHITE)); pline_The("sink glows %s for a moment.", hcolor(NH_WHITE));
break; break;
case RIN_TELEPORTATION:
nosink = teleport_sink();
pline_The("sink %svanishes.", nosink ? "" : "momentarily ");
break;
case RIN_TELEPORT_CONTROL: case RIN_TELEPORT_CONTROL:
pline_The("sink looks like it is being beamed aboard somewhere."); pline_The("sink looks like it is being beamed aboard somewhere.");
break; break;
case RIN_POLYMORPH:
polymorph_sink();
nosink = TRUE;
break;
case RIN_POLYMORPH_CONTROL: case RIN_POLYMORPH_CONTROL:
pline_The( pline_The(
"sink momentarily looks like a regularly erupting geyser."); "sink momentarily looks like a regularly erupting geyser.");
break;
default:
break; break;
} }
} }
+56 -18
View File
@@ -7,6 +7,7 @@
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 void NDECL(do_mname); STATIC_DCL void NDECL(do_mname);
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 *));
STATIC_DCL void NDECL(namefloorobj); STATIC_DCL void NDECL(namefloorobj);
STATIC_DCL char *FDECL(bogusmon, (char *,char *)); STATIC_DCL char *FDECL(bogusmon, (char *,char *));
@@ -409,15 +410,45 @@ const char *name;
return mtmp; return mtmp;
} }
/* check whether user-supplied name matches or nearly matches an unnameable
monster's name; if so, give an alternate reject message for do_mname() */
STATIC_OVL boolean
alreadynamed(mtmp, monnambuf, usrbuf)
struct monst *mtmp;
char *monnambuf, *usrbuf;
{
char pronounbuf[10], *p;
if (fuzzymatch(usrbuf, monnambuf, " -_", TRUE)
/* catch trying to name "the Oracle" as "Oracle" */
|| (!strncmpi(monnambuf, "the ", 4)
&& fuzzymatch(usrbuf, monnambuf + 4, " -_", TRUE))
/* catch trying to name "invisible Orcus" as "Orcus" */
|| ((p = strstri(monnambuf, "invisible ")) != 0
&& fuzzymatch(usrbuf, p + 10, " -_", TRUE))
/* catch trying to name "the {priest,Angel} of Crom" as "Crom" */
|| ((p = strstri(monnambuf, " of ")) != 0
&& fuzzymatch(usrbuf, p + 4, " -_", TRUE))) {
pline("%s is already called %s.",
upstart(strcpy(pronounbuf, mhe(mtmp))), monnambuf);
return TRUE;
} else if (mtmp->data == &mons[PM_JUIBLEX]
&& strstri(monnambuf, "Juiblex")
&& !strcmpi(usrbuf, "Jubilex")) {
pline("%s doesn't like being called %s.", upstart(monnambuf), usrbuf);
return TRUE;
}
return FALSE;
}
/* allow player to assign a name to some chosen monster */ /* allow player to assign a name to some chosen monster */
STATIC_OVL void STATIC_OVL void
do_mname() do_mname()
{ {
char buf[BUFSZ], monnambuf[BUFSZ]; char buf[BUFSZ], monnambuf[BUFSZ], qbuf[QBUFSZ];
coord cc; coord cc;
register int cx, cy; int cx, cy;
register struct monst *mtmp; struct monst *mtmp = 0;
char qbuf[QBUFSZ];
if (Hallucination) { if (Hallucination) {
You("would never recognize it anyway."); You("would never recognize it anyway.");
@@ -431,9 +462,9 @@ do_mname()
cy = cc.y; cy = cc.y;
if (cx == u.ux && cy == u.uy) { if (cx == u.ux && cy == u.uy) {
if (u.usteed && canspotmon(u.usteed)) if (u.usteed && canspotmon(u.usteed)) {
mtmp = u.usteed; mtmp = u.usteed;
else { } else {
pline("This %s creature is called %s and cannot be renamed.", pline("This %s creature is called %s and cannot be renamed.",
beautiful(), plname); beautiful(), plname);
return; return;
@@ -459,18 +490,25 @@ do_mname()
/* strip leading and trailing spaces; unnames monster if all spaces */ /* strip leading and trailing spaces; unnames monster if all spaces */
(void) mungspaces(buf); (void) mungspaces(buf);
/* unique monsters have their own specific names or titles; /* Unique monsters have their own specific names or titles.
shopkeepers, temple priests and other minions use alternate * Shopkeepers, temple priests and other minions use alternate
name formatting routines which ignore any user-supplied name */ * name formatting routines which ignore any user-supplied name.
if ((mtmp->data->geno & G_UNIQ) && !mtmp->ispriest) *
pline("%s doesn't like being called names!", upstart(monnambuf)); * Don't say the name is being rejected if it happens to match
else if (mtmp->isshk * the existing name.
&& !(Deaf || mtmp->msleeping || !mtmp->mcanmove */
|| mtmp->data->msound <= MS_ANIMAL)) if ((mtmp->data->geno & G_UNIQ) && !mtmp->ispriest) {
verbalize("I'm %s, not %s.", shkname(mtmp), buf); if (!alreadynamed(mtmp, monnambuf, buf))
else if (mtmp->ispriest || mtmp->isminion || mtmp->isshk) pline("%s doesn't like being called names!", upstart(monnambuf));
pline("%s will not accept the name %s.", upstart(monnambuf), buf); } else if (mtmp->isshk
else && !(Deaf || mtmp->msleeping || !mtmp->mcanmove
|| mtmp->data->msound <= MS_ANIMAL)) {
if (!alreadynamed(mtmp, monnambuf, buf))
verbalize("I'm %s, not %s.", shkname(mtmp), buf);
} else if (mtmp->ispriest || mtmp->isminion || mtmp->isshk) {
if (!alreadynamed(mtmp, monnambuf, buf))
pline("%s will not accept the name %s.", upstart(monnambuf), buf);
} else
(void) christen_monst(mtmp, buf); (void) christen_monst(mtmp, buf);
} }
+26 -13
View File
@@ -405,9 +405,10 @@ int udist;
omx = mtmp->mx; omx = mtmp->mx;
omy = mtmp->my; omy = mtmp->my;
/* if we are carrying something then we drop it (perhaps near @) */ /* If we are carrying something then we drop it (perhaps near @).
/* Note: if apport == 1 then our behaviour is independent of udist */ * Note: if apport == 1 then our behaviour is independent of udist.
/* Use udist+1 so steed won't cause divide by zero */ * Use udist+1 so steed won't cause divide by zero.
*/
if (droppables(mtmp)) { if (droppables(mtmp)) {
if (!rn2(udist + 1) || !rn2(edog->apport)) if (!rn2(udist + 1) || !rn2(edog->apport))
if (rn2(10) < edog->apport) { if (rn2(10) < edog->apport) {
@@ -459,7 +460,7 @@ int udist;
return 0; return 0;
} }
/* set dog's goal -- gtyp, gx, gy /* set dog's goal -- gtyp, gx, gy;
returns -1/0/1 (dog's desire to approach player) or -2 (abort move) */ returns -1/0/1 (dog's desire to approach player) or -2 (abort move) */
STATIC_OVL int STATIC_OVL int
dog_goal(mtmp, edog, after, udist, whappr) dog_goal(mtmp, edog, after, udist, whappr)
@@ -613,7 +614,7 @@ int after, udist, whappr;
int int
dog_move(mtmp, after) dog_move(mtmp, after)
register struct monst *mtmp; register struct monst *mtmp;
register int after; /* this is extra fast monster movement */ int after; /* this is extra fast monster movement */
{ {
int omx, omy; /* original mtmp position */ int omx, omy; /* original mtmp position */
int appr, whappr, udist; int appr, whappr, udist;
@@ -794,6 +795,7 @@ register int after; /* this is extra fast monster movement */
&& better_with_displacing && !undesirable_disp(mtmp, nx, ny)) { && better_with_displacing && !undesirable_disp(mtmp, nx, ny)) {
int mstatus; int mstatus;
register struct monst *mtmp2 = m_at(nx, ny); register struct monst *mtmp2 = m_at(nx, ny);
mstatus = mdisplacem(mtmp, mtmp2, FALSE); /* displace monster */ mstatus = mdisplacem(mtmp, mtmp2, FALSE); /* displace monster */
if (mstatus & MM_DEF_DIED) if (mstatus & MM_DEF_DIED)
return 2; return 2;
@@ -814,12 +816,13 @@ register int after; /* this is extra fast monster movement */
if (mtmp->mleashed) { if (mtmp->mleashed) {
if (!Deaf) if (!Deaf)
whimper(mtmp); whimper(mtmp);
} else } else {
/* 1/40 chance of stepping on it anyway, in case /* 1/40 chance of stepping on it anyway, in case
* it has to pass one to follow the player... * it has to pass one to follow the player...
*/ */
if (trap->tseen && rn2(40)) if (trap->tseen && rn2(40))
continue; continue;
}
} }
} }
@@ -827,9 +830,9 @@ register int after; /* this is extra fast monster movement */
/* (minion isn't interested; `cursemsg' stays FALSE) */ /* (minion isn't interested; `cursemsg' stays FALSE) */
if (has_edog) if (has_edog)
for (obj = level.objects[nx][ny]; obj; obj = obj->nexthere) { for (obj = level.objects[nx][ny]; obj; obj = obj->nexthere) {
if (obj->cursed) if (obj->cursed) {
cursemsg[i] = TRUE; cursemsg[i] = TRUE;
else if ((otyp = dogfood(mtmp, obj)) < MANFOOD } else if ((otyp = dogfood(mtmp, obj)) < MANFOOD
&& (otyp < ACCFOOD && (otyp < ACCFOOD
|| edog->hungrytime <= monstermoves)) { || edog->hungrytime <= monstermoves)) {
/* Note: our dog likes the food so much that he /* Note: our dog likes the food so much that he
@@ -906,13 +909,23 @@ newdogpos:
wasseen = canseemon(mtmp); wasseen = canseemon(mtmp);
remove_monster(omx, omy); remove_monster(omx, omy);
place_monster(mtmp, nix, niy); place_monster(mtmp, nix, niy);
if (cursemsg[chi] && (wasseen || canseemon(mtmp))) if (cursemsg[chi] && (wasseen || canseemon(mtmp))) {
pline("%s moves only reluctantly.", noit_Monnam(mtmp)); /* describe top item of pile, not necessarily cursed item itself;
don't use glyph_at() here--it would return the pet but we want
to know whether an object is remembered at this map location */
struct obj *o = (!Hallucination
&& glyph_is_object(levl[nix][niy].glyph))
? vobj_at(nix, niy) : 0;
const char *what = o ? distant_name(o, doname) : something;
pline("%s %s reluctantly over %s.", noit_Monnam(mtmp),
vtense((char *) 0, locomotion(mtmp->data, "step")), what);
}
for (j = MTSZ - 1; j > 0; j--) for (j = MTSZ - 1; j > 0; j--)
mtmp->mtrack[j] = mtmp->mtrack[j - 1]; mtmp->mtrack[j] = mtmp->mtrack[j - 1];
mtmp->mtrack[0].x = omx; mtmp->mtrack[0].x = omx;
mtmp->mtrack[0].y = omy; mtmp->mtrack[0].y = omy;
/* We have to know if the pet's gonna do a combined eat and /* We have to know if the pet's going to do a combined eat and
* move before moving it, but it can't eat until after being * move before moving it, but it can't eat until after being
* moved. Thus the do_eat flag. * moved. Thus the do_eat flag.
*/ */
@@ -1012,7 +1025,7 @@ xchar mx, my, fx, fy;
return FALSE; return FALSE;
} }
/*ARGSUSED*/ /* do_clear_area client */ /* do_clear_area client */
STATIC_PTR void STATIC_PTR void
wantdoor(x, y, distance) wantdoor(x, y, distance)
int x, y; int x, y;
+12 -13
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 eat.c $NHDT-Date: 1450573885 2015/12/20 01:11:25 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.156 $ */ /* NetHack 3.6 eat.c $NHDT-Date: 1451086430 2015/12/25 23:33:50 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.157 $ */
/* 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. */
@@ -494,7 +494,7 @@ int *dmg_p; /* for dishing out extra damage in lieu of Int loss */
} else { } else {
if (magr->mtame && !visflag) if (magr->mtame && !visflag)
/* parallels mhitm.c's brief_feeling */ /* parallels mhitm.c's brief_feeling */
You("have a sad thought for a moment, then is passes."); You("have a sad thought for a moment, then it passes.");
return MM_AGR_DIED; return MM_AGR_DIED;
} }
} }
@@ -903,7 +903,7 @@ cpostfx(pm)
register int pm; register int pm;
{ {
register int tmp = 0; register int tmp = 0;
boolean catch_lycanthropy = FALSE; int catch_lycanthropy = NON_PM;
/* in case `afternmv' didn't get called for previously mimicking /* in case `afternmv' didn't get called for previously mimicking
gold, clean up now to avoid `eatmbuf' memory leak */ gold, clean up now to avoid `eatmbuf' memory leak */
@@ -931,16 +931,13 @@ register int pm;
pluslvl(FALSE); pluslvl(FALSE);
break; break;
case PM_HUMAN_WERERAT: case PM_HUMAN_WERERAT:
catch_lycanthropy = TRUE; catch_lycanthropy = PM_WERERAT;
u.ulycn = PM_WERERAT;
break; break;
case PM_HUMAN_WEREJACKAL: case PM_HUMAN_WEREJACKAL:
catch_lycanthropy = TRUE; catch_lycanthropy = PM_WEREJACKAL;
u.ulycn = PM_WEREJACKAL;
break; break;
case PM_HUMAN_WEREWOLF: case PM_HUMAN_WEREWOLF:
catch_lycanthropy = TRUE; catch_lycanthropy = PM_WEREWOLF;
u.ulycn = PM_WEREWOLF;
break; break;
case PM_NURSE: case PM_NURSE:
if (Upolyd) if (Upolyd)
@@ -1096,12 +1093,14 @@ register int pm;
gainstr((struct obj *) 0, 0, TRUE); gainstr((struct obj *) 0, 0, TRUE);
else if (tmp > 0) else if (tmp > 0)
givit(tmp, ptr); givit(tmp, ptr);
} break; break;
} } /* default case */
} /* switch */
if (catch_lycanthropy) if (catch_lycanthropy >= LOW_PM) {
set_ulycn(catch_lycanthropy);
retouch_equipment(2); retouch_equipment(2);
}
return; return;
} }
+5 -12
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 files.c $NHDT-Date: 1449830204 2015/12/11 10:36:44 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.194 $ */ /* NetHack 3.6 files.c $NHDT-Date: 1451001643 2015/12/25 00:00:43 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.197 $ */
/* 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. */
@@ -2563,7 +2563,7 @@ read_config_file(filename, src)
const char *filename; const char *filename;
int src; int src;
{ {
char buf[4 * BUFSZ], *p; char buf[4 * BUFSZ];
FILE *fp; FILE *fp;
boolean rv = TRUE; /* assume successful parse */ boolean rv = TRUE; /* assume successful parse */
@@ -2581,9 +2581,7 @@ line at this level.
OR: Forbid multiline stuff for alternate config sources. OR: Forbid multiline stuff for alternate config sources.
*/ */
#endif #endif
if ((p = index(buf, '\n')) != 0) if (!parse_config_line(fp, strip_newline(buf), src)) {
*p = '\0';
if (!parse_config_line(fp, buf, src)) {
static const char badoptionline[] = "Bad option line: \"%s\""; static const char badoptionline[] = "Bad option line: \"%s\"";
/* truncate buffer if it's long; this is actually conservative */ /* truncate buffer if it's long; this is actually conservative */
@@ -3501,7 +3499,6 @@ char *nowin_buf;
unsigned oid; /* book identifier */ unsigned oid; /* book identifier */
{ {
dlb *fp; dlb *fp;
char *endp;
char line[BUFSZ], lastline[BUFSZ]; char line[BUFSZ], lastline[BUFSZ];
int scope = 0; int scope = 0;
@@ -3552,18 +3549,14 @@ unsigned oid; /* book identifier */
*line = *lastline = '\0'; *line = *lastline = '\0';
while (dlb_fgets(line, sizeof line, fp) != 0) { while (dlb_fgets(line, sizeof line, fp) != 0) {
linect++; linect++;
if ((endp = index(line, '\n')) != 0) (void) strip_newline(line);
*endp = 0;
switch (line[0]) { switch (line[0]) {
case '%': case '%':
if (!strncmpi(&line[1], "section ", sizeof("section ") - 1)) { if (!strncmpi(&line[1], "section ", sizeof("section ") - 1)) {
char *st = &line[9]; /* 9 from "%section " */ char *st = &line[9]; /* 9 from "%section " */
scope = SECTIONSCOPE; scope = SECTIONSCOPE;
if (!strcmpi(st, tribsection)) matchedsection = !strcmpi(st, tribsection) ? TRUE : FALSE;
matchedsection = TRUE;
else
matchedsection = FALSE;
} else if (!strncmpi(&line[1], "title ", sizeof("title ") - 1)) { } else if (!strncmpi(&line[1], "title ", sizeof("title ") - 1)) {
char *st = &line[7]; /* 7 from "%title " */ char *st = &line[7]; /* 7 from "%title " */
char *p1, *p2; char *p1, *p2;
+16
View File
@@ -18,6 +18,7 @@
char * ucase (char *) char * ucase (char *)
char * upstart (char *) char * upstart (char *)
char * mungspaces (char *) char * mungspaces (char *)
char * strip_newline (char *)
char * eos (char *) char * eos (char *)
boolean str_end_is (const char *, const char *) boolean str_end_is (const char *, const char *)
char * strkitten (char *,char) char * strkitten (char *,char)
@@ -158,6 +159,21 @@ char *bp;
return bp; return bp;
} }
/* remove \n from end of line; remove \r too if one is there */
char *
strip_newline(str)
char *str;
{
char *p = index(str, '\n');
if (p) {
if (p > str && *(p - 1) == '\r')
--p;
*p = '\0';
}
return str;
}
/* return the end of a string (pointing at '\0') */ /* return the end of a string (pointing at '\0') */
char * char *
eos(s) eos(s)
+1 -1
View File
@@ -1988,7 +1988,7 @@ register struct monst *mtmp;
struct obj *otmp; struct obj *otmp;
int mx, my; int mx, my;
if (!mtmp) if (!mtmp || Protection_from_shape_changers)
return; return;
mx = mtmp->mx; mx = mtmp->mx;
my = mtmp->my; my = mtmp->my;
+24 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mhitu.c $NHDT-Date: 1450016149 2015/12/13 14:15:49 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.131 $ */ /* NetHack 3.6 mhitu.c $NHDT-Date: 1451084422 2015/12/25 23:00:22 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.132 $ */
/* 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. */
@@ -273,6 +273,26 @@ struct attack *alt_attk_buf;
*alt_attk_buf = *attk; *alt_attk_buf = *attk;
attk = alt_attk_buf; attk = alt_attk_buf;
attk->adtyp = AD_STUN; attk->adtyp = AD_STUN;
/* make drain-energy damage be somewhat in proportion to energy */
} else if (attk->adtyp == AD_DREN) {
int ulev = max(u.ulevel, 6);
*alt_attk_buf = *attk;
attk = alt_attk_buf;
/* 3.6.0 used 4d6 but since energy drain came out of max energy
once current energy was gone, that tended to have a severe
effect on low energy characters; it's now 2d6 with ajustments */
if (u.uen <= 5 * ulev && attk->damn > 1) {
attk->damn -= 1; /* low energy: 2d6 -> 1d6 */
if (u.uenmax <= 2 * ulev && attk->damd > 3)
attk->damd -= 3; /* very low energy: 1d6 -> 1d3 */
} else if (u.uen > 12 * ulev) {
attk->damn += 1; /* high energy: 2d6 -> 3d6 */
if (u.uenmax > 20 * ulev)
attk->damd += 3; /* very high energy: 3d6 -> 3d9 */
/* note: 3d9 is slightly higher than previous 4d6 */
}
} }
return attk; return attk;
} }
@@ -1228,7 +1248,7 @@ register struct attack *mattk;
&& !Protection_from_shape_changers && !defends(AD_WERE, uwep)) { && !Protection_from_shape_changers && !defends(AD_WERE, uwep)) {
You_feel("feverish."); You_feel("feverish.");
exercise(A_CON, FALSE); exercise(A_CON, FALSE);
u.ulycn = monsndx(mdat); set_ulycn(monsndx(mdat));
retouch_equipment(2); retouch_equipment(2);
} }
break; break;
@@ -1450,7 +1470,7 @@ register struct attack *mattk;
break; break;
case AD_DREN: case AD_DREN:
hitmsg(mtmp, mattk); hitmsg(mtmp, mattk);
if (uncancelled && !rn2(4)) if (uncancelled && !rn2(4)) /* 25% chance */
drain_en(dmg); drain_en(dmg);
dmg = 0; dmg = 0;
break; break;
@@ -1840,7 +1860,7 @@ register struct attack *mattk;
break; break;
case AD_DREN: case AD_DREN:
/* AC magic cancellation doesn't help when engulfed */ /* AC magic cancellation doesn't help when engulfed */
if (!mtmp->mcan && rn2(4)) if (!mtmp->mcan && rn2(4)) /* 75% chance */
drain_en(tmp); drain_en(tmp);
tmp = 0; tmp = 0;
break; break;
+71 -3
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 mon.c $NHDT-Date: 1449908726 2015/12/12 08:25:26 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.200 $ */ /* NetHack 3.6 mon.c $NHDT-Date: 1451176552 2015/12/27 00:35:52 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.202 $ */
/* 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. */
@@ -2311,6 +2311,65 @@ struct monst *mtmp;
impossible("Can't polystone %s!", a_monnam(mtmp)); impossible("Can't polystone %s!", a_monnam(mtmp));
} }
boolean
vamp_stone(mtmp)
struct monst *mtmp;
{
if (is_vampshifter(mtmp)) {
int mndx = mtmp->cham;
int x = mtmp->mx, y = mtmp->my;
/* this only happens if shapeshifted */
if (mndx >= LOW_PM && mndx != monsndx(mtmp->data)
&& !(mvitals[mndx].mvflags & G_GENOD)) {
char buf[BUFSZ];
boolean in_door = (amorphous(mtmp->data)
&& closed_door(mtmp->mx, mtmp->my));
/* construct a format string before transformation */
Sprintf(buf, "The lapidifying %s %s %s",
x_monnam(mtmp, ARTICLE_NONE, (char *) 0,
SUPPRESS_SADDLE | SUPPRESS_HALLUCINATION
| SUPPRESS_INVISIBLE | SUPPRESS_IT,
FALSE),
amorphous(mtmp->data) ? "coalesces on the" :
is_flyer(mtmp->data) ? "drops to the" : "writhes on the",
surface(x,y));
mtmp->mcanmove = 1;
mtmp->mfrozen = 0;
if (mtmp->mhpmax <= 0)
mtmp->mhpmax = 10;
mtmp->mhp = mtmp->mhpmax;
/* this can happen if previously a fog cloud */
if (u.uswallow && (mtmp == u.ustuck))
expels(mtmp, mtmp->data, FALSE);
if (in_door) {
coord new_xy;
if (enexto(&new_xy, mtmp->mx, mtmp->my, &mons[mndx])) {
rloc_to(mtmp, new_xy.x, new_xy.y);
}
}
if (canspotmon(mtmp)) {
pline("%s!", buf);
display_nhwindow(WIN_MESSAGE, FALSE);
}
newcham(mtmp, &mons[mndx], FALSE, FALSE);
if (mtmp->data == &mons[mndx])
mtmp->cham = NON_PM;
else
mtmp->cham = mndx;
if (canspotmon(mtmp)) {
pline("%s rises from the %s with renewed agility!",
Amonnam(mtmp), surface(mtmp->mx, mtmp->my));
}
newsym(mtmp->mx, mtmp->my);
return FALSE; /* didn't petrify */
}
}
return TRUE;
}
/* make monster mtmp next to you (if possible); /* make monster mtmp next to you (if possible);
might place monst on far side of a wall or boulder */ might place monst on far side of a wall or boulder */
void void
@@ -3184,8 +3243,17 @@ boolean msg; /* "The oldmon turns into a newmon!" */
/* Does mdat care? */ /* Does mdat care? */
if (!noncorporeal(mdat) && !amorphous(mdat) if (!noncorporeal(mdat) && !amorphous(mdat)
&& !is_whirly(mdat) && (mdat != &mons[PM_YELLOW_LIGHT])) { && !is_whirly(mdat) && (mdat != &mons[PM_YELLOW_LIGHT])) {
You("break out of %s%s!", mon_nam(mtmp), char msgtrail[BUFSZ];
(is_animal(mdat) ? "'s stomach" : ""));
if (is_vampshifter(mtmp)) {
Strcpy(msgtrail, " that had been shapeshifted");
} else if (is_animal(mdat)) {
Strcpy(msgtrail, "'s stomach");
} else {
msgtrail[0] = '\0';
}
You("break out of %s%s!", mon_nam(mtmp), msgtrail);
mtmp->mhp = 1; /* almost dead */ mtmp->mhp = 1; /* almost dead */
} }
expels(mtmp, olddata, FALSE); expels(mtmp, olddata, FALSE);
+98 -99
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 monst.c $NHDT-Date: 1445556875 2015/10/22 23:34:35 $ $NHDT-Branch: master $:$NHDT-Revision: 1.53 $ */ /* NetHack 3.6 monst.c $NHDT-Date: 1451084423 2015/12/25 23:00:23 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.55 $ */
/* 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. */
@@ -28,17 +28,17 @@
void NDECL(monst_init); void NDECL(monst_init);
/* /*
* Entry Format: (from permonst.h) * Entry Format: (from permonst.h)
* *
* name, symbol (S_* defines), * name, symbol (S_* defines),
* difficulty level, move rate, armor class, magic resistance, * difficulty level, move rate, armor class, magic resistance,
* alignment, creation/geno flags (G_* defines), * alignment, creation/geno flags (G_* defines),
* 6 * attack structs ( type , damage-type, # dice, # sides ), * 6 * attack structs ( type , damage-type, # dice, # sides ),
* weight (WT_* defines), nutritional value, extension length, * weight (WT_* defines), nutritional value, extension length,
* sounds made (MS_* defines), physical size (MZ_* defines), * sounds made (MS_* defines), physical size (MZ_* defines),
* resistances, resistances conferred (both MR_* defines), * resistances, resistances conferred (both MR_* defines),
* 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively) * 3 * flag bitmaps (M1_*, M2_*, and M3_* defines respectively)
* symbol color (C(x) macro) * symbol color (C(x) macro)
*/ */
#define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, col) \ #define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, col) \
{ \ { \
@@ -59,37 +59,37 @@ void NDECL(monst_init);
} }
/* /*
* Rule #1: monsters of a given class are contiguous in the * Rule #1: monsters of a given class are contiguous in the
* mons[] array. * mons[] array.
* *
* Rule #2: monsters of a given class are presented in ascending * Rule #2: monsters of a given class are presented in ascending
* order of strength. * order of strength.
* *
* Rule #3: monster frequency is included in the geno mask; * Rule #3: monster frequency is included in the geno mask;
* the frequency can be from 0 to 7. 0's will also * the frequency can be from 0 to 7. 0's will also
* be skipped during generation. * be skipped during generation.
* *
* Rule #4: monster subclasses (e.g. giants) should be kept * Rule #4: monster subclasses (e.g. giants) should be kept
* together, unless it violates Rule 2. NOGEN monsters * together, unless it violates Rule 2. NOGEN monsters
* won't violate Rule 2. * won't violate Rule 2.
* *
* Guidelines for color assignment: * Guidelines for color assignment:
* *
* * Use the same color for all `growth stages' of a monster (ex. * * Use the same color for all `growth stages' of a monster (ex.
* little dog/big dog, baby naga/full-grown naga. * little dog/big dog, baby naga/full-grown naga.
* *
* * Use colors given in names wherever possible. If the class has `real' * * Use colors given in names wherever possible. If the class has `real'
* members with strong color associations, use those. * members with strong color associations, use those.
* *
* * Favor `cool' colors for cold-resistant monsters, `warm' ones for * * Favor `cool' colors for cold-resistant monsters, `warm' ones for
* fire-resistant ones. * fire-resistant ones.
* *
* * Try to reserve purple (magenta) for powerful `ruler' monsters (queen * * Try to reserve purple (magenta) for powerful `ruler' monsters (queen
* bee, kobold lord, &c.). * bee, kobold lord, &c.).
* *
* * Subject to all these constraints, try to use color to make as many * * Subject to all these constraints, try to use color to make as many
* distinctions as the / command (that is, within a monster letter * distinctions as the / command (that is, within a monster letter
* distinct names should map to distinct colors). * distinct names should map to distinct colors).
* *
* The aim in assigning colors is to be consistent enough so a player can * The aim in assigning colors is to be consistent enough so a player can
* become `intuitive' about them, deducing some or all of these rules * become `intuitive' about them, deducing some or all of these rules
@@ -331,13 +331,13 @@ NEARDATA struct permonst mons[] = {
M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, HI_ZAP), M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, HI_ZAP),
#if 0 /* not yet implemented */ #if 0 /* not yet implemented */
MON("beholder", S_EYE, MON("beholder", S_EYE,
LVL(6, 3, 4, 0, -10), (G_GENO | 2), LVL(6, 3, 4, 0, -10), (G_GENO | 2),
A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25), A(ATTK(AT_GAZE, AD_SLOW, 0, 0), ATTK(AT_GAZE, AD_SLEE, 2,25),
ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0), ATTK(AT_GAZE, AD_DISN, 0, 0), ATTK(AT_GAZE, AD_STON, 0, 0),
ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)), ATTK(AT_GAZE, AD_CNCL, 2, 4), ATTK(AT_BITE, AD_PHYS, 2, 4)),
SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0, SIZ(10, 10, MS_SILENT, MZ_SMALL), MR_COLD, 0,
M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS, M1_FLY | M1_BREATHLESS | M1_NOLIMBS | M1_NOHEAD | M1_MINDLESS,
M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_BROWN), M2_NOPOLY | M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_BROWN),
#endif #endif
/* /*
* felines * felines
@@ -878,7 +878,7 @@ NEARDATA struct permonst mons[] = {
M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_CYAN), M2_HOSTILE | M2_NEUTER, M3_INFRAVISIBLE, CLR_CYAN),
MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0), MON("energy vortex", S_VORTEX, LVL(6, 20, 2, 30, 0),
(G_GENO | G_NOCORPSE | 1), (G_GENO | G_NOCORPSE | 1),
A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 4, 6), A(ATTK(AT_ENGL, AD_ELEC, 1, 6), ATTK(AT_ENGL, AD_DREN, 2, 6),
ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK), ATTK(AT_NONE, AD_ELEC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(0, 0, MS_SILENT, MZ_HUGE), SIZ(0, 0, MS_SILENT, MZ_HUGE),
MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0, MR_ELEC | MR_SLEEP | MR_DISINT | MR_POISON | MR_STONE, 0,
@@ -1104,12 +1104,12 @@ NEARDATA struct permonst mons[] = {
M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, DRAGON_SILVER), M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, DRAGON_SILVER),
#if 0 /* DEFERRED */ #if 0 /* DEFERRED */
MON("baby shimmering dragon", S_DRAGON, MON("baby shimmering dragon", S_DRAGON,
LVL(12, 9, 2, 10, 0), G_GENO, LVL(12, 9, 2, 10, 0), G_GENO,
A(ATTK(AT_BITE, AD_PHYS, 2, 6), A(ATTK(AT_BITE, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0, SIZ(1500, 500, MS_ROAR, MZ_HUGE), 0, 0,
M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE, M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_CARNIVORE,
M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_CYAN), M2_HOSTILE | M2_STRONG | M2_GREEDY | M2_JEWELS, 0, CLR_CYAN),
#endif #endif
MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO, MON("baby red dragon", S_DRAGON, LVL(12, 9, 2, 10, 0), G_GENO,
A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -1174,15 +1174,15 @@ NEARDATA struct permonst mons[] = {
0, DRAGON_SILVER), 0, DRAGON_SILVER),
#if 0 /* DEFERRED */ #if 0 /* DEFERRED */
MON("shimmering dragon", S_DRAGON, MON("shimmering dragon", S_DRAGON,
LVL(15, 9, -1, 20, 4), (G_GENO | 1), LVL(15, 9, -1, 20, 4), (G_GENO | 1),
A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), A(ATTK(AT_BREA, AD_MAGM, 4, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4),
NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK),
SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0, SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC), 0, 0,
M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS M1_FLY | M1_THICK_HIDE | M1_NOHANDS | M1_SEE_INVIS | M1_OVIPAROUS
| M1_CARNIVORE, | M1_CARNIVORE,
M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_GREEDY | M2_JEWELS | M2_MAGIC,
0, CLR_CYAN), 0, CLR_CYAN),
#endif #endif
MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1), MON("red dragon", S_DRAGON, LVL(15, 9, -1, 20, -4), (G_GENO | 1),
A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8), A(ATTK(AT_BREA, AD_FIRE, 6, 6), ATTK(AT_BITE, AD_PHYS, 3, 8),
@@ -1465,13 +1465,13 @@ struct permonst _mons2[] = {
CLR_ORANGE), CLR_ORANGE),
#if 0 /* DEFERRED */ #if 0 /* DEFERRED */
MON("vorpal jabberwock", S_JABBERWOCK, MON("vorpal jabberwock", S_JABBERWOCK,
LVL(20, 12, -2, 50, 0), (G_GENO | 1), LVL(20, 12, -2, 50, 0), (G_GENO | 1),
A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10), A(ATTK(AT_BITE, AD_PHYS, 3, 10), ATTK(AT_BITE, AD_PHYS, 3, 10),
ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10), ATTK(AT_CLAW, AD_PHYS, 3, 10),
NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK),
SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0, SIZ(1300, 600, MS_BURBLE, MZ_LARGE), 0, 0,
M1_ANIMAL | M1_FLY | M1_CARNIVORE, M1_ANIMAL | M1_FLY | M1_CARNIVORE,
M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE, M2_HOSTILE | M2_STRONG | M2_NASTY | M2_COLLECT, M3_INFRAVISIBLE,
HI_LORD), HI_LORD),
#endif #endif
/* /*
@@ -1857,12 +1857,12 @@ struct permonst _mons2[] = {
M3_INFRAVISIBLE, CLR_BLUE), M3_INFRAVISIBLE, CLR_BLUE),
#if 0 /* DEFERRED */ #if 0 /* DEFERRED */
MON("vampire mage", S_VAMPIRE, MON("vampire mage", S_VAMPIRE,
LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1), LVL(20, 14, -4, 50, -9), (G_GENO | G_NOCORPSE | 1),
A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), A(ATTK(AT_CLAW, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 1, 8),
ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), ATTK(AT_MAGC, AD_SPEL, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
| M2_MALE | M2_MAGIC | M2_SHAPESHIFTER, | M2_MALE | M2_MAGIC | M2_SHAPESHIFTER,
M3_INFRAVISIBLE, HI_ZAP), M3_INFRAVISIBLE, HI_ZAP),
#endif #endif
@@ -2848,26 +2848,26 @@ struct permonst _mons2[] = {
| M2_COLLECT | M2_MAGIC, | M2_COLLECT | M2_MAGIC,
M3_CLOSE | M3_INFRAVISIBLE, HI_LORD), M3_CLOSE | M3_INFRAVISIBLE, HI_LORD),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
/* Two for elves - one of each sex. /* Two for elves - one of each sex.
*/ */
MON("Earendil", S_HUMAN, MON("Earendil", S_HUMAN,
LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
| M2_MALE | M2_COLLECT | M2_MAGIC, | M2_MALE | M2_COLLECT | M2_MAGIC,
M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD), M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD),
MON("Elwing", S_HUMAN, MON("Elwing", S_HUMAN,
LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ), LVL(20, 12, 0, 50, -20), (G_NOGEN | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), A(ATTK(AT_WEAP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP, SIZ(WT_ELF, 350, MS_LEADER, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG M2_NOPOLY | M2_ELF | M2_HUMAN | M2_PNAME | M2_PEACEFUL | M2_STRONG
| M2_FEMALE | M2_COLLECT | M2_MAGIC, | M2_FEMALE | M2_COLLECT | M2_MAGIC,
M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD), M3_CLOSE | M3_INFRAVISION | M3_INFRAVISIBLE, HI_LORD),
#endif #endif
MON("Hippocrates", S_HUMAN, LVL(20, 12, 0, 40, 0), (G_NOGEN | G_UNIQ), MON("Hippocrates", S_HUMAN, LVL(20, 12, 0, 40, 0), (G_NOGEN | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -3000,14 +3000,14 @@ struct permonst _mons2[] = {
M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD), M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISIBLE, HI_LORD),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
MON("Goblin King", S_ORC, MON("Goblin King", S_ORC,
LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ), LVL(15, 12, 10, 0, -15), (G_NOGEN | G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), ATTK(AT_CLAW, AD_SAMU, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0, SIZ(750, 350, MS_NEMESIS, MZ_HUMAN), 0, 0,
M1_HUMANOID | M1_OMNIVORE, M1_HUMANOID | M1_OMNIVORE,
M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY M2_NOPOLY | M2_ORC | M2_HOSTILE | M2_STRONG | M2_STALK | M2_NASTY
| M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC, | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT | M2_MAGIC,
M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE, M3_WANTSARTI | M3_WAITFORU | M3_INFRAVISION | M3_INFRAVISIBLE,
HI_LORD), HI_LORD),
#endif #endif
MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ), MON("Cyclops", S_GIANT, LVL(18, 12, 0, 0, -15), (G_NOGEN | G_UNIQ),
@@ -3126,13 +3126,13 @@ struct permonst _mons2[] = {
M3_INFRAVISIBLE, HI_DOMESTIC), M3_INFRAVISIBLE, HI_DOMESTIC),
#if 0 /* OBSOLETE */ #if 0 /* OBSOLETE */
MON("High-elf", S_HUMAN, MON("High-elf", S_HUMAN,
LVL(5, 12, 10, 10, -7), G_NOGEN, LVL(5, 12, 10, 10, -7), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP, SIZ(WT_ELF, 350, MS_GUARDIAN, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE, M1_HUMANOID | M1_SEE_INVIS | M1_OMNIVORE,
M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT, M2_NOPOLY | M2_ELF | M2_PEACEFUL | M2_COLLECT,
M3_INFRAVISION | M3_INFRAVISIBLE, HI_DOMESTIC), M3_INFRAVISION | M3_INFRAVISIBLE, HI_DOMESTIC),
#endif #endif
MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN, MON("attendant", S_HUMAN, LVL(5, 12, 10, 10, 3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -3230,7 +3230,6 @@ monst_init()
struct attack sa_yes[NATTK] = SEDUCTION_ATTACKS_YES; struct attack sa_yes[NATTK] = SEDUCTION_ATTACKS_YES;
struct attack sa_no[NATTK] = SEDUCTION_ATTACKS_NO; struct attack sa_no[NATTK] = SEDUCTION_ATTACKS_NO;
#endif #endif
/*monst.c*/ /*monst.c*/
+5 -1
View File
@@ -828,7 +828,10 @@ boolean with_price;
if (lknown && Is_box(obj)) { if (lknown && Is_box(obj)) {
if (obj->obroken) if (obj->obroken)
Strcat(prefix, "unlockable "); /* 3.6.0 used "unlockable" here but that could be misunderstood
to mean "capable of being unlocked" rather than the intended
"not capable of being locked" */
Strcat(prefix, "broken ");
else if (obj->olocked) else if (obj->olocked)
Strcat(prefix, "locked "); Strcat(prefix, "locked ");
else else
@@ -2386,6 +2389,7 @@ struct alt_spellings {
{ "grappling iron", GRAPPLING_HOOK }, { "grappling iron", GRAPPLING_HOOK },
{ "grapnel", GRAPPLING_HOOK }, { "grapnel", GRAPPLING_HOOK },
{ "grapple", GRAPPLING_HOOK }, { "grapple", GRAPPLING_HOOK },
{ "protection from shape shifters", RIN_PROTECTION_FROM_SHAPE_CHAN },
/* normally we wouldn't have to worry about unnecessary <space>, but /* normally we wouldn't have to worry about unnecessary <space>, but
" stone" will get stripped off, preventing a wishymatch; that actually " stone" will get stripped off, preventing a wishymatch; that actually
lets "flint stone" be a match, so we also accept bogus "flintstone" */ lets "flint stone" be a match, so we also accept bogus "flintstone" */
+5 -8
View File
@@ -127,7 +127,7 @@ int x, y, glyph;
if (otmp) { if (otmp) {
Strcpy(buf, (otmp->otyp != STRANGE_OBJECT) Strcpy(buf, (otmp->otyp != STRANGE_OBJECT)
? distant_name(otmp, xname) ? distant_name(otmp, doname)
: obj_descr[STRANGE_OBJECT].oc_name); : obj_descr[STRANGE_OBJECT].oc_name);
if (fakeobj) if (fakeobj)
dealloc_obj(otmp), otmp = 0; dealloc_obj(otmp), otmp = 0;
@@ -476,7 +476,7 @@ boolean user_typed_name, without_asking;
} else if (!skipping_entry) { } else if (!skipping_entry) {
if (!(ep = index(buf, '\n'))) if (!(ep = index(buf, '\n')))
goto bad_data_file; goto bad_data_file;
*ep = 0; (void) strip_newline((ep > buf) ? ep - 1 : ep);
/* if we match a key that begins with "~", skip this entry */ /* if we match a key that begins with "~", skip this entry */
chk_skip = (*buf == '~') ? 1 : 0; chk_skip = (*buf == '~') ? 1 : 0;
if (pmatch(&buf[chk_skip], dbase_str) if (pmatch(&buf[chk_skip], dbase_str)
@@ -524,8 +524,7 @@ boolean user_typed_name, without_asking;
for (i = 0; i < entry_count; i++) { for (i = 0; i < entry_count; i++) {
if (!dlb_fgets(buf, BUFSZ, fp)) if (!dlb_fgets(buf, BUFSZ, fp))
goto bad_data_file; goto bad_data_file;
if ((ep = index(buf, '\n')) != 0) (void) strip_newline(buf);
*ep = 0;
if (index(buf + 1, '\t') != 0) if (index(buf + 1, '\t') != 0)
(void) tabexpand(buf + 1); (void) tabexpand(buf + 1);
putstr(datawin, 0, buf + 1); putstr(datawin, 0, buf + 1);
@@ -1126,7 +1125,7 @@ char *cbuf;
{ {
dlb *fp; dlb *fp;
char bufr[BUFSZ]; char bufr[BUFSZ];
register char *buf = &bufr[6], *ep, ctrl, meta; register char *buf = &bufr[6], ctrl, meta;
fp = dlb_fopen(CMDHELPFILE, "r"); fp = dlb_fopen(CMDHELPFILE, "r");
if (!fp) { if (!fp) {
@@ -1140,9 +1139,7 @@ char *cbuf;
if ((ctrl && *buf == '^' && *(buf + 1) == ctrl) if ((ctrl && *buf == '^' && *(buf + 1) == ctrl)
|| (meta && *buf == 'M' && *(buf + 1) == '-' || (meta && *buf == 'M' && *(buf + 1) == '-'
&& *(buf + 2) == meta) || *buf == q) { && *(buf + 2) == meta) || *buf == q) {
ep = index(buf, '\n'); (void) strip_newline(buf);
if (ep)
*ep = 0;
if (ctrl && buf[2] == '\t') { if (ctrl && buf[2] == '\t') {
buf = bufr + 1; buf = bufr + 1;
(void) strncpy(buf, "^? ", 8); (void) strncpy(buf, "^? ", 8);
+13 -21
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 polyself.c $NHDT-Date: 1448496566 2015/11/26 00:09:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.104 $ */ /* NetHack 3.6 polyself.c $NHDT-Date: 1451082254 2015/12/25 22:24:14 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.105 $ */
/* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */ /* Copyright (C) 1987, 1988, 1989 by Ken Arromdee */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -28,7 +28,7 @@ STATIC_DCL void FDECL(drop_weapon, (int));
STATIC_DCL void NDECL(uunstick); STATIC_DCL void NDECL(uunstick);
STATIC_DCL int FDECL(armor_to_dragon, (int)); STATIC_DCL int FDECL(armor_to_dragon, (int));
STATIC_DCL void NDECL(newman); STATIC_DCL void NDECL(newman);
STATIC_DCL boolean FDECL(polysense, (struct permonst *)); STATIC_DCL void NDECL(polysense);
STATIC_VAR const char no_longer_petrify_resistant[] = STATIC_VAR const char no_longer_petrify_resistant[] =
"No longer petrify-resistant, you"; "No longer petrify-resistant, you";
@@ -100,6 +100,8 @@ set_uasmon()
#ifdef STATUS_VIA_WINDOWPORT #ifdef STATUS_VIA_WINDOWPORT
status_initialize(REASSESS_ONLY); status_initialize(REASSESS_ONLY);
#endif #endif
polysense();
} }
/* Levitation overrides Flying; set or clear BFlying|I_SPECIAL */ /* Levitation overrides Flying; set or clear BFlying|I_SPECIAL */
@@ -347,7 +349,6 @@ newman()
Strcpy(killer.name, "unsuccessful polymorph"); Strcpy(killer.name, "unsuccessful polymorph");
done(DIED); done(DIED);
newuhs(FALSE); newuhs(FALSE);
(void) polysense(youmonst.data);
return; /* lifesaved */ return; /* lifesaved */
} }
} }
@@ -362,7 +363,6 @@ newman()
make_slimed(10L, (const char *) 0); make_slimed(10L, (const char *) 0);
} }
(void) polysense(youmonst.data);
context.botl = 1; context.botl = 1;
see_monsters(); see_monsters();
(void) encumber_msg(); (void) encumber_msg();
@@ -827,7 +827,6 @@ int mntmp;
u.utrap = 0; u.utrap = 0;
} }
check_strangling(TRUE); /* maybe start strangling */ check_strangling(TRUE); /* maybe start strangling */
(void) polysense(youmonst.data);
context.botl = 1; context.botl = 1;
vision_full_recalc = 1; vision_full_recalc = 1;
@@ -1777,20 +1776,18 @@ int atyp;
} }
} }
/* /* some species have awareness of other species */
* Some species have awareness of other species static void
*/ polysense()
static boolean
polysense(mptr)
struct permonst *mptr;
{ {
short warnidx = 0; short warnidx = NON_PM;
context.warntype.speciesidx = 0; context.warntype.speciesidx = NON_PM;
context.warntype.species = 0; context.warntype.species = 0;
context.warntype.polyd = 0; context.warntype.polyd = 0;
HWarn_of_mon &= ~FROMRACE;
switch (monsndx(mptr)) { switch (u.umonnum) {
case PM_PURPLE_WORM: case PM_PURPLE_WORM:
warnidx = PM_SHRIEKER; warnidx = PM_SHRIEKER;
break; break;
@@ -1798,18 +1795,13 @@ struct permonst *mptr;
case PM_VAMPIRE_LORD: case PM_VAMPIRE_LORD:
context.warntype.polyd = M2_HUMAN | M2_ELF; context.warntype.polyd = M2_HUMAN | M2_ELF;
HWarn_of_mon |= FROMRACE; HWarn_of_mon |= FROMRACE;
return TRUE; return;
} }
if (warnidx) { if (warnidx >= LOW_PM) {
context.warntype.speciesidx = warnidx; context.warntype.speciesidx = warnidx;
context.warntype.species = &mons[warnidx]; context.warntype.species = &mons[warnidx];
HWarn_of_mon |= FROMRACE; HWarn_of_mon |= FROMRACE;
return TRUE;
} }
context.warntype.speciesidx = 0;
context.warntype.species = 0;
HWarn_of_mon &= ~FROMRACE;
return FALSE;
} }
/*polyself.c*/ /*polyself.c*/
+1 -1
View File
@@ -604,7 +604,7 @@ register struct obj *otmp;
makeplural(mons[u.ulycn].mname)); makeplural(mons[u.ulycn].mname));
if (youmonst.data == &mons[u.ulycn]) if (youmonst.data == &mons[u.ulycn])
you_unwere(FALSE); you_unwere(FALSE);
u.ulycn = NON_PM; /* cure lycanthropy */ set_ulycn(NON_PM); /* cure lycanthropy */
} }
losehp(Maybe_Half_Phys(d(2, 6)), "potion of holy water", losehp(Maybe_Half_Phys(d(2, 6)), "potion of holy water",
KILLED_BY_AN); KILLED_BY_AN);
+2 -2
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 restore.c $NHDT-Date: 1450231174 2015/12/16 01:59:34 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.102 $ */ /* NetHack 3.6 restore.c $NHDT-Date: 1451082255 2015/12/25 22:24:15 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.103 $ */
/* 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. */
@@ -531,7 +531,7 @@ unsigned int *stuckid, *steedid;
return FALSE; return FALSE;
} }
mread(fd, (genericptr_t) &context, sizeof(struct context_info)); mread(fd, (genericptr_t) &context, sizeof(struct context_info));
if (context.warntype.speciesidx) if (context.warntype.speciesidx >= LOW_PM)
context.warntype.species = &mons[context.warntype.speciesidx]; context.warntype.species = &mons[context.warntype.speciesidx];
/* we want to be able to revert to command line/environment/config /* we want to be able to revert to command line/environment/config
+2 -1
View File
@@ -1585,7 +1585,8 @@ struct mkroom *croom;
* eventually be expanded. * eventually be expanded.
*/ */
if (m->appear_as.str if (m->appear_as.str
&& ((mtmp->data->mlet == S_MIMIC) || mtmp->cham)) { && ((mtmp->data->mlet == S_MIMIC) || mtmp->cham)
&& !Protection_from_shape_changers) {
int i; int i;
switch (m->appear) { switch (m->appear) {
+55 -23
View File
@@ -100,9 +100,9 @@ boolean incl_helpless;
"", "", "", "", "" "", "", "", "", ""
}; };
unsigned l; unsigned l;
char *kname = killer.name; char c, *kname = killer.name;
buf[0] = '\0'; /* so strncat() can find the end */ buf[0] = '\0'; /* lint suppression */
switch (killer.format) { switch (killer.format) {
default: default:
impossible("bad killer format? (%d)", killer.format); impossible("bad killer format? (%d)", killer.format);
@@ -118,13 +118,30 @@ boolean incl_helpless;
buf += l, siz -= l; buf += l, siz -= l;
break; break;
} }
/* we're writing into buf[0] (after possibly advancing buf) rather than /* Copy kname into buf[].
appending, but strncat() appends a terminator and strncpy() doesn't */ * Object names and named fruit have already been sanitized, but
(void) strncat(buf, kname, siz - 1); * monsters can have "called 'arbitrary text'" attached to them,
* so make sure that that text can't confuse field splitting when
* record, logfile, or xlogfile is re-read at some later point.
*/
while (--siz > 0) {
c = *kname++;
if (c == ',')
c = ';';
/* 'xlogfile' doesn't really need protection for '=', but
fixrecord.awk for corrupted 3.6.0 'record' does (only
if using xlogfile rather than logfile to repair record) */
else if (c == '=')
c = '_';
/* tab is not possible due to use of mungspaces() when naming;
it would disrupt xlogfile parsing if it were present */
else if (c == '\t')
c = ' ';
*buf++ = c;
}
*buf = '\0';
if (incl_helpless && multi) { if (incl_helpless && multi) {
siz -= strlen(buf);
buf = eos(buf);
/* X <= siz: 'sizeof "string"' includes 1 for '\0' terminator */ /* X <= siz: 'sizeof "string"' includes 1 for '\0' terminator */
if (multi_reason && strlen(multi_reason) + sizeof ", while " <= siz) if (multi_reason && strlen(multi_reason) + sizeof ", while " <= siz)
Sprintf(buf, ", while %s", multi_reason); Sprintf(buf, ", while %s", multi_reason);
@@ -1154,25 +1171,19 @@ boolean fem;
/* /*
* Get a random player name and class from the high score list, * Get a random player name and class from the high score list,
* and attach them to an object (for statues or morgue corpses).
*/ */
struct obj * struct toptenentry *
tt_oname(otmp) get_rnd_toptenentry()
struct obj *otmp;
{ {
int rank; int rank, i;
register int i;
register struct toptenentry *tt;
FILE *rfile; FILE *rfile;
struct toptenentry tt_buf; register struct toptenentry *tt;
static struct toptenentry tt_buf;
if (!otmp)
return (struct obj *) 0;
rfile = fopen_datafile(RECORD, "r", SCOREPREFIX); rfile = fopen_datafile(RECORD, "r", SCOREPREFIX);
if (!rfile) { if (!rfile) {
impossible("Cannot open record file!"); impossible("Cannot open record file!");
return (struct obj *) 0; return NULL;
} }
tt = &tt_buf; tt = &tt_buf;
@@ -1190,13 +1201,34 @@ pickentry:
rewind(rfile); rewind(rfile);
goto pickentry; goto pickentry;
} }
otmp = (struct obj *) 0; tt = NULL;
} else {
set_corpsenm(otmp, classmon(tt->plrole, (tt->plgend[0] == 'F')));
otmp = oname(otmp, tt->name);
} }
(void) fclose(rfile); (void) fclose(rfile);
return tt;
}
/*
* Attach random player name and class from high score list
* to an object (for statues or morgue corpses).
*/
struct obj *
tt_oname(otmp)
struct obj *otmp;
{
struct toptenentry *tt;
if (!otmp)
return (struct obj *) 0;
tt = get_rnd_toptenentry();
if (!tt)
return (struct obj *) 0;
set_corpsenm(otmp, classmon(tt->plrole, (tt->plgend[0] == 'F')));
otmp = oname(otmp, tt->name);
return otmp; return otmp;
} }
+3 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 trap.c $NHDT-Date: 1450461008 2015/12/18 17:50:08 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.251 $ */ /* NetHack 3.6 trap.c $NHDT-Date: 1451176031 2015/12/27 00:27:11 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.252 $ */
/* 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. */
@@ -2661,6 +2661,8 @@ boolean byplayer;
mon_to_stone(mon); mon_to_stone(mon);
return; return;
} }
if (!vamp_stone(mon))
return;
/* give a "<mon> is slowing down" message and also remove /* give a "<mon> is slowing down" message and also remove
intrinsic speed (comparable to similar effect on the hero) */ intrinsic speed (comparable to similar effect on the hero) */
+2 -5
View File
@@ -57,7 +57,7 @@ int
doextversion() doextversion()
{ {
dlb *f; dlb *f;
char *cr, *pd, buf[BUFSZ]; char *pd, buf[BUFSZ];
winid win = create_nhwindow(NHW_TEXT); winid win = create_nhwindow(NHW_TEXT);
boolean rtadded = FALSE; boolean rtadded = FALSE;
@@ -94,10 +94,7 @@ doextversion()
boolean prolog = TRUE; /* to skip indented program name */ boolean prolog = TRUE; /* to skip indented program name */
while (dlb_fgets(buf, BUFSZ, f)) { while (dlb_fgets(buf, BUFSZ, f)) {
if ((cr = index(buf, '\n')) != 0) (void) strip_newline(buf);
*cr = 0;
if ((cr = index(buf, '\r')) != 0)
*cr = 0;
if (index(buf, '\t') != 0) if (index(buf, '\t') != 0)
(void) tabexpand(buf); (void) tabexpand(buf);
+19 -7
View File
@@ -37,6 +37,8 @@ register struct monst *mon;
} else if (!rn2(30) || Protection_from_shape_changers) { } else if (!rn2(30) || Protection_from_shape_changers) {
new_were(mon); /* change back into human form */ new_were(mon); /* change back into human form */
} }
/* update innate intrinsics (mainly Drain_resistance) */
set_uasmon(); /* new_were() doesn't do this */
} }
int int
@@ -118,15 +120,15 @@ register struct monst *mon;
possibly_unwield(mon, FALSE); possibly_unwield(mon, FALSE);
} }
int were_summon(ptr, yours, visible, /* were-creature (even you) summons a horde */
genbuf) /* were-creature (even you) summons a horde */ int were_summon(ptr, yours, visible, genbuf)
register struct permonst *ptr; struct permonst *ptr;
register boolean yours; boolean yours;
int *visible; /* number of visible helpers created */ int *visible; /* number of visible helpers created */
char *genbuf; char *genbuf;
{ {
register int i, typ, pm = monsndx(ptr); int i, typ, pm = monsndx(ptr);
register struct monst *mtmp; struct monst *mtmp;
int total = 0; int total = 0;
*visible = 0; *visible = 0;
@@ -194,11 +196,21 @@ boolean purify;
if (purify) { if (purify) {
You_feel("purified."); You_feel("purified.");
u.ulycn = NON_PM; /* cure lycanthropy */ set_ulycn(NON_PM); /* cure lycanthropy */
} }
if (!Unchanging && is_were(youmonst.data) if (!Unchanging && is_were(youmonst.data)
&& (!controllable_poly || yn("Remain in beast form?") == 'n')) && (!controllable_poly || yn("Remain in beast form?") == 'n'))
rehumanize(); rehumanize();
} }
/* lycanthropy is being caught or cured, but no shape change is involved */
void
set_ulycn(which)
int which;
{
u.ulycn = which;
/* add or remove lycanthrope's innate intrinsics (Drain_resistance) */
set_uasmon();
}
/*were.c*/ /*were.c*/
+1
View File
@@ -274,6 +274,7 @@ build_package_root:
mkdir -p PKGSCRIPTS mkdir -p PKGSCRIPTS
echo '#!/bin/sh' > PKGSCRIPTS/postinstall echo '#!/bin/sh' > PKGSCRIPTS/postinstall
echo dseditgroup -o create -r '"Games Group"' -s 3600 $(GAMEGRP) >> PKGSCRIPTS/postinstall
echo $(CHOWN) -R $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall echo $(CHOWN) -R $(GAMEUID) $(HACKDIR) >> PKGSCRIPTS/postinstall
echo $(CHGRP) -R $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall echo $(CHGRP) -R $(GAMEGRP) $(HACKDIR) >> PKGSCRIPTS/postinstall
echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall echo $(CHOWN) $(GAMEUID) $(SHELLDIR)/nethack >> PKGSCRIPTS/postinstall
+42 -29
View File
@@ -1,4 +1,4 @@
/* NetHack 3.6 tile2bmp.c $NHDT-Date: 1431192770 2015/05/09 17:32:50 $ $NHDT-Branch: master $:$NHDT-Revision: 1.14 $ */ /* NetHack 3.6 tile2bmp.c $NHDT-Date: 1451442061 2015/12/30 02:21:01 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.15 $ */
/* Copyright (c) NetHack PC Development Team 1995 */ /* Copyright (c) NetHack PC Development Team 1995 */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -18,6 +18,21 @@
#include "win32api.h" #include "win32api.h"
#endif #endif
#include <stdint.h>
#if defined(UINT32_MAX) && defined(INT32_MAX) && defined(UINT16_MAX)
#define UINT8 uint8_t
#define UINT16 uint16_t
#define UINT32 uint32_t
#define INT32 int32_t
#else
# ifdef _MSC_VER
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
#define INT32 long
# endif
#endif
#if (TILE_X == 32) #if (TILE_X == 32)
#define COLORS_IN_USE 256 #define COLORS_IN_USE 256
#else #else
@@ -61,8 +76,8 @@ leshort(short x)
#endif #endif
} }
static long static INT32
lelong(long x) lelong(INT32 x)
{ {
#ifdef __BIG_ENDIAN__ #ifdef __BIG_ENDIAN__
return ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) return ((x & 0xff) << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00)
@@ -74,37 +89,35 @@ lelong(long x)
#ifdef __GNUC__ #ifdef __GNUC__
typedef struct tagBMIH { typedef struct tagBMIH {
unsigned long biSize; UINT32 biSize;
long biWidth; INT32 biWidth;
long biHeight; INT32 biHeight;
unsigned short biPlanes; UINT16 biPlanes;
unsigned short biBitCount; UINT16 biBitCount;
unsigned long biCompression; UINT32 biCompression;
unsigned long biSizeImage; UINT32 biSizeImage;
long biXPelsPerMeter; INT32 biXPelsPerMeter;
long biYPelsPerMeter; INT32 biYPelsPerMeter;
unsigned long biClrUsed; UINT32 biClrUsed;
unsigned long biClrImportant; UINT32 biClrImportant;
} PACK BITMAPINFOHEADER; } PACK BITMAPINFOHEADER;
typedef struct tagBMFH { typedef struct tagBMFH {
unsigned short bfType; UINT16 bfType;
unsigned long bfSize; UINT32 bfSize;
unsigned short bfReserved1; UINT16 bfReserved1;
unsigned short bfReserved2; UINT16 bfReserved2;
unsigned long bfOffBits; UINT32 bfOffBits;
} PACK BITMAPFILEHEADER; } PACK BITMAPFILEHEADER;
typedef struct tagRGBQ { typedef struct tagRGBQ {
unsigned char rgbBlue; UINT8 rgbBlue;
unsigned char rgbGreen; UINT8 rgbGreen;
unsigned char rgbRed; UINT8 rgbRed;
unsigned char rgbReserved; UINT8 rgbReserved;
} PACK RGBQUAD; } PACK RGBQUAD;
#define UINT unsigned int #define DWORD UINT32
#define DWORD unsigned long #define WORD UINT16
#define LONG long
#define WORD unsigned short
#define BI_RGB 0L #define BI_RGB 0L
#define BI_RLE8 1L #define BI_RLE8 1L
#define BI_RLE4 2L #define BI_RLE4 2L
@@ -256,8 +269,8 @@ BITMAPFILEHEADER *pbmfh;
{ {
pbmfh->bfType = leshort(0x4D42); pbmfh->bfType = leshort(0x4D42);
pbmfh->bfSize = lelong(BMPFILESIZE); pbmfh->bfSize = lelong(BMPFILESIZE);
pbmfh->bfReserved1 = (UINT) 0; pbmfh->bfReserved1 = (UINT32) 0;
pbmfh->bfReserved2 = (UINT) 0; pbmfh->bfReserved2 = (UINT32) 0;
pbmfh->bfOffBits = lelong(sizeof(bmp.bmfh) + sizeof(bmp.bmih) pbmfh->bfOffBits = lelong(sizeof(bmp.bmfh) + sizeof(bmp.bmih)
+ (RGBQUAD_COUNT * sizeof(RGBQUAD))); + (RGBQUAD_COUNT * sizeof(RGBQUAD)));
} }