Merge branch 'NetHack-3.6.0'

This commit is contained in:
nhmall
2015-12-24 16:54:35 -05:00
23 changed files with 499 additions and 268 deletions

View File

@@ -80,7 +80,7 @@ sacrific*
top will have grooves for blood, and the whole will be covered
with _dry brown stains of a troubling kind_ from former
Sacrifices.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
To every man upon this earth
Death cometh soon or late;
@@ -215,15 +215,14 @@ apelike creature
the apes have the forelimbs much better developed than
the hind limbs. Tail entirely absent. Growth is slow
and sexual maturity reached at quite an advanced age.
[ A Field Guide to the Larger Mammals of Africa by Dorst ]
[ A Field Guide to the Larger Mammals of Africa by Dorst ]
Aldo the gorilla had a plan. It was a good plan. It was
right. He knew it. He smacked his lips in anticipation as
he thought of it. Yes. Apes should be strong. Apes should
be masters. Apes should be proud. Apes should make the
Earth shake when they walked. Apes should _rule_ the Earth.
[ Battle for the Planet of the Apes,
by David Gerrold ]
[ Battle for the Planet of the Apes, by David Gerrold ]
apple
NEWTONIAN, adj. Pertaining to a philosophy of the universe
invented by Newton, who discovered that an apple will fall
@@ -278,8 +277,7 @@ arioch
I found the arrow still unbroke;
And the song, from beginning to end,
I found again in the heart of a friend.
[ The Arrow and the Song,
by Henry Wadsworth Longfellow ]
[ The Arrow and the Song, by Henry Wadsworth Longfellow ]
ashikaga takauji
Ashikaga Takauji was a daimyo of the Minamoto clan who
joined forces with the Go-Daigo to defeat the Hojo armies.
@@ -289,7 +287,7 @@ ashikaga takauji
Go-Daigo eventually escaped and established another
government in the town of Yoshino. This period of dual
governments was known as the Nambokucho.
[ Samurai - The Story of a Warrior Tradition, by Cook ]
[ Samurai - The Story of a Warrior Tradition, by Cook ]
asmodeus
It is said that Asmodeus is the overlord over all of hell.
His appearance, unlike many other demons and devils, is
@@ -557,6 +555,17 @@ candelabrum*
(Enter all the Friars to sing the dirge)
[ Doctor Faustus and Other Plays, by Christopher Marlowe ]
boomerang
#: this one is commented out because two from the same source feels a
#: bit excessive; if uncommented, it should be first since the punchline
#: is about coming back while the other one is disdainful about that, so
#: if this one came second, its joke would be weakened
# "It's a boomerang," said Vimes. "You find something like this
# all over the world. You have to wave it carefully and suddenly
# your opponent gets it in the back. I've heard that there's a lad
# in Fourecks who can throw a boomerang with such precision that it
# can get the morning paper and come back with it."
# [ Raising Steam, by Terry Pratchett ]
#
Rincewind pulled himself up and thought about reaching for his
stick. And then he thought again. The man had a couple of spears
stuck in the ground, and people here were good at spears, because
@@ -579,7 +588,7 @@ boomerang
the formula for making this splendid footwear is a closely
guarded secret, possibly derived from nonhumans (see Dwarfs,
Elves, and Gnomes).
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
*booze
potion of sleeping
On waking, he found himself on the green knoll whence he had
@@ -874,7 +883,7 @@ chih*sung*tzu
do so. He became the heavenly controller of the rain, and
lived with other celestial beings in their paradise on Mount
Kunlun.
[ The Illustrated Who's Who In Mythology, by Michael Senior ]
[ The Illustrated Who's Who In Mythology, by Michael Senior ]
chromatic dragon
tiamat
Tiamat is said to be the mother of evil dragonkind. She is
@@ -895,7 +904,7 @@ citrine*
with trees_ or _swords_, or needing to be _pulled close
around her/his shivering body_. This seems to suggest they
are less than practical for anyone on an arduous Tour.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
cloud*
I wandered lonely as a cloud
That floats on high o'er vales and hills,
@@ -943,8 +952,8 @@ c*ckatrice
But even a dead basilisk is dangerous, for it is said that
merely touching its lifeless body can cause a person to
sicken and die.
[ Mythical Beasts by Deirdre Headon (The Leprechaun Library)
and other sources ]
[ Mythical Beasts by Deirdre Headon (The Leprechaun Library)
and other sources ]
*coin
~creeping coins
*coins
@@ -1055,21 +1064,20 @@ crom
his weapon, and mutters under his breath:
"By Crom, there will be blood spilt today."
[ Conan the Avenger by Robert E. Howard, Bjorn Nyberg, and
L. Sprague de Camp ]
[ Conan the Avenger by Robert E. Howard, Bjorn Nyberg,
and L. Sprague de Camp ]
crossbow*
"God save thee, ancient Mariner!
From the fiends, that plague thee thus! -
Why look'st thou so?" - With my cross-bow
I shot the Albatross.
[ The Rime of the Ancient Mariner, by Samuel Taylor
Coleridge ]
[ The Rime of the Ancient Mariner, by Samuel Taylor Coleridge ]
crystal ball
You look into one of these and see _vapours swirling like
clouds_. These shortly clear away to show a sort of video
without sound of something that is going to happen to you
soon. It is seldom good news.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
curse*
Curses are longstanding ill-wishings which, in Fantasyland,
often manifest as semisentient. They have to be broken or
@@ -1082,7 +1090,7 @@ curse*
want to do this. Swords usually resist all attempts to
raise their Curses. Your best source is to hide the Sword
or give it to someone you dislike.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
cwn*n
A pack of snow-white, red-eared spectral hounds which
sometimes took part in the kidnappings and raids the
@@ -1183,7 +1191,7 @@ major demon
through a keyhole yet not be pierced with a Sword. This makes
them difficult to deal with, even on the rare occasions when
they are friendly.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
diamond
The hardest known mineral (with a hardness of 10 on Mohs' scale).
It is an allotropic form of pure carbon that has crystallized in
@@ -1231,7 +1239,8 @@ dingo
A wolflike wild dog, Canis dingo, of Australia, having a
reddish- or yellowish-brown coat, believed to have been
introduced by the aborigines.
[Webster's Encyclopedic Unabridged Dictionary of the English Language]
[ Webster's Encyclopedic Unabridged Dictionary
of the English Language ]
disenchanter
Ask not, what your magic can do to it. Ask what it can do
to your magic.
@@ -1320,7 +1329,7 @@ doppelganger
not only with clouds of sulphurous fumes pouring from its fire
breathing nostrils, but also with the thrashings of its tail,
the most deadly part of its serpent-like body.
[ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ]
[ Mythical Beasts by Deirdre Headon (The Leprechaun Library) ]
"One whom the dragons will speak with," he said, "that is a
dragonlord, or at least that is the center of the matter. It's
@@ -1770,8 +1779,8 @@ fox
imagination. In this year, with Man's thoughts turned toward
the many ills he has brought among himself, Man has forgotten
his most ancient adversary, the gargoyles.
[ Excerpt from the opening narration to the movie
_Gargoyles_, written by Stephen and Elinor Karpf ]
[ Excerpt from the opening narration to the movie
_Gargoyles_, written by Stephen and Elinor Karpf ]
*garlic
1 November - All day long we have travelled, and at a good
speed. The horses seem to know that they are being kindly
@@ -1943,7 +1952,7 @@ goddess
by narrowing down your available choices of what to do next:
if a deity is pushing you, things will go miserably badly until
there is only one choice left to you.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
gold
gold piece
A metal of characteristic yellow colour, the most precious
@@ -2056,7 +2065,7 @@ hachi
Its strings break only in very rare instances, usually
because the Harper is sulking or crossed in love. This is
just as well as no one seems to make or sell spare strings.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
After breakfast was over, the ogre called out: "Wife, wife,
bring me my golden harp." So she brought it and put it on
@@ -2141,7 +2150,7 @@ hell hound*
savage, more appalling, more hellish be conceived than that
dark form and savage face which broke upon us out of the wall
of fog.
[ The Hound of the Baskervilles, by Sir Arthur Conan Doyle. ]
[ The Hound of the Baskervilles, by Sir Arthur Conan Doyle. ]
hermes
Messenger and herald of the Olympians. Being required to do
a great deal of travelling and speaking in public, he became
@@ -2325,7 +2334,7 @@ hunger
and Hell followed with him. And power was given unto them over
the fourth part of the earth, to kill with sword, and with
hunger, and with death, and with the beasts of the earth.
[ Revelations of John, 6:1-8 ]
[ Revelations of John, 6:1-8 ]
huan*ti
The first of five mythical Chinese emperors, Huan Ti is known
as the yellow emperor. He rules the _moving_ heavens, as
@@ -2567,13 +2576,13 @@ jaguar
Large, flesh-eating animal of the cat family, of Central and
South America. This feline predator (_Panthera onca_) is
sometimes incorrectly called a panther.
[ Van Dale's Groot Woordenboek der Nederlandse Taal ]
[ Van Dale's Groot Woordenboek der Nederlandse Taal ]
jellyfish
I do not care to share the seas
With jellyfishes such as these;
Particularly Portuguese.
[ Lines on Meeting a Portuguese Man-o'-war while
Bathing, by Michael Flanders ]
[ Lines on Meeting a Portuguese Man-o'-war while Bathing,
by Michael Flanders ]
juiblex
jubilex
Little is known about the Faceless Lord, even the correct
@@ -2688,8 +2697,7 @@ knight
And was a bugbear in men's eyes;
But had the fortune in his age
To live a fool and die a sage.
[ Don Quixote of La Mancha, by Miquel de
Cervantes Saavedra ]
[ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ]
~kobold ??m*
*kobold*
The race of kobolds are reputed to be an artificial creation
@@ -2805,8 +2813,7 @@ lance
his lance into shivers, carrying him and his horse after it,
and finally tumbled him a good way off from it on the field in
evil plight.
[ Don Quixote of La Mancha, by Miquel de
Cervantes Saavedra ]
[ Don Quixote of La Mancha, by Miquel de Cervantes Saavedra ]
land mine
Your heart is intact, your brain is not badly damaged, but the rest
of your injuries are comparable to stepping on a land mine. You'd
@@ -2911,7 +2918,7 @@ leprechaun
way to divert his captor's attention and vanishes in the
twinkling of an eye.
[ A Field Guide to the Little People
by Nancy Arrowsmith & George Moorse ]
by Nancy Arrowsmith & George Moorse ]
*lich
But on its heels ere the sunset faded, there came a second
apparition, striding with incredible strides and halting when
@@ -3029,10 +3036,12 @@ bad luck
that?"
Jack shrugged [...]. "Bad grace, I suppose. Just because I
shot off his ear and made him jump into a pit full of spikes."
[ the hollow chocolate bunnies of
the apocalypse, by Robert Rankin ]
# [no relation... both cover and title page list
# this book's title in all lower case]
[ the hollow chocolate bunnies of the apocalypse,
by Robert Rankin ]
# [no relation... both cover and title page list this
# book's title in all lower case; however, its sequel,
# "the toyminator", refers to it using conventional
# capitalization in a couple of early footnotes]
lug*
Lugh, or Lug, was the sun god of the Irish Celts. One of his
weapons was a rod-sling which worshippers sometimes saw in
@@ -3282,7 +3291,7 @@ gnomish mines
unwanted emeralds, etc., still embedded in the rock of the
walls. Metal will also be present, but only when made up into
armor and weapons (_wondrous_).
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
minotaur
The Minotaur was a monster, half bull, half human, the
offspring of Minos' wife Pasiphae and a wonderfully beautiful
@@ -3307,9 +3316,8 @@ mit*ra*
and contracts. He is attributed with the creation of both
plants and animals. His chief adversary is Ahriman, the
power of darkness.
[ The Encyclopaedia of Myths and Legends of All
Nations, by Herbert Spencer Robinson and
Knox Wilson ]
[ The Encyclopaedia of Myths and Legends of All Nations,
by Herbert Spencer Robinson and Knox Wilson ]
*mithril*
_Mithril_! All folk desired it. It could be beaten like
copper, and polished like glass; and the Dwarves could make
@@ -3556,9 +3564,8 @@ ninja-to
good condition by placing fresh earth around it daily. In her
fury, Skuld often spoiled the work of her sisters by tearing
the web to shreds.
[ The Encyclopedia of Myths and Legends of All
Nations by Herbert Spencer Robinson and Knox
Wilson ]
[ The Encyclopedia of Myths and Legends of All Nations
by Herbert Spencer Robinson and Knox Wilson ]
nunchaku
A nunchaku is two sections of wood (or metal in modern
incarnations) connected by a cord or chain. There is much
@@ -3812,7 +3819,7 @@ panther
Nay, rather did impede so much my way,
That many times I to return had turned.
[ Dante's Inferno, as translated
by Henry Wadsworth Longfellow ]
by Henry Wadsworth Longfellow ]
*paper
Some players, who unconsciously perceive Paper as weak or a
sign of surrender, will shy away from using it entirely or
@@ -3934,7 +3941,7 @@ pony
You will travel through them both to distant parts of the
continent and to and from our own world. The precise manner
of their working is a Management secret.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
poseido*n
Poseido(o)n, lord of the seas and father of rivers and
fountains, was the son of Chronos and Rhea, brother of Zeus,
@@ -3951,8 +3958,8 @@ poseido*n
shake the earth, a power which makes him the god of
earthquakes as well. Physically, he is shown as a strong and
powerful ruler, every inch a king.
[ The Encyclopedia of Myths and Legends of All
Nations, by Herbert Robinson and Knox Wilson ]
[ The Encyclopedia of Myths and Legends of All Nations,
by Herbert Robinson and Knox Wilson ]
~*sleeping
~*booze
*potion*
@@ -4105,7 +4112,7 @@ quasit
why not? By then you will have had a lot of practice in
that sort of thing and, besides, the Quest Object is usually
designed to help you do it.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
quetzalcoatl
One of the principal Aztec-Toltec gods was the great and wise
Quetzalcoatl, who was called Kukumatz in Guatemala, and
@@ -4222,7 +4229,7 @@ robe
are dealing with.
2. For Kings. The OMT here is _falling in stately folds_.
3. As the garb of Desert Nomads. [...]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
rock
Bilbo saw that the moment had come when he must do something.
He could not get up at the brutes and he had nothing to shoot
@@ -4685,8 +4692,8 @@ javelin
of Rome in Nero's time, for instance? Why, it would merely
say 'Town burned down; no insurance; boy brast a window,
fireman brake his neck!' Why, that ain't a picture!
[ A Connecticut Yankee in King Arthur's Court, by Mark
Twain ]
[ A Connecticut Yankee in King Arthur's Court,
by Mark Twain ]
*spellbook*
The Book of Three lay closed on the table. Taran had never
been allowed to read the volume for himself; now he was sure
@@ -4862,7 +4869,7 @@ tengu
feuds and prolonging enmity between families. Indeed, the
belligerent tengu were supposed to have been man's first
instructors in the use of arms.
[ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ]
[ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ]
thoth
The Egyptian god of the moon and wisdom, Thoth is the patron
deity of scribes and of knowledge, including scientific,
@@ -5026,8 +5033,7 @@ towel
wave your towel in emergencies as a distress signal, and of
course dry yourself off with it if it still seems to be clean
enough.
[ The Hitchhiker's Guide to the Galaxy,
by Douglas Adams ]
[ The Hitchhiker's Guide to the Galaxy, by Douglas Adams ]
*tower
*tower of darkness
Towers (_brooding_, _dark_) stand alone in Waste Areas and
@@ -5036,7 +5042,7 @@ towel
blocks of masonry that make them very hard to climb. [...]
You will have to go to a Tower and then break into it at some
point towards the end of your Tour.
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
[ The Tough Guide to Fantasyland, by Diana Wynne Jones ]
trap*door
I knew my Erik too well to feel at all comfortable on jumping
into his house. I knew what he had made of a certain palace at
@@ -5187,7 +5193,7 @@ unicorn horn
tamed and captured by a maiden. Made gentle by the sight of a
virgin, the unicorn can be lured to lay its head in her lap, and
in this docile mood, the maiden may secure it with a golden rope.
[ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ]
[ Mythical Beasts, by Deirdre Headon (The Leprechaun Library) ]
Martin took a small sip of beer. "Almost ready," he said.
"You hold your beer awfully well."
@@ -5208,9 +5214,8 @@ valkyrie
without restraint and fighting over again the battles in
which they died and in which they had won their deathless
fame.
[ The Encyclopaedia of Myths and Legends of All
Nations, by Herbert Robinson and Knox
Wilson ]
[ The Encyclopaedia of Myths and Legends of All Nations,
by Herbert Robinson and Knox Wilson ]
vampire
~vampire bat
vampire lord
@@ -5322,8 +5327,7 @@ water
And all the boards did shrink;
Water, water, everywhere
Nor any drop to drink.
[ The Rime of the Ancient Mariner, by Samuel Taylor
Coleridge ]
[ The Rime of the Ancient Mariner, by Samuel Taylor Coleridge ]
water demon
[ The monkey king ] walked along the bank, around the pond.
He examined the footprints of the animals that had gone into
@@ -5422,8 +5426,8 @@ wolf
some of these plants, which yield a poisonous alkaloid that
was formerly used medicinally. In both senses also called
monkshood.
[ The American Heritage Dictionary of the English Language,
Fourth Edition. ]
[ The American Heritage Dictionary of
the English Language, Fourth Edition. ]
wood golem
Come, old broomstick, you are needed,
Take these rags and wrap them round you!
@@ -5442,8 +5446,8 @@ wood golem
How the water spills,
How the water basins
Brimming full he fills!
[ The Sorcerer's Apprentice, by Johann Wolfgang von Goethe,
translation by Edwin Zeydel ]
[ The Sorcerer's Apprentice, by Johann Wolfgang von Goethe,
translation by Edwin Zeydel ]
woodchuck
The Usenet Oracle requires an answer to this question!

View File

@@ -5283,18 +5283,19 @@ that moment you had never known that you always wanted to do it...
#
#
#
%title Raising Steam (8)
%title Raising Steam (13)
# p. 281 (Anchor Books edition; passage starts mid-paragraph)
%passage 1
Yesterday you never thought about it and after today you
don't know what you would do without it.
That was what the technology was doing.
[...] And yesterday you never thought about it and after today you don't
know what you would do without it. That was what the technology was doing.
It was your slave but, in a sense, it might be the other way round.
[Raising Steam, by Terry Pratchett]
%e passage
# p. 358 (passage starts mid-paragraph and ends mid-paragraph; quote is
# attributed to Lord Vetinari but he's not present in the scene)
%passage 2
If you take enough precautions, you never need to take precautions.
"If you take enough precautions, you never need to take precautions."
[Raising Steam, by Terry Pratchett]
%e passage
@@ -5388,22 +5389,88 @@ looking at.
[Raising Steam, by Terry Pratchett]
%e passage
##
# passages 9..13 added after 3.6.0's release
##
# pp. 20-21
%passage 9
Moist Von Lipwig had done some heavy work once and couldn't see any future
in it, but he could look at it for hours, provided other people were doing
it, of course, and clearly some of them liked what they were doing, and so
he shrugged and felt happy that Crisp was happy being a handyman whilst
Moist was happy not picking up anything that was heavier than a glass.
After all, his work was unseen and depended on words, which were
fortunately not very heavy and didn't need grease. In his career as a
crook they had served him well and now he felt somewhat smug at using them
to the benefit of the citizenry.
There was a difference between a banker and a crook, there really was, and
although it was very, very teeny Moist felt that he should point out that
it did exist and, besides, Lord Vetinari always had his eye on him.
So everybody was happy and Moist went to work in very clean clothes and
with a very clean conscience.
[Raising Steam, by Terry Pratchett]
%e passage
# p. 22
%passage 10
Harry, red-faced and impatient, looked over his desk and said to him, "Lad,
time is money and I'm a busy man. You told Nancy down on reception that
you've got something I might like. Now stop fidgeting and look me in the
face square like. If you're another chancer wanting to bamboozle me I'll
have you down the Effing stairs(1) before you know it."
(1) The wonderfully colored oak wood of the Effing Forest was much in
demand for high-class joinery.
[Raising Steam, by Terry Pratchett]
%e passage
# p. 80
%passage 11
Moist knew about the zeitgeist, he tasted it in the wind, and sometimes it
allowed him to play with it. He understood it, and now it hinted at speed,
escape, something wonderfully new, the very bones of the land awakening,
and suddenly it seemed to cry out for motion, new horizons, faraway places,
/anywhere that is not here/! No doubt about it, the railway was going to
turn coal into gold.
[Raising Steam, by Terry Pratchett]
%e passage
# p. 195 (passage starts mid-paragraph and ends mid-paragraph)
%passage 12
And the trouble with madness was that the mad didn't know they were mad.
[Raising Steam, by Terry Pratchett]
%e passage
# p. 284 (passage starts mid-paragraph; speaker is Cmdr Vimes of the Watch)
%passage 13
"[...] That's the trouble, you see. When you've had hatred on your tongue
for such a long time, you don't know how to spit it out."
[Raising Steam, by Terry Pratchett]
%e passage
%e title
#
#
#
%title The Shepherd's Crown (1)
%passage 1
'It's an inconvenience, true enough, and I don't like it at all, but I
know that you do it for everyone, Mister Death. Is there any other way?'
NO, THERE ISN'T, I'M AFRAID. WE ARE ALL FLOATING IN THE WINDS OF TIME.
BUT YOUR CANDLE, MISTRESS WEATHERWAX, WILL FLICKER FOR SOME TIME BEFORE
IT GOES OUT -- A LITTLE REWARD FOR A LIFE WELL LIVED. FOR I CAN SEE THE
BALANCE AND YOU HAVE LEFT THE WORLD MUCH BETTER THAN YOU FOUND IT, AND
IF YOU ASK ME, said Death, NOBODY COULD DO ANY BETTER THAN THAT. . .
NO, THERE ISN'T, I'M AFRAID. WE ARE ALL FLOATING IN THE WINDS OF TIME.
BUT YOUR CANDLE, MISTRESS WEATHERWAX, WILL FLICKER FOR SOME TIME BEFORE
IT GOES OUT -- A LITTLE REWARD FOR A LIFE WELL LIVED. FOR I CAN SEE THE
BALANCE AND YOU HAVE LEFT THE WORLD MUCH BETTER THAN YOU FOUND IT, AND
IF YOU ASK ME, said Death, NOBODY COULD DO ANY BETTER THAN THAT...
[The Shepherd's Crown, by Terry Pratchett]
%e passage
%e title
#
%e section
#
#-----------------------------------------------------
# Used for interaction with Death.
#

View File

@@ -45,6 +45,18 @@ make MAXPLAYERS option in sysconf accept 0 value
avoid hearing yelps when you are deaf
make corpse visible if stethoscope told you about it being there
sceptre of might database entry word change
avoid "spellbook of novel" on discoveries list after object ID of novel
add novel to discoveries list after reading one
putting gold into hero-owned container on shop floor gave free credit
stack splitting for dipping large quantities of potions was done poorly
dipping fruit juice into enlightenment gave different result than the inverse
make travel walk up to a trap and stop when the trap blocks the only
way forward, instead of trying to go straight line
travel will displace pets rather than stop
do not autopickup unpaid items in shops
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
actually make the castle chest not trapped
Platform- and/or Interface-Specific Fixes
@@ -55,6 +67,7 @@ tty: specifying all four of role, race, gender, and alignment still prompted
for confirmation with "Is this ok?" before starting play
unix/X11: in top level Makefile, some commented out definitions of VARDATND
misspelled pilemark.xbm (as pilemark.xpm)
unix/tty: fix compile warning about 'has_colors' for some configurations
win32gui: getversionstring() was overflowing the provided Help About buffer
win32gui: guard against buffer overflow in in mswin_getlin()
MacOSX: initial binary release was built from out of date source code that
@@ -68,6 +81,10 @@ General New Features
naming Sting or Orcrist now breaks illiterate conduct
different feedback for reading a scroll of mail created by writing with marker
wizard mode #wizintrinsic
reading non-cursed scroll of enchant weapon uncurses welded tin opener
if hero has no jumping ability but knows the jumping spell, the #jump command
will attempt to cast the spell
additional passages for Raising Steam
Platform- and/or Interface-Specific New Features
@@ -76,6 +93,7 @@ Platform- and/or Interface-Specific New Features
NetHack Community Patches (or Variation) Included
-------------------------------------------------
Malcolm Ryan's improved tin opener
Code Cleanup and Reorganization

View File

@@ -604,6 +604,7 @@ E void NDECL(init_uhunger);
E int NDECL(Hear_again);
E void NDECL(reset_eat);
E int NDECL(doeat);
E int FDECL(use_tin_opener, (struct obj *));
E void NDECL(gethungry);
E void FDECL(morehungry, (int));
E void FDECL(lesshungry, (int));
@@ -1644,7 +1645,7 @@ E int FDECL(add_autopickup_exception, (const char *));
E void NDECL(free_autopickup_exceptions);
E int FDECL(load_symset, (const char *, int));
E void NDECL(free_symsets);
E void FDECL(parsesymbols, (char *));
E boolean FDECL(parsesymbols, (char *));
E struct symparse *FDECL(match_sym, (char *));
E void NDECL(set_playmode);
E int FDECL(sym_val, (char *));

View File

@@ -277,6 +277,7 @@ NEARDATA extern coord bhitpos; /* place where throw or zap hits or stops */
#define DO_MOVE 0 /* really doing the move */
#define TEST_MOVE 1 /* test a normal move (move there next) */
#define TEST_TRAV 2 /* test a future travel location */
#define TEST_TRAP 3 /* check if a future travel loc is a trap */
/*** some utility macros ***/
#define yn(query) yn_function(query, ynchars, 'n')

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 apply.c $NHDT-Date: 1450481050 2015/12/18 23:24:10 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.214 $ */
/* NetHack 3.6 apply.c $NHDT-Date: 1450582748 2015/12/20 03:39:08 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.217 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1502,6 +1502,17 @@ int magic; /* 0=Physical, otherwise skill level */
{
coord cc;
/* attempt "jumping" spell if hero has no innate jumping ability */
if (!magic && !Jumping) {
int sp_no;
for (sp_no = 0; sp_no < MAXSPELL; ++sp_no)
if (spl_book[sp_no].sp_id == NO_SPELL)
break;
else if (spl_book[sp_no].sp_id == SPE_JUMPING)
return spelleffects(sp_no, FALSE);
}
if (!magic && (nolimbs(youmonst.data) || slithy(youmonst.data))) {
/* normally (nolimbs || slithy) implies !Jumping,
but that isn't necessarily the case for knights */
@@ -3494,18 +3505,8 @@ doapply()
res = dowrite(obj);
break;
case TIN_OPENER:
if (!carrying(TIN)) {
You("have no tin to open.");
goto xit;
}
You("cannot open a tin without eating or discarding its contents.");
if (flags.verbose)
pline("In order to eat, use the 'e' command.");
if (obj != uwep)
pline(
"Opening the tin will be much easier if you wield the tin opener.");
goto xit;
res = use_tin_opener(obj);
break;
case FIGURINE:
use_figurine(&obj);
break;
@@ -3547,7 +3548,6 @@ doapply()
break;
}
pline("Sorry, I don't know how to use that.");
xit:
nomul(0);
return 0;
}

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 eat.c $NHDT-Date: 1449269916 2015/12/04 22:58:36 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.154 $ */
/* NetHack 3.6 eat.c $NHDT-Date: 1450573885 2015/12/20 01:11:25 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.156 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2579,6 +2579,39 @@ doeat()
return 1;
}
int
use_tin_opener(obj)
struct obj *obj;
{
struct obj *otmp;
int res = 0;
if (!carrying(TIN)) {
You("have no tin to open.");
return 0;
}
if (obj != uwep) {
if (obj->cursed && obj->bknown) {
char qbuf[QBUFSZ];
if (ynq(safe_qbuf(qbuf, "Really wield ", "?",
obj, doname, thesimpleoname, "that")) != 'y')
return 0;
}
if (!wield_tool(obj, "use"))
return 0;
res = 1;
}
otmp = getobj(comestibles, "open");
if (!otmp)
return res;
start_tin(otmp);
return 1;
}
/* Take a single bite from a piece of food, checking for choking and
* modifying usedtime. Returns 1 if they choked and survived, 0 otherwise.
*/

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 explode.c $NHDT-Date: 1446955298 2015/11/08 04:01:38 $ $NHDT-Branch: master $:$NHDT-Revision: 1.44 $ */
/* NetHack 3.6 explode.c $NHDT-Date: 1450915435 2015/12/24 00:03:55 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.45 $ */
/* Copyright (C) 1990 by Ken Arromdee */
/* NetHack may be freely redistributed. See license for details. */
@@ -311,12 +311,13 @@ int expltype;
so avoid any which begins with a capital letter) */
do {
Sprintf(hallu_buf, "%s explosion",
s_suffix(rndmonnam(NULL)));
s_suffix(rndmonnam((char *) 0)));
} while (*hallu_buf != lowc(*hallu_buf));
str = hallu_buf;
}
if (u.uswallow && mtmp == u.ustuck) {
const char *adj = NULL;
const char *adj = (char *) 0;
if (is_animal(u.ustuck->data)) {
switch (adtyp) {
case AD_FIRE:
@@ -431,7 +432,7 @@ int expltype;
if (do_hallu) { /* (see explanation above) */
do {
Sprintf(hallu_buf, "%s explosion",
s_suffix(rndmonnam(NULL)));
s_suffix(rndmonnam((char *) 0)));
} while (*hallu_buf != lowc(*hallu_buf));
str = hallu_buf;
}
@@ -468,9 +469,8 @@ int expltype;
rehumanize();
} else {
if (olet == MON_EXPLODE) {
/* killer handled by caller */
if (generic)
killer.name[0] = 0;
if (generic) /* explosion was unseen; str=="explosion", */
; /* killer.name=="gas spore's explosion" */
else if (str != killer.name && str != hallu_buf)
Strcpy(killer.name, str);
killer.format = KILLED_BY_AN;
@@ -486,8 +486,7 @@ int expltype;
Strcpy(killer.name, str);
}
if (iflags.last_msg == PLNMSG_CAUGHT_IN_EXPLOSION
|| iflags.last_msg
== PLNMSG_TOWER_OF_FLAME) /*seffects()*/
|| iflags.last_msg == PLNMSG_TOWER_OF_FLAME) /*seffects()*/
pline("It is fatal.");
else
pline_The("%s is fatal.", str);

View File

@@ -2386,7 +2386,10 @@ int src;
*op = '\0';
}
/* parse here */
parsesymbols(bufp);
if (!parsesymbols(bufp)) {
raw_printf("Error in SYMBOLS definition '%s'.\n", bufp);
wait_synch();
}
if (morelines) {
do {
*symbuf = '\0';

View File

@@ -657,7 +657,7 @@ xchar x, y;
}
/* return TRUE if (dx,dy) is an OK place to move
* mode is one of DO_MOVE, TEST_MOVE or TEST_TRAV
* mode is one of DO_MOVE, TEST_MOVE, TEST_TRAV, or TEST_TRAP
*/
boolean
test_move(ux, uy, dx, dy, mode)
@@ -747,7 +747,7 @@ int mode;
} else
pline("That door is closed.");
}
} else if (mode == TEST_TRAV)
} else if (mode == TEST_TRAV || mode == TEST_TRAP)
goto testdiag;
return FALSE;
}
@@ -790,15 +790,19 @@ int mode;
/* Pick travel path that does not require crossing a trap.
* Avoid water and lava using the usual running rules.
* (but not u.ux/u.uy because findtravelpath walks toward u.ux/u.uy) */
if (context.run == 8 && mode != DO_MOVE && (x != u.ux || y != u.uy)) {
if (context.run == 8
&& (mode == TEST_MOVE || mode == TEST_TRAP)
&& (x != u.ux || y != u.uy)) {
struct trap *t = t_at(x, y);
if ((t && t->tseen)
|| (!Levitation && !Flying && !is_clinger(youmonst.data)
&& is_pool_or_lava(x, y) && levl[x][y].seenv))
return FALSE;
return (mode == TEST_TRAP);
}
if (mode == TEST_TRAP) return FALSE; /* do not move through traps */
ust = &levl[ux][uy];
/* Now see if other things block our way . . */
@@ -915,6 +919,7 @@ boolean guess;
static int ordered[] = { 0, 2, 4, 6, 1, 3, 5, 7 };
/* no diagonal movement for grid bugs */
int dirmax = NODIAG(u.umonnum) ? 4 : 8;
boolean alreadyrepeated = FALSE;
for (dir = 0; dir < dirmax; ++dir) {
int nx = x + xdir[ordered[dir]];
@@ -923,14 +928,18 @@ boolean guess;
if (!isok(nx, ny))
continue;
if ((!Passes_walls && !can_ooze(&youmonst)
&& closed_door(x, y)) || sobj_at(BOULDER, x, y)) {
&& closed_door(x, y)) || sobj_at(BOULDER, x, y)
|| test_move(x, y, nx-x, ny-y, TEST_TRAP)) {
/* closed doors and boulders usually
* cause a delay, so prefer another path */
if (travel[x][y] > radius - 3) {
travelstepx[1 - set][nn] = x;
travelstepy[1 - set][nn] = y;
/* don't change travel matrix! */
nn++;
if (!alreadyrepeated) {
travelstepx[1 - set][nn] = x;
travelstepy[1 - set][nn] = y;
/* don't change travel matrix! */
nn++;
alreadyrepeated = TRUE;
}
continue;
}
}
@@ -1361,8 +1370,9 @@ domove()
}
mtmp = m_at(x, y);
if (mtmp) {
if (mtmp && !is_safepet(mtmp)) {
/* Don't attack if you're running, and can see it */
/* It's fine to displace pets, though */
/* We should never get here if forcefight */
if (context.run && ((!Blind && mon_visible(mtmp)
&& ((mtmp->m_ap_type != M_AP_FURNITURE
@@ -1384,7 +1394,10 @@ domove()
/* attack monster */
if (mtmp) {
nomul(0);
/* don't stop travel when displacing pets; if the
displace fails for some reason, attack() in uhitm.c
will stop travel rather than domove */
if (!is_safepet(mtmp) || context.forcefight) nomul(0);
/* only attack if we know it's there */
/* or if we used the 'F' command to fight blindly */
/* or if it hides_under, in which case we call attack() to print
@@ -1400,7 +1413,7 @@ domove()
* attack_check(), which still wastes a turn, but prints a
* different message and makes the player remember the monster.
*/
if (context.nopick
if (context.nopick && !context.travel
&& (canspotmon(mtmp) || glyph_is_invisible(levl[x][y].glyph))) {
if (mtmp->m_ap_type && !Protection_from_shape_changers
&& !sensemon(mtmp))
@@ -2406,7 +2419,7 @@ lookaround()
&& mtmp->m_ap_type != M_AP_OBJECT
&& (!mtmp->minvis || See_invisible) && !mtmp->mundetected) {
if ((context.run != 1 && !mtmp->mtame)
|| (x == u.ux + u.dx && y == u.uy + u.dy))
|| (x == u.ux + u.dx && y == u.uy + u.dy && !context.travel))
goto stop;
}
@@ -2669,6 +2682,8 @@ boolean k_format;
u.uhp -= n;
if (u.uhp > u.uhpmax)
u.uhpmax = u.uhp; /* perhaps n was negative */
else
context.travel = context.travel1 = context.mv = context.run = 0;
context.botl = 1;
if (u.uhp < 1) {
killer.format = k_format;

View File

@@ -1099,6 +1099,7 @@ register const char *let, *word;
&& (otmp->otyp != HORN_OF_PLENTY || !otmp->dknown
|| !objects[HORN_OF_PLENTY].oc_name_known))
|| (!strcmp(word, "charge") && !is_chargeable(otmp))
|| (!strcmp(word, "open") && otyp != TIN)
|| (!strcmp(word, "call") && !objtyp_is_callable(otyp))
) {
foo--;

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 objnam.c $NHDT-Date: 1450306207 2015/12/16 22:50:07 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.158 $ */
/* NetHack 3.6 objnam.c $NHDT-Date: 1450584419 2015/12/20 04:06:59 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.159 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -120,7 +120,12 @@ register int otyp;
Strcpy(buf, "wand");
break;
case SPBOOK_CLASS:
Strcpy(buf, "spellbook");
if (otyp != SPE_NOVEL) {
Strcpy(buf, "spellbook");
} else {
Strcpy(buf, !nn ? "book" : "novel");
nn = 0;
}
break;
case RING_CLASS:
Strcpy(buf, "ring");

View File

@@ -3298,7 +3298,7 @@ boolean tinitial, tfrom_file;
* options list
*/
for (i = 0; boolopt[i].name; i++) {
if (match_optname(opts, boolopt[i].name, 3, FALSE)) {
if (match_optname(opts, boolopt[i].name, 3, TRUE)) {
/* options that don't exist */
if (!boolopt[i].addr) {
if (!initial && !negated)
@@ -3312,6 +3312,23 @@ boolean tinitial, tfrom_file;
return;
}
op = string_for_opt(opts, TRUE);
if (op) {
if (negated) {
badoption(opts);
return;
}
if (!strcmp(op, "true") || !strcmp(op, "yes"))
negated = FALSE;
else if (!strcmp(op, "false") || !strcmp(op, "no"))
negated = TRUE;
else {
badoption(opts);
return;
}
}
*(boolopt[i].addr) = !negated;
/* 0 means boolean opts */
@@ -3385,6 +3402,12 @@ boolean tinitial, tfrom_file;
}
}
/* Is it a symbol? */
if (strstr(opts, "S_") == opts && parsesymbols(opts)) {
switch_symbols(TRUE);
return;
}
/* out of valid options */
badoption(opts);
}
@@ -4957,7 +4980,7 @@ free_symsets()
}
/* Parse the value of a SYMBOLS line from a config file */
void
boolean
parsesymbols(opts)
register char *opts;
{
@@ -4967,7 +4990,7 @@ register char *opts;
if ((op = index(opts, ',')) != 0) {
*op++ = 0;
parsesymbols(op);
if (!parsesymbols(op)) return FALSE;
}
/* S_sample:string */
@@ -4976,7 +4999,7 @@ register char *opts;
if (!strval)
strval = index(opts, '=');
if (!strval)
return;
return FALSE;
*strval++ = '\0';
/* strip leading and trailing white space from symname and strval */
@@ -4985,12 +5008,13 @@ register char *opts;
symp = match_sym(symname);
if (!symp)
return;
return FALSE;
if (symp->range && symp->range != SYM_CONTROL) {
val = sym_val(strval);
update_l_symset(symp, val);
}
return TRUE;
}
struct symparse *

View File

@@ -1,9 +1,9 @@
/* NetHack 3.6 pickup.c $NHDT-Date: 1445556881 2015/10/22 23:34:41 $ $NHDT-Branch: master $:$NHDT-Revision: 1.162 $ */
/* NetHack 3.6 pickup.c $NHDT-Date: 1450604648 2015/12/20 09:44:08 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.167 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
/*
* Contains code for picking objects up, and container use.
* Contains code for picking objects up, and container use.
*/
#include "hack.h"
@@ -25,8 +25,8 @@ STATIC_DCL int FDECL(autopick, (struct obj *, int, menu_item **));
STATIC_DCL int FDECL(count_categories, (struct obj *, int));
STATIC_DCL long FDECL(carry_count, (struct obj *, struct obj *, long,
BOOLEAN_P, int *, int *));
STATIC_DCL int FDECL(lift_object,
(struct obj *, struct obj *, long *, BOOLEAN_P));
STATIC_DCL int FDECL(lift_object, (struct obj *, struct obj *, long *,
BOOLEAN_P));
STATIC_DCL boolean FDECL(mbag_explodes, (struct obj *, int));
STATIC_PTR int FDECL(in_container, (struct obj *));
STATIC_PTR int FDECL(out_container, (struct obj *));
@@ -63,13 +63,14 @@ STATIC_DCL void FDECL(tipcontainer, (struct obj *));
/* A variable set in use_container(), to be used by the callback routines */
/* in_container() and out_container() from askchain() and use_container(). */
/* Also used by menu_loot() and container_gone(). */
/* Also used by menu_loot() and container_gone(). */
static NEARDATA struct obj *current_container;
#define Icebox (current_container->otyp == ICE_BOX)
static const char moderateloadmsg[] = "You have a little trouble lifting";
static const char nearloadmsg[] = "You have much trouble lifting";
static const char overloadmsg[] = "You have extreme difficulty lifting";
static const char
moderateloadmsg[] = "You have a little trouble lifting",
nearloadmsg[] = "You have much trouble lifting",
overloadmsg[] = "You have extreme difficulty lifting";
/* BUG: this lets you look at cockatrice corpses while blind without
touching them */
@@ -89,6 +90,7 @@ boolean here; /* flag for type of obj list linkage */
pline1(doname(otmp));
} else {
winid tmpwin = create_nhwindow(NHW_MENU);
putstr(tmpwin, 0, "");
do {
putstr(tmpwin, 0, doname(otmp));
@@ -125,15 +127,15 @@ int *itemcount;
/*
* Suppose some '?' and '!' objects are present, but '/' objects aren't:
* "a" picks all items without further prompting;
* "A" steps through all items, asking one by one;
* "?" steps through '?' items, asking, and ignores '!' ones;
* "/" becomes 'A', since no '/' present;
* "?a" or "a?" picks all '?' without further prompting;
* "/a" or "a/" becomes 'A' since there aren't any '/'
* (bug fix: 3.1.0 thru 3.1.3 treated it as "a");
* "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/'
* (ie, treated as if it had just been "?a").
* "a" picks all items without further prompting;
* "A" steps through all items, asking one by one;
* "?" steps through '?' items, asking, and ignores '!' ones;
* "/" becomes 'A', since no '/' present;
* "?a" or "a?" picks all '?' without further prompting;
* "/a" or "a/" becomes 'A' since there aren't any '/'
* (bug fix: 3.1.0 thru 3.1.3 treated it as "a");
* "?/a" or "a?/" or "/a?",&c picks all '?' even though no '/'
* (ie, treated as if it had just been "?a").
*/
STATIC_OVL boolean
query_classes(oclasses, one_at_a_time, everything, action, objs, here,
@@ -168,7 +170,8 @@ int *menu_on_demand;
}
} else { /* more than one choice available */
const char *where = 0;
register char sym, oc_of_sym, *p;
char sym, oc_of_sym, *p;
/* additional choices */
ilets[iletct++] = ' ';
ilets[iletct++] = 'a';
@@ -189,8 +192,7 @@ int *menu_on_demand;
if (*inbuf == '\033')
return FALSE;
for (p = inbuf; (sym = *p++);) {
/* new A function (selective all) added by GAN 01/09/87 */
for (p = inbuf; (sym = *p++) != 0; ) {
if (sym == ' ')
continue;
else if (sym == 'A')
@@ -407,8 +409,8 @@ struct obj *obj;
/* check for particular bless/curse state */
if (bucx_filter) {
/* first categorize this object's bless/curse state */
char bucx =
!obj->bknown ? 'X' : obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
char bucx = !obj->bknown ? 'X'
: obj->blessed ? 'B' : obj->cursed ? 'C' : 'U';
/* if its category is not in the list, reject */
if (!index(valid_menu_classes, bucx))
@@ -425,11 +427,10 @@ allow_cat_no_uchain(obj)
struct obj *obj;
{
if (obj != uchain
&& ((index(valid_menu_classes,'u') && obj->unpaid)
&& ((index(valid_menu_classes,'u') && obj->unpaid)
|| index(valid_menu_classes, obj->oclass)))
return TRUE;
else
return FALSE;
return TRUE;
return FALSE;
}
#endif
@@ -447,9 +448,9 @@ register struct obj *otmp;
* or a monster's inventory if swallowed.
*
* Arg what:
* >0 autopickup
* =0 interactive
* <0 pickup count of something
* >0 autopickup
* =0 interactive
* <0 pickup count of something
*
* Returns 1 if tried to pick something up, whether
* or not it succeeded.
@@ -538,11 +539,12 @@ int what; /* should be a long */
if (flags.menu_style != MENU_TRADITIONAL || iflags.menu_requested) {
/* use menus exclusively */
if (count) { /* looking for N of something */
char buf[QBUFSZ];
Sprintf(buf, "Pick %d of what?", count);
char qbuf[QBUFSZ];
Sprintf(qbuf, "Pick %d of what?", count);
val_for_n_or_more = count; /* set up callback selector */
n = query_objlist(buf, objchain, traverse_how | AUTOSELECT_SINGLE
| INVORDER_SORT,
n = query_objlist(qbuf, objchain, traverse_how | AUTOSELECT_SINGLE
| INVORDER_SORT,
&pick_list, PICK_ONE, n_or_more);
/* correct counts, if any given */
for (i = 0; i < n; i++)
@@ -600,11 +602,12 @@ int what; /* should be a long */
traverse_how == BY_NEXTHERE, &via_menu)) {
if (!via_menu)
return 0;
n = query_objlist(
"Pick up what?", objchain,
traverse_how | (selective ? 0 : INVORDER_SORT),
&pick_list, PICK_ANY,
via_menu == -2 ? allow_all : allow_category);
n = query_objlist("Pick up what?", objchain,
traverse_how
| (selective ? 0 : INVORDER_SORT),
&pick_list, PICK_ANY,
(via_menu == -2) ? allow_all
: allow_category);
goto menu_pickup;
}
}
@@ -657,7 +660,7 @@ int what; /* should be a long */
n_picked += res;
}
end_query:
; /* semicolon needed by brain-damaged compilers */
; /* statement required after label */
}
if (!u.uswallow) {
@@ -684,9 +687,10 @@ boolean grab; /* forced pickup, rather than forced leave behind? */
* Does the text description of this match an exception?
*/
char *objdesc = makesingular(doname(obj));
struct autopickup_exception *ape =
(grab) ? iflags.autopickup_exceptions[AP_GRAB]
: iflags.autopickup_exceptions[AP_LEAVE];
struct autopickup_exception
*ape = (grab) ? iflags.autopickup_exceptions[AP_GRAB]
: iflags.autopickup_exceptions[AP_LEAVE];
while (ape) {
if (regex_match(objdesc, ape->regex))
return TRUE;
@@ -716,7 +720,12 @@ menu_item **pick_list; /* list of objects and counts to pick up */
/* first count the number of eligible items */
for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
pickit = (!*otypes || index(otypes, curr->oclass));
/* pick if in pickup_types and not unpaid item in shop */
pickit = ((!*otypes || index(otypes, curr->oclass))
&& !(curr->where == OBJ_FLOOR
&& !curr->no_charge
&& isok(curr->ox, curr->oy)
&& costly_spot(curr->ox, curr->oy)));
/* check for "always pick up */
if (!pickit)
pickit = is_autopickup_exception(curr, TRUE);
@@ -732,7 +741,7 @@ menu_item **pick_list; /* list of objects and counts to pick up */
}
if (n) {
*pick_list = pi = (menu_item *) alloc(sizeof(menu_item) * n);
*pick_list = pi = (menu_item *) alloc(sizeof (menu_item) * n);
for (n = 0, curr = olist; curr; curr = FOLLOW(curr, follow)) {
pickit = (!*otypes || index(otypes, curr->oclass));
if (!pickit)
@@ -759,15 +768,15 @@ menu_item **pick_list; /* list of objects and counts to pick up */
* returned counts are guaranteed to be in bounds and non-zero.
*
* Query flags:
* BY_NEXTHERE - Follow object list via nexthere instead of nobj.
* AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just
* use it.
* USE_INVLET - Use object's invlet.
* INVORDER_SORT - Use hero's pack order.
* INCLUDE_HERO - Showing engulfer's invent; show hero too.
* SIGNAL_NOMENU - Return -1 rather than 0 if nothing passes "allow".
* SIGNAL_ESCAPE - Return -1 rather than 0 if player uses ESC to
* pick nothing.
* BY_NEXTHERE - Follow object list via nexthere instead of nobj.
* AUTOSELECT_SINGLE - Don't ask if only 1 object qualifies - just
* use it.
* USE_INVLET - Use object's invlet.
* INVORDER_SORT - Use hero's pack order.
* INCLUDE_HERO - Showing engulfer's invent; show hero too.
* SIGNAL_NOMENU - Return -1 rather than 0 if nothing passes "allow".
* SIGNAL_ESCAPE - Return -1 rather than 0 if player uses ESC to
* pick nothing.
*/
int
query_objlist(qstr, olist, qflags, pick_list, how, allow)
@@ -1202,7 +1211,7 @@ int *wt_before, *wt_after;
* object and calling weight.
*
* This works for containers only because containers
* don't merge. -dean
* don't merge. -dean
*/
for (qq = 1L; qq <= count; qq++) {
obj->quan = qq;
@@ -1295,8 +1304,8 @@ boolean telekinesis;
return -1;
}
*cnt_p =
carry_count(obj, container, *cnt_p, telekinesis, &old_wt, &new_wt);
*cnt_p = carry_count(obj, container, *cnt_p, telekinesis,
&old_wt, &new_wt);
if (*cnt_p < 1L) {
result = -1; /* nothing lifted */
} else if (obj->oclass != COIN_CLASS
@@ -1557,6 +1566,7 @@ mon_beside(x, y)
int x, y;
{
int i, j, nx, ny;
for (i = -1; i <= 1; i++)
for (j = -1; j <= 1; j++) {
nx = x + i;
@@ -1572,6 +1582,7 @@ do_loot_cont(cobjp)
struct obj **cobjp;
{
struct obj *cobj = *cobjp;
if (!cobj)
return 0;
if (cobj->olocked) {
@@ -1584,6 +1595,7 @@ struct obj **cobjp;
if (cobj->otyp == BAG_OF_TRICKS) {
int tmp;
You("carefully open the bag...");
pline("It develops a huge set of teeth and bites you!");
tmp = rnd(10);
@@ -1645,7 +1657,7 @@ lootcont:
int n, i;
winid win;
anything any;
menu_item *pick_list = NULL;
menu_item *pick_list = (menu_item *) 0;
any.a_void = 0;
win = create_nhwindow(NHW_MENU);
@@ -1846,9 +1858,9 @@ boolean *prev_loot;
struct obj *otmp;
char qbuf[QBUFSZ];
/* 3.3.1 introduced the ability to remove saddle from a steed */
/* *passed_info is set to TRUE if a loot query was given. */
/* *prev_loot is set to TRUE if something was actually acquired in here.
/* 3.3.1 introduced the ability to remove saddle from a steed.
* *passed_info is set to TRUE if a loot query was given.
* *prev_loot is set to TRUE if something was actually acquired in here.
*/
if (mtmp && mtmp != u.usteed && (otmp = which_armor(mtmp, W_SADDLE))) {
long unwornmask;
@@ -1884,10 +1896,11 @@ boolean *prev_loot;
return 0;
}
}
/* 3.4.0 introduced the ability to pick things up from within swallower's
* stomach */
/* 3.4.0 introduced the ability to pick things up from within
swallower's stomach */
if (u.uswallow) {
int count = passed_info ? *passed_info : 0;
timepassed = pickup(count);
}
return timepassed;
@@ -1966,16 +1979,16 @@ register struct obj *obj;
return 0;
}
setuwep((struct obj *) 0);
/* This uwep check is obsolete. It dates to 3.0 and earlier when
* unwielding Firebrand would be fatal in hell if hero had no other
* fire resistance. Life-saving would force it to be re-wielded.
*/
if (uwep)
return 0; /* unwielded, died, rewielded */
} else if (obj == uswapwep) {
setuswapwep((struct obj *) 0);
if (uswapwep)
return 0; /* unwielded, died, rewielded */
} else if (obj == uquiver) {
setuqwep((struct obj *) 0);
if (uquiver)
return 0; /* unwielded, died, rewielded */
}
if (fatal_corpse_mistake(obj, FALSE))
@@ -2001,12 +2014,13 @@ register struct obj *obj;
(void) snuff_lit(obj);
if (floor_container && costly_spot(u.ux, u.uy)) {
if (current_container->no_charge && !obj->unpaid) {
if (obj->oclass == COIN_CLASS) {
; /* defer gold until after put-in message */
} else if (current_container->no_charge && !obj->unpaid) {
/* don't sell when putting the item into your own container */
obj->no_charge = 1;
} else if (obj->oclass != COIN_CLASS) {
/* sellobj() will take an unpaid item off the shop bill
* note: coins are handled later */
} else {
/* sellobj() will take an unpaid item off the shop bill */
was_unpaid = obj->unpaid ? TRUE : FALSE;
sellobj_state(SELL_DELIBERATE);
sellobj(obj, u.ux, u.uy);
@@ -2018,6 +2032,7 @@ register struct obj *obj;
/* stop any corpse timeouts when frozen */
if (obj->otyp == CORPSE && obj->timed) {
long rot_alarm = stop_timer(ROT_CORPSE, obj_to_any(obj));
(void) stop_timer(REVIVE_MON, obj_to_any(obj));
/* mark a non-reviving corpse as such */
if (rot_alarm)
@@ -2058,7 +2073,6 @@ register struct obj *obj;
* update status immediately.
*/
bot();
return (current_container ? 1 : -1);
}
@@ -2121,10 +2135,10 @@ register struct obj *obj;
otmp = addinv(obj);
loadlev = near_capacity();
prinv(loadlev
? (loadlev < MOD_ENCUMBER ? "You have a little trouble removing"
: "You have much trouble removing")
: (char *) 0,
prinv(loadlev ? ((loadlev < MOD_ENCUMBER)
? "You have a little trouble removing"
: "You have much trouble removing")
: (char *) 0,
otmp, count);
if (is_gold) {
@@ -2698,7 +2712,7 @@ dotip()
int n, i;
winid win;
anything any;
menu_item *pick_list = NULL;
menu_item *pick_list = (menu_item *) 0;
struct obj dummyobj, *otmp;
any = zeroany;
@@ -2838,7 +2852,7 @@ struct obj *box; /* or bag */
treated the same as in the carried case. We do so one
item at a time instead of doing whole container at once
to reduce the chance of exhausting shk's billing capacity. */
maybeshopgoods = !carried(box) && costly_spot(ox, oy);
maybeshopgoods = !carried(box) && costly_spot(ox, oy);
/* caveat: this assumes that cknown, lknown, olocked, and otrapped
fields haven't been overloaded to mean something special for the

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 potion.c $NHDT-Date: 1449977945 2015/12/13 03:39:05 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.122 $ */
/* NetHack 3.6 potion.c $NHDT-Date: 1450667491 2015/12/21 03:11:31 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.124 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1725,6 +1725,7 @@ register struct obj *o1, *o2;
switch (o2->otyp) {
case POT_SICKNESS:
return POT_SICKNESS;
case POT_ENLIGHTENMENT:
case POT_SPEED:
return POT_BOOZE;
case POT_GAIN_LEVEL:
@@ -1746,13 +1747,14 @@ register struct obj *o1, *o2;
break;
}
return 0;
return STRANGE_OBJECT;
}
/* #dip command */
int
dodip()
{
static const char Dip_[] = "Dip ", into_the_something[] = " into the %s?";
register struct obj *potion, *obj;
struct obj *singlepotion;
uchar here;
@@ -1772,19 +1774,28 @@ dodip()
here = levl[u.ux][u.uy].typ;
/* Is there a fountain to dip into here? */
if (IS_FOUNTAIN(here)) {
Sprintf(qtoo, into_the_something, "fountain");
if (flags.verbose)
(void) safe_qbuf(qbuf, Dip_, qtoo, obj,
doname, thesimpleoname, shortestname);
else
Sprintf(qbuf, "%s%s%s", Dip_, shortestname, qtoo);
/* "Dip <the object> into the fountain?" */
if (yn(safe_qbuf(qbuf, "Dip ", " into the fountain?", obj,
doname, thesimpleoname, shortestname)) == 'y') {
if (yn(qbuf) == 'y') {
dipfountain(obj);
return 1;
}
} else if (is_pool(u.ux, u.uy)) {
const char *pooltype = waterbody_name(u.ux, u.uy);
Sprintf(qtoo, into_the_something, pooltype);
if (flags.verbose)
(void) safe_qbuf(qbuf, Dip_, qtoo, obj,
doname, thesimpleoname, shortestname);
else
Sprintf(qbuf, "%s%s%s", Dip_, shortestname, qtoo);
/* "Dip <the object> into the {pool, moat, &c}?" */
Sprintf(qtoo, " into the %s?", pooltype);
if (yn(safe_qbuf(qbuf, "Dip ", qtoo, obj,
doname, thesimpleoname, shortestname)) == 'y') {
if (yn(qbuf) == 'y') {
if (Levitation) {
floating_above(pooltype);
} else if (u.usteed && !is_swimmer(u.usteed->data)
@@ -1801,10 +1812,19 @@ dodip()
}
/* "What do you want to dip <the object> into?" */
Strcpy(qbuf, safe_qbuf(qtoo, "What do you want to dip ", " into?", obj,
doname, thesimpleoname, shortestname)
+ sizeof "What do you want to " - sizeof "");
potion = getobj(beverages, qbuf); /* "dip into" */
if (flags.verbose) {
/* "What do you want to " is getobj()'s prefix, "dip " is ours */
Strcpy(qbuf, safe_qbuf(qtoo, "What do you want to dip ", " into?",
obj, doname, thesimpleoname, shortestname)
/* skip getobj()'s prefix when assigning to qbuf */
+ sizeof "What do you want to " - sizeof "");
/* we needed the '?' in " into?" so that safe_qbuf() was working
with the right overall length, but now we need to take the '?'
off because getobj() is going to append one */
*(eos(qbuf) - 1) = '\0';
} else
Sprintf(qbuf, "dip %s into", shortestname);
potion = getobj(beverages, qbuf); /* qbuf[] == "dip <obj> into" */
if (!potion)
return 0;
if (potion == obj && potion->quan == 1L) {
@@ -1859,19 +1879,25 @@ dodip()
potion->in_use = FALSE; /* didn't go poof */
return 1;
} else if (obj->oclass == POTION_CLASS && obj->otyp != potion->otyp) {
long amt = obj->quan;
int amt = (int) obj->quan;
boolean magic;
Strcpy(qbuf, "The");
if (amt > (objects[potion->otyp].oc_magic ? 2L : 9L)) {
mixture = mixtype(obj, potion);
magic = (mixture != STRANGE_OBJECT) ? objects[mixture].oc_magic
: (objects[obj->otyp].oc_magic || objects[potion->otyp].oc_magic);
Strcpy(qbuf, "The"); /* assume full stack */
if (amt > (magic ? 3 : 7)) {
/* trying to dip multiple potions will usually affect only a
subset; pick an amount between 2 and min(N,9), inclusive */
amt -= 1L;
do {
amt = (long) rnd((int) amt);
} while (amt >= 9L);
amt += 1L;
if (amt < obj->quan) {
obj = splitobj(obj, amt);
subset; pick an amount between 3 and 8, inclusive, for magic
potion result, between 7 and N for non-magic */
if (magic)
amt = rnd(min(amt, 8) - (3 - 1)) + (3 - 1); /* 1..6 + 2 */
else
amt = rnd(amt - (7 - 1)) + (7 - 1); /* 1..(N-6) + 6 */
if ((long) amt < obj->quan) {
obj = splitobj(obj, (long) amt);
Sprintf(qbuf, "%ld of the", obj->quan);
}
}
@@ -1894,7 +1920,7 @@ dodip()
potionbreathe(obj);
useupall(obj);
useup(potion);
losehp((int) (amt + rnd(9)), /* not physical damage */
losehp(amt + rnd(9), /* not physical damage */
"alchemic blast", KILLED_BY_AN);
return 1;
}
@@ -1903,7 +1929,7 @@ dodip()
if (Blind || Hallucination)
obj->dknown = 0;
if ((mixture = mixtype(obj, potion)) != 0) {
if (mixture != STRANGE_OBJECT) {
obj->otyp = mixture;
} else {
switch (obj->odiluted ? 1 : rnd(8)) {
@@ -2065,7 +2091,7 @@ more_dips:
potion->in_use = FALSE; /* didn't go poof */
if ((obj->otyp == UNICORN_HORN || obj->otyp == AMETHYST)
&& (mixture = mixtype(obj, potion)) != 0) {
&& (mixture = mixtype(obj, potion)) != STRANGE_OBJECT) {
char oldbuf[BUFSZ], newbuf[BUFSZ];
short old_otyp = potion->otyp;
boolean old_dknown = FALSE;

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 pray.c $NHDT-Date: 1446854232 2015/11/06 23:57:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.87 $ */
/* NetHack 3.6 pray.c $NHDT-Date: 1450577672 2015/12/20 02:14:32 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.89 $ */
/* Copyright (c) Benson I. Margulies, Mike Stephenson, Steve Linhart, 1989. */
/* NetHack may be freely redistributed. See license for details. */
@@ -467,7 +467,7 @@ int trouble;
what ? what : (const char *) Yobjnam2(otmp, "softly glow"),
hcolor(NH_AMBER));
iflags.last_msg = PLNMSG_OBJ_GLOWS;
otmp->bknown = TRUE;
otmp->bknown = !Hallucination;
}
uncurse(otmp);
update_inventory();

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 read.c $NHDT-Date: 1450490118 2015/12/19 01:55:18 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.130 $ */
/* NetHack 3.6 read.c $NHDT-Date: 1450577673 2015/12/20 02:14:33 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.131 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -1237,6 +1237,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
} else {
for (obj = invent; obj; obj = obj->nobj) {
long wornmask;
/* gold isn't subject to cursing and blessing */
if (obj->oclass == COIN_CLASS)
continue;
@@ -1269,8 +1270,7 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
if (sblessed || wornmask || obj->otyp == LOADSTONE
|| (obj->otyp == LEASH && obj->leashmon)) {
/* water price varies by curse/bless status */
boolean shop_h2o =
(obj->unpaid && obj->otyp == POT_WATER);
boolean shop_h2o = (obj->unpaid && obj->otyp == POT_WATER);
if (confused) {
blessorcurse(obj, 2);
@@ -1340,13 +1340,11 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
uwep->oerodeproof = new_erodeproof ? 1 : 0;
break;
}
if (!chwepon(sobj,
scursed
? -1
: !uwep ? 1 : (uwep->spe >= 9)
? !rn2(uwep->spe)
: sblessed ? rnd(3 - uwep->spe / 3)
: 1))
if (!chwepon(sobj, scursed ? -1
: !uwep ? 1
: (uwep->spe >= 9) ? !rn2(uwep->spe)
: sblessed ? rnd(3 - uwep->spe / 3)
: 1))
sobj = 0; /* nothing enchanted: strange_feeling -> useup */
break;
case SCR_TAMING:
@@ -1387,7 +1385,8 @@ struct obj *sobj; /* scroll, or fake spellbook object for scroll-like spell */
if (vis_results > 0)
known = TRUE;
}
} break;
break;
}
case SCR_GENOCIDE:
if (!already_known)
You("have found a scroll of genocide!");

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 shk.c $NHDT-Date: 1446854234 2015/11/06 23:57:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.116 $ */
/* NetHack 3.6 shk.c $NHDT-Date: 1450604649 2015/12/20 09:44:09 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.117 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -383,9 +383,8 @@ register xchar x, y;
rno = levl[x][y].roomno;
if ((rno < ROOMOFFSET) || levl[x][y].edge || !IS_SHOP(rno - ROOMOFFSET))
return NO_ROOM;
else
return rno;
rno = NO_ROOM;
return rno;
}
void
@@ -773,21 +772,18 @@ register char rmno;
boolean
tended_shop(sroom)
register struct mkroom *sroom;
struct mkroom *sroom;
{
register struct monst *mtmp = sroom->resident;
struct monst *mtmp = sroom->resident;
if (!mtmp)
return FALSE;
else
return (boolean) inhishop(mtmp);
return !mtmp ? FALSE : (boolean) inhishop(mtmp);
}
STATIC_OVL struct bill_x *
onbill(obj, shkp, silent)
register struct obj *obj;
register struct monst *shkp;
register boolean silent;
struct obj *obj;
struct monst *shkp;
boolean silent;
{
if (shkp) {
register struct bill_x *bp = ESHK(shkp)->bill_p;
@@ -1131,12 +1127,13 @@ register xchar ox, oy;
hot_pursuit(shkp);
}
STATIC_VAR const char no_money[] = "Moreover, you%s have no money.";
STATIC_VAR const char not_enough_money[] =
"Besides, you don't have enough to interest %s.";
STATIC_VAR const char
no_money[] = "Moreover, you%s have no money.",
not_enough_money[] = "Besides, you don't have enough to interest %s.";
/* delivers the cheapest item on the list */
STATIC_OVL long
cheapest_item(shkp) /* delivers the cheapest item on the list */
cheapest_item(shkp)
register struct monst *shkp;
{
register int ct = ESHK(shkp)->billct;
@@ -1348,6 +1345,7 @@ proceed:
long dtmp = eshkp->debit;
long loan = eshkp->loan;
char sbuf[BUFSZ];
umoney = money_cnt(invent);
Sprintf(sbuf, "You owe %s %ld %s ", shkname(shkp), dtmp,
currency(dtmp));
@@ -1394,6 +1392,7 @@ proceed:
if (eshkp->billct) {
register boolean itemize;
int iprompt;
umoney = money_cnt(invent);
if (!umoney && !eshkp->credit) {
You("%shave no money or credit%s.",
@@ -2122,7 +2121,7 @@ boolean quietly;
(7 - obj->spe), (obj->spe > 0) ? " more" : "",
plur(7 - obj->spe));
/* [what if hero is already carrying enough candles?
should Izchak explain how to attach them instead] */
should Izchak explain how to attach them instead?] */
} else {
verbalize("I won't stock that. Take it out of here!");
}
@@ -2158,7 +2157,7 @@ register struct monst *shkp;
tmp = (obj->otyp % (6 - shkp->m_id % 3));
tmp = (tmp + 3) * obj->quan;
}
} else if (tmp > 1L && !rn2(4))
} else if (tmp > 1L && !(shkp->m_id % 4))
multiplier *= 3L, divisor *= 4L;
}

View File

@@ -1823,8 +1823,8 @@ struct mkroom *croom;
otmp->obroken = 1;
otmp->olocked = 0; /* obj generation may set */
}
if (o->trapped)
otmp->otrapped = 1;
if (o->trapped == 0 || o->trapped == 1)
otmp->otrapped = o->trapped;
if (o->greased)
otmp->greased = 1;
#ifdef INVISIBLE_OBJECTS
@@ -3023,7 +3023,7 @@ struct sp_coder *coder;
tmpobj.lit = 0;
tmpobj.eroded = 0;
tmpobj.locked = 0;
tmpobj.trapped = 0;
tmpobj.trapped = -1;
tmpobj.recharged = 0;
tmpobj.invis = 0;
tmpobj.greased = 0;

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 spell.c $NHDT-Date: 1450306224 2015/12/16 22:50:24 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.74 $ */
/* NetHack 3.6 spell.c $NHDT-Date: 1450584420 2015/12/20 04:07:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.75 $ */
/* Copyright (c) M. Stephenson 1988 */
/* NetHack may be freely redistributed. See license for details. */
@@ -474,6 +474,7 @@ register struct obj *spellbook;
spellbook->o_id)) {
u.uconduct.literate++;
check_unpaid(spellbook);
makeknown(booktype);
if (!u.uevent.read_tribute) {
/* give bonus of 20 xp and 4*20+0 pts */
more_experienced(20, 0);

View File

@@ -350,10 +350,12 @@ register struct monst *mtmp;
Strcpy(buf, y_monnam(mtmp));
buf[0] = highc(buf[0]);
You("stop. %s is in the way!", buf);
context.travel = context.travel1 = context.mv = context.run = 0;
return TRUE;
} else if ((mtmp->mfrozen || (!mtmp->mcanmove)
|| (mtmp->data->mmove == 0)) && rn2(6)) {
pline("%s doesn't seem to move!", Monnam(mtmp));
context.travel = context.travel1 = context.mv = context.run = 0;
return TRUE;
} else
return FALSE;

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 wield.c $NHDT-Date: 1446887539 2015/11/07 09:12:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.47 $ */
/* NetHack 3.6 wield.c $NHDT-Date: 1450577672 2015/12/20 02:14:32 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.48 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -608,9 +608,22 @@ register int amount;
if (!uwep || (uwep->oclass != WEAPON_CLASS && !is_weptool(uwep))) {
char buf[BUFSZ];
Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)),
(amount >= 0) ? "twitch" : "itch");
strange_feeling(otmp, buf);
if (amount >= 0 && uwep && will_weld(uwep)) { /* cursed tin opener */
if (!Blind) {
Sprintf(buf, "%s with %s aura.",
Yobjnam2(uwep, "glow"), an(hcolor(NH_AMBER)));
uwep->bknown = !Hallucination;
} else {
/* cursed tin opener is wielded in right hand */
Sprintf(buf, "Your right %s tingles.", body_part(HAND));
}
uncurse(uwep);
update_inventory();
} else {
Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)),
(amount >= 0) ? "twitch" : "itch");
}
strange_feeling(otmp, buf); /* pline()+docall()+useup() */
exercise(A_DEX, (boolean) (amount >= 0));
return 0;
}

View File

@@ -1,4 +1,4 @@
/* NetHack 3.6 unixtty.c $NHDT-Date: 1432512788 2015/05/25 00:13:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ */
/* NetHack 3.6 unixtty.c $NHDT-Date: 1450916700 2015/12/24 00:25:00 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.21 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -335,6 +335,9 @@ int sco_flag_console = 0;
int sco_map_valid = -1;
unsigned char sco_chanmap_buf[BSIZE];
#if defined(TTY_GRAPHICS) && defined(TEXTCOLOR)
extern int NDECL(has_colors);
#endif
void NDECL(sco_mapon);
void NDECL(sco_mapoff);
void NDECL(check_sco_console);
@@ -399,6 +402,9 @@ init_sco_cons()
int linux_flag_console = 0;
#if defined(TTY_GRAPHICS) && defined(TEXTCOLOR)
extern int NDECL(has_colors);
#endif
void NDECL(linux_mapon);
void NDECL(linux_mapoff);
void NDECL(check_linux_console);