diff --git a/dat/data.base b/dat/data.base index be64ab79e..960932c18 100644 --- a/dat/data.base +++ b/dat/data.base @@ -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! diff --git a/dat/tribute b/dat/tribute index 0ec728092..f73ff0787 100644 --- a/dat/tribute +++ b/dat/tribute @@ -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. # diff --git a/doc/fixes36.1 b/doc/fixes36.1 index 5dc93f056..a2e3933f8 100644 --- a/doc/fixes36.1 +++ b/doc/fixes36.1 @@ -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 diff --git a/include/extern.h b/include/extern.h index 564d863fd..4839a9c20 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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 *)); diff --git a/include/hack.h b/include/hack.h index 319f4d344..fc31dd887 100644 --- a/include/hack.h +++ b/include/hack.h @@ -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') diff --git a/src/apply.c b/src/apply.c index 96c77386c..0af45749a 100644 --- a/src/apply.c +++ b/src/apply.c @@ -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; } diff --git a/src/eat.c b/src/eat.c index fe3e4e071..4e97a5818 100644 --- a/src/eat.c +++ b/src/eat.c @@ -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. */ diff --git a/src/explode.c b/src/explode.c index 08a9a704e..0c736a7f9 100644 --- a/src/explode.c +++ b/src/explode.c @@ -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); diff --git a/src/files.c b/src/files.c index 209042459..9e4f1d21e 100644 --- a/src/files.c +++ b/src/files.c @@ -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'; diff --git a/src/hack.c b/src/hack.c index 3e606f6be..3f6514678 100644 --- a/src/hack.c +++ b/src/hack.c @@ -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; diff --git a/src/invent.c b/src/invent.c index 6c3a22107..3f0c15b85 100644 --- a/src/invent.c +++ b/src/invent.c @@ -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--; diff --git a/src/objnam.c b/src/objnam.c index 4d368ec5a..449be7057 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -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"); diff --git a/src/options.c b/src/options.c index 37675c3d9..c2bf0432a 100644 --- a/src/options.c +++ b/src/options.c @@ -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 * diff --git a/src/pickup.c b/src/pickup.c index 0fa4e65cc..df29ba7c3 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -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 diff --git a/src/potion.c b/src/potion.c index 566eb7bfc..2631955b5 100644 --- a/src/potion.c +++ b/src/potion.c @@ -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 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 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 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 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; diff --git a/src/pray.c b/src/pray.c index e3da3e37d..4c2df62a6 100644 --- a/src/pray.c +++ b/src/pray.c @@ -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(); diff --git a/src/read.c b/src/read.c index 1e177eaf5..94619ba11 100644 --- a/src/read.c +++ b/src/read.c @@ -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!"); diff --git a/src/shk.c b/src/shk.c index a0cf00e0d..c8123b74a 100644 --- a/src/shk.c +++ b/src/shk.c @@ -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; } diff --git a/src/sp_lev.c b/src/sp_lev.c index dc454128a..f65e3c270 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -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; diff --git a/src/spell.c b/src/spell.c index 0ec696b3e..436919276 100644 --- a/src/spell.c +++ b/src/spell.c @@ -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); diff --git a/src/uhitm.c b/src/uhitm.c index d41f71669..24c6fd870 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -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; diff --git a/src/wield.c b/src/wield.c index 3a0625c5f..0b17031ea 100644 --- a/src/wield.c +++ b/src/wield.c @@ -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; } diff --git a/sys/share/unixtty.c b/sys/share/unixtty.c index 55e362f66..efaa176d0 100644 --- a/sys/share/unixtty.c +++ b/sys/share/unixtty.c @@ -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);