This commit is contained in:
keni
2015-04-13 19:33:26 -04:00
80 changed files with 17815 additions and 16036 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ TAGS
.make.state
.nse_depinfo
*~
#*
\#*
.#*
,*
_$*
+1 -1
View File
@@ -7,7 +7,7 @@ rationale, etc.
==============================================
FEATURE_NOTICE Alerts for a Release
There is a code mechanism for alterting players to a change in behavior
There is a code mechanism for alerting players to a change in behavior
over prior versions of the game.
Here's how to do it:
+16 -11
View File
@@ -1,4 +1,4 @@
This is a listing of all files in a full NetHack 3.5 distribution, organized
This is a listing of all files in a full NetHack 3.6 distribution, organized
in their standard manner on a UNIX system. It indicates which files are
necessary for which versions, so that you can tell which files may be deleted
from or not transferred to your system if you wish.
@@ -17,7 +17,8 @@ cmdhelp data.base dungeon.def endgame.des gehennom.des
help hh history knox.des license
medusa.des mines.des opthelp oracle.des oracles.txt
quest.txt rumors.fal rumors.tru sokoban.des symbols
tower.des wizhelp yendor.des
tower.des wizhelp yendor.des tribute bogusmon.txt
engrave.txt epitaph.txt
doc:
(files for all versions)
@@ -85,7 +86,7 @@ windows.c wizard.c worm.c worn.c write.c
zap.c
sys/amiga:
(files for Amiga versions)
(files for Amiga versions - untested for 3.6.0)
Build.ami Install.ami Makefile.agc Makefile.ami NetHack.cnf
amidos.c amidos.p amifont.uu amifont8.uu amigst.c
amii.hlp amimenu.c amirip.c amisnd.c amistack.c
@@ -96,12 +97,12 @@ winfuncs.c winkey.c winmenu.c winproto.h winreq.c
winstr.c xpm2iff.c
sys/atari:
(files for Atari version)
(files for Atari version - untested for 3.6.0)
Install.tos atarifnt.uue nethack.mnu setup.g tos.c
unx2atar.sed
sys/be:
(files for BeOS version)
(files for BeOS version - untested for 3.6.0)
README bemain.c
sys/mac:
@@ -114,7 +115,7 @@ macwin.c mgetline.c mmodal.c mrecover.c mrecover.hqx
mttymain.c
sys/msdos:
(files for MSDOS version)
(files for MSDOS version - untested for 3.6.0)
Install.dos Makefile.BC Makefile.GCC Makefile.MSC moveinit.pat
msdos.c msdoshlp.txt ovlinit.c pckeys.c pctiles.c
pctiles.h pcvideo.h portio.h schema1.BC schema2.BC
@@ -124,7 +125,7 @@ vidtxt.c vidvga.c
nhico.uu nhpif.uu
sys/os2:
(files for OS/2 version)
(files for OS/2 version - untested for 3.6.0)
Install.os2 Makefile.os2 nhpmico.uu os2.c
sys/share:
@@ -151,6 +152,10 @@ termcap
(lex/yacc output for special level and dungeon compilers)
dgn_comp.h dgn_lex.c dgn_yacc.c lev_comp.h lev_lex.c
lev_yacc.c
(posix regex for versions that include regex in their C library)
posixregex.c
(c++ regex code for versions that can build a C++ module and link it in)
cppregex.cpp
sys/share/sounds:
(files for Amiga and Macintosh versions)
@@ -173,14 +178,14 @@ sys/unix/hints:
linux linux-x11 macosx macos-x11 unix
sys/vms:
(files for VMS version)
(files for VMS version - untested for 3.6.0)
Install.vms Makefile.dat Makefile.doc Makefile.src Makefile.top
Makefile.utl install.com lev_lex.h nethack.com oldcrtl.c
spec_lev.com vmsbuild.com vmsfiles.c vmsmail.c vmsmain.c
vmsmisc.c vmstty.c vmsunix.c
sys/wince:
(files for Windows CE and PocketPC)
(files for Windows CE and PocketPC - untested for 3.6.0)
Install.ce bootstrp.mak celib.c cesetup.bat cesound.c
defaults.nh keypad.uu menubar.uu mhaskyn.c mhaskyn.h
mhcmd.c mhcmd.h mhcolor.c mhcolor.h mhdlg.c
@@ -265,8 +270,8 @@ petmark.uu resource.h rip.uu splash.uu tiles.mak
winMS.h winhack.c winhack.rc
(files for Visual Studio 2010 Express Edition builds)
dgncomp.vcxproj dgnstuff.vcxproj dgnstuff.mak dlb_main.vcxproj levcomp.vcxproj
levstuff.vcxproj levstuff.mak makedefs.vcxproj nethack.sln uudecode.vcxproj
nethackw.vcxproj tile2bmp.vcxproj recover.vcxproj tilemap.vcxproj tiles.vcxproj
levstuff.vcxproj levstuff.mak makedefs.vcxproj NetHack.sln uudecode.vcxproj
NetHackW.vcxproj tile2bmp.vcxproj recover.vcxproj tilemap.vcxproj tiles.vcxproj
This is a list of files produced by auxiliary programs. They can all be
regenerated from the files in the distribution.
+1
View File
@@ -9,6 +9,7 @@ bogusmon
engrave
epitaph
x11tiles
nhtiles.bmp
*.lev
spec_levs
quest_levs
+11 -11
View File
@@ -112,18 +112,18 @@ FLAGS: hardfloor
INIT_MAP: mines, '.' , 'P' , false , true , lit , false
GEOMETRY:center,center
MAP
...PPP.........PPPP..............PPPP...
.PPPP...........PP................PPPP..
PP.................................PPP..
....................................PPP.
.....................................PP.
.......................................P
xxxxxxxxx......xxxx...........xxxxxxxxxx
xxxxxxx.........xxx.............xxxxxxxx
xxxx..............................xxxxxx
xx.................................xxxxx
....................................xxxx
.......................................x
........................................
PP...................................PPP
.PPP...............................PPP..
..PP.............................PPPP...
..PPP...........................PPPPPP..
....PPPP.........PPP.........PPPP..PP...
xx...................................xxx
xxxx..............................xxxxxx
xxxxxx..........................xxxxxxxx
xxxxxxxx.........xx..........xxxxxxxxxxx
xxxxxxxxx.......xxxxxx.....xxxxxxxxxxxxx
ENDMAP
# Dungeon Description
# The Isle of Glass is a Tor rising out of the swamps surrounding it.
+11 -11
View File
@@ -203,17 +203,17 @@ MAZE: "Mon-goal", ' '
INIT_MAP: mines, 'L' , '.' , false , false , unlit , false
GEOMETRY:center,center
MAP
.L......L.LLL.......LL....
.LLL.......L......LL......
LL.LL.............L.LL....
..........................
......................LL..
......................LLL.
LL........................
.LL.......................
.LL................LL.L...
..LL.....L.LL.......LLL...
.........LLL.........L....
xxxxxx..xxxxxx...xxxxxxxxx
xxxx......xx......xxxxxxxx
xx.xx.............xxxxxxxx
x....................xxxxx
......................xxxx
......................xxxx
xx........................
xxx......................x
xxx................xxxxxxx
xxxx.....x.xx.......xxxxxx
xxxxx...xxxxxx....xxxxxxxx
ENDMAP
# Dungeon Description
$place = { (14,04),(13,07) }
+11 -11
View File
@@ -186,17 +186,17 @@ MAZE: "Pri-goal", ' '
INIT_MAP: mines, 'L' , '.' , false , false , unlit , false
GEOMETRY:center,center
MAP
.L......L.LLL.......LL....
.LLL.......L......LL......
LL.LL.............L.LL....
..........................
......................LL..
......................LLL.
LL........................
.LL.......................
.LL................LL.L...
..LL.....L.LL.......LLL...
.........LLL.........L....
xxxxxx..xxxxxx...xxxxxxxxx
xxxx......xx......xxxxxxxx
xx.xx.............xxxxxxxx
x....................xxxxx
......................xxxx
......................xxxx
xx........................
xxx......................x
xxx................xxxxxxx
xxxx.....x.xx.......xxxxxx
xxxxx...xxxxxx....xxxxxxxx
ENDMAP
# Dungeon Description
$place = { (14,04),(13,07) }
+24 -24
View File
@@ -94,19 +94,19 @@ FLAGS: hardfloor,icedpools
INIT_MAP: mines, '.', 'I', true, true, lit, false
GEOMETRY:center,center
MAP
PPPP.... ....PPPPP.
PLP... .PPLLLPP
PPPPxxxx xxxxPPPPPx
PLPxxx xPPLLLPP
PPP ....................... PPPLLP
.. ............................ PPPP
. ............................... ....
................................. ..
.................................... .
xx ............................ PPPP
x ............................... xxxx
................................. xx
.................................... x
...................................
. .................................. .
.. .............................. PP
.PPP .......................... PLP
.PLLP ..PLLP
.PPPP.. ....PPPP
x .................................. x
xx .............................. PP
xPPP .......................... PLP
xPLLP xxPLLP
xPPPPxx xxxxPPPP
ENDMAP
# Dungeon Description
REGION:(00,00,39,12),lit,"ordinary"
@@ -180,23 +180,23 @@ FLAGS: icedpools
INIT_MAP: mines, '.', 'L', true, true, lit, false
GEOMETRY:center,center
MAP
.L............................LLLLL
LLL.........LLLLL.LLLLL.........LLL
.LLL......LLLLLLLLLLLLLLL.......LL.
.LLL.....LLL|---------|LLL.....L...
..LL....LL|--.........--|LL.....LLL
.......LL|-...LLLLLLL...-|LL.....L.
.......LL|...LL.....LL...|LL.......
xxxxxx.....................xxxxxxxx
xxxxx.......LLLLL.LLLLL......xxxxxx
xxxx......LLLLLLLLLLLLLLL......xxxx
xxxx.....LLL|---------|LLL.....xxxx
xxxx....LL|--.........--|LL.....xxx
x......LL|-...LLLLLLL...-|LL.....xx
.......LL|...LL.....LL...|LL......x
......LL|-..LL.......LL..-|LL......
......LL|.................|LL......
......LL|-..LL.......LL..-|LL......
.......LL|...LL.....LL...|LL.......
.......LL|-...LLLLLLL...-|LL.......
..L.....LL|--.........--|LL.....LL.
..LL.....LLL|---------|LLL....LLLL.
..LLL.....LLLLLLLLLLLLLLL...LLLLL..
.LLLL.......LLLLL.LLLLL.....LLLL...
..LL...............................
xx.....LL|-...LLLLLLL...-|LL......x
xxx.....LL|--.........--|LL.....xxx
xxxx.....LLL|---------|LLL...xxxxxx
xxxxx.....LLLLLLLLLLLLLLL...xxxxxxx
xxxxxx......LLLLL.LLLLL.....xxxxxxx
xxxxxxxxx..................xxxxxxxx
ENDMAP
# Dungeon Description
REGION:(00,00,34,16),lit,"ordinary"
+26 -22
View File
@@ -163,43 +163,43 @@ INIT_MAP:mines,'.','}',true,true,unlit,false
# guarantee at least one open spot to ensure successful stair placement
GEOMETRY:left,bottom
MAP
}}}}}}}}
}}...}}}
}}}...}}
}}}}.}}}
}}}}}}}}
xxxxxxxx
xx...xxx
xxx...xx
xxxx.xxx
xxxxxxxx
ENDMAP
OBJECT:('`',"boulder"),random
GEOMETRY:right,top
MAP
}}}}}}}}
}}}}.}}}
}}}...}}
}}...}}}
}}}}}}}}
xxxxxxxx
xxxx.xxx
xxx...xx
xx...xxx
xxxxxxxx
ENDMAP
OBJECT:('`',"boulder"),random
# lair
GEOMETRY:center,center
MAP
..}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}..
.}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}.
xx}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}xx
x}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}x
}}}...}}..}}.}.}}.}}.}}}...}}}.}}}..}}}..}}}}...}}}
.}}}.}}.}}}.}}.}}.}}...}}.}}.....}}.....}....}.}}}.
..}}}..}}}.}}.}}.}}..}}.....}}.}}}.}}.}}}}}}}}}}}..
.}}}..}}}}}.}}.}}.}}...}}}}}.....}}.}}}}}}.....}}}.
x}}}.}}.}}}.}}.}}.}}...}}.}}.....}}.....}....}.}}}x
xx}}}..}}}.}}.}}.}}..}}.....}}.}}}.}}.}}}}}}}}}}}xx
x}}}..}}}}}.}}.}}.}}...}}}}}.....}}.}}}}}}.....}}}x
}}}..}}...}}..}}.}}}.}}}...}}}.}}}.}.}}}}..P.P..}}}
}}.}}}}...}}}}}.}...}}}..P..}}}.}.}}}.}}}}.....}}}}
}.}}}}.}}.}..}.}}}}}}}..P.P..}}}.}}}.}}..}}...}}}}.
.}}}}.}}}}....}}}}}.}}}..P..}}}.}}}}.}}..}}...}}}.}
}.}}}}.}}.}..}.}}}}}}}..P.P..}}}.}}}.}}..}}...}}}}x
x}}}}.}}}}....}}}}}.}}}..P..}}}.}}}}.}}..}}...}}}.}
}}}}..}}.}}..}}}}...}}}}...}}}.}}}}}.}}}}.}}}}}}.}}
}}}...}}...}}}..}}}}}}}}}}}}.....}}}}.}}...}..}.}}}
.}}}..}}.}}}}....}}..}}}..}}.....}}}}.}}}.}....}}}.
..}}}.}}}}..}}..}}..}}..}}..}}.}}}..}.}..}}}..}}}..
.}}}.}}}}....}}}}..}}....}}}}}}}...}}}....}}}}.}}}.
x}}}..}}.}}}}....}}..}}}..}}.....}}}}.}}}.}....}}}x
xx}}}.}}}}..}}..}}..}}..}}..}}.}}}..}.}..}}}..}}}xx
x}}}.}}}}....}}}}..}}....}}}}}}}...}}}....}}}}.}}}x
}}}...}}}....}}}..}}}....}}}..}}...}}}....}}}...}}}
.}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}.
..}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}.}}}}}..
x}}}.}}}}}..}}}..}}}}}..}}}..}}}}}..}}}..}}}}}.}}}x
xx}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}x}}}}}xx
ENDMAP
# Random registers
$monster = monster: { 'j','b','P','F' }
@@ -561,6 +561,10 @@ MONSTER:'V',random
#
MAZE:"sanctum", ' '
FLAGS: noteleport,hardfloor,nommap
# This is outside the main map, below, so we must do it before adding
# that map and anchoring coordinates to it. This extends the invisible
# barrier up to the top row, which falls outside the drawn map.
NON_PASSWALL:(39,00,41,00)
GEOMETRY:center,center
MAP
----------------------------------------------------------------------------
+2 -2
View File
@@ -186,8 +186,8 @@ as well as maintaining the X11 interface.
Ken Lorber, Haoyang Wang, Pat Rankin, and Dean Luick maintained the port
of NetHack 3.6.0 for Mac.
Michael Allison, Derek S. Ray, Yitzhak Sapir, Alex Kompel, and David Cohrs
maintained the port of NetHack 3.6.0 for Microsoft Windows.
Michael Allison, Derek S. Ray, Yitzhak Sapir, Alex Kompel, Dion Nicolaas,
and David Cohrs maintained the port of NetHack 3.6.0 for Microsoft Windows.
Jeff Bailey created and maintained a port of NetHack 3.6.0 for Chrome.
+1
View File
@@ -3,6 +3,7 @@ Boolean options not under specific compile flags (with default values in []):
option setting, which is reached via the 'O' cmd.)
autodig dig if moving and wielding digging tool [FALSE]
autoopen walking into a door attempts to open it [TRUE]
autopickup automatically pick up objects you move over [TRUE]
autoquiver when firing with an empty quiver, select some
suitable inventory weapon to fill the quiver [FALSE]
+596
View File
@@ -0,0 +1,596 @@
# NetHack 3.6.0 tribute to:
#
# Sir Terence David John "Terry" Pratchett
# April 28, 1948 - March 12, 2015
# ("or until the ripples he caused in the world die away...")
#
#
%section books
#
#
#
%title The Colour of Magic (2)
%passage 1
The Colour of Magic, by Terry Pratchett
It has been remarked before that those who are sensitive to radiation in the
far octarine - the eighth colour, the pigment of the Imagination - can see
things that others cannot.
Thus it was that Rincewind, hurrying through the crowded, flare-lit, evening
bazarrs of Morpork with the Luggage trundling behind him, jostled a tall
figure, turned to deliver a few suitable curses, and beheld Death.
It had to be Death. No-one else went around with empty eye sockets and, of
course, the scythe over one shoulder was another clue.
%e passage 1
%passage 2
The Colour of Magic, by Terry Pratchett
As he was drawn towards the Eye the terror-struck Rincewind raised the box
protectively, and at the same time heard the picture imp say, 'They're about
ripe now, can't hold them any longer. Every-one smile, please.'
There was a -
- flash of light so white and so bright -
- it didn't seem like light at all.
Bel-Shamharoth screamed, a sound that started in the far ultrasonic and
finished somewhere in Rincewind's bowels. The tentacles went momentarily as
stiff as rods, hurling their various cargos around the room, before bunching
up protectively in front of the abused Eye. The whole mass dropped into the
pit and a moment later the big slab was snatched up by several dozen tentacles
and slammed into place, leaving a number of thrashing limbs trapped around the
edge.
%e passage 2
%e title
#
#
#
%title The Light Fantastic (2)
%passage 1
The Light Fantastic, by Terry Pratchett
'Cohen is my name, boy' Belthan's hands stopped moving.
'Cohen?' she said, 'Cohen the Barbarian?'
'The very shame.'
'Hang on, hang on,' said Rincewind, 'Cohen's a great big chap, neck like a bull,
got chest muscles like a sack of footballs. I mean, he's the Disc's greatest
warrior, a legend in his own lifetime. I remember my grandad telling me he saw
him ... my grandad telling me he ... my grandad ...'
He faltered under the gimlit gaze.
'Oh,' he said, 'Oh. Of course, Sorry.'
'Yesh,' said Cohen, and sighed, 'Thatsh right boy, I'm a lifetime in my own
legend.'
%e passage 1
%passage 2
The Light Fantastic, by Terry Pratchett
Death sat at one side of a black baize table in the entre of the room, arguing
with Famine, War and Pestilence. Twoflower was the only one to look up and
notice Rincewind.
'Hey, how did you get here?' he said.
'Well, some say that the creator took a handful - oh, I see, well, it's hard to
explain but I -'
'Have you got the Luggage?'
The wooden box pushed past Rincewind and settled down in front of its owner,
who opened its lid and rummaged around inside until he came up with a small,
leatherbound book which he handed to War, who was hammering the table with a
mailed fist.
'It's "Nosehinger on the Laws of Contract",' he said. 'It's quite good, there's
a lot in it about double finessing and how to -'
Death snatched the book with a bony hand anflipped through the pages, quite
oblivious to the presence of the two men.
'RIGHT,' he said, 'PESTILENCE, OPEN ANOTHER PACK OF CARDS. I'M GOING TO GET TO
THE GOTTOM OF THIS IF IT KILLS ME. FIGURATIVELY SPEAKING OF COURSE.'
%e passage 2
%e title
#
#
#
%title Equal Rites (1)
%passage 1
Equal Rites, by Terry Pratchett
%e passage
%e title
#
#
#
%title Mort (1)
%passage 1
Ankh-Morpork had dallied with many forms of government and hand ended up with that form of democracy known as One Man, One Vote. The Patrician was the Man; he had the Vote.
[Mort, by Terry Pratchett]
%e passage
%e title
#
#
#
%title Sourcery (1)
%passage 1
Sourcery, by Terry Pratchett
%e passage
%e title
#
#
#
%title Wyrd Sisters (1)
%passage 1
Wyrd Sisters, by Terry Pratchett
%e passage
%e title
#
#
#
%title Pyramids (1)
%passage 1
Pyramids, by Terry Pratchett
%e passage
%e title
#
#
#
%title Guards! Guards! (1)
%passage 1
Guards! Guards!, by Terry Pratchett
%e passage
%e title
#
#
#
%title Eric (2)
%passage 1
No enemies had ever taken Ankh-Morpork. Well, /technically/ they had, quite often; the city welcomed free-spending barbarian invaders, but somehow the puzzled raiders always found, after a few days, that they didn't own their own horses any more, and within a couple of months they were just another minority group with its own graffiti and food shops.
[Terry Pratchett, Eric]
%e passage
%passage 2
Rincewind looked down at the broad steps they were climbing. They were something of a novelty; each one was built out of large stone letters. The one he was just stepping on to, for example, read: I Meant It For The Best.
The next one was: I Thought You'd Like It.
Eric was standing on: For The Sake Of The Children.
'Weird, isn't it?' he said. 'Why do it like this?'
'I think they're meant to be good intentions,' said Rincewind. This was a road to hell, and demons were, after all, traditionalists.
%e passage
%e title
#
#
#
%title Moving Pictures (4)
%passage 1
This is space. It's sometimes called the final frontier.
(Except that of course you can't have a /final/ frontier, because there'd be nothing for it to be a frontier /to/, but as frontiers go, it's pretty penultimate...)
[Terry Pratchett, Moving Pictures]
%e passage
%passage 2
By and large, the only skill the alchemists of Ankh-Morpork had discovered so far was the ability to turn gold into less gold.
[Terry Pratchett, Moving Pictures]
%e passage
%passage 3
There was a dog sitting by his feet.
It was small, bow-legged and wiry, and basically grey but with patches of brown, white, and black in outlying areas...
It looked up slowly, and said 'Woof?'
Victor poked an exploratory finger in his ear. It must have been a trick of an echo, or something. It wasn't that the dog had gone 'woof!', although that was practically unique in itself; most dogs in the universe /never/ went 'woof!', they had complicated barks like 'whuuugh!' and 'hwhoouf!'. No, it was that it hadn't in fact /barked/ at all. It had /said/ 'woof'.
'Could have bin worse, mister. I could have said "miaow".'
%e passage
%passage 4
''Twas beauty killed the beast,' said the Dean, who liked to say things like that.
'No it wasn't,' said the Chair. 'It was it splatting into the ground like that.'
%e passage
%e title
#
#
#
%title Reaper Man (1)
%passage 1
Reaper Man, by Terry Pratchett
%e passage
%e title
#
#
#
%title Witches Abroad (1)
%passage 1
Witches Abroad, by Terry Pratchett
%e passage
%e title
#
#
#
%title Small Gods (1)
%passage 1
Small Gods, by Terry Pratchett
%e passage
%e title
#
#
#
%title Lords and Ladies (1)
%passage 1
Lords and Ladies, by Terry Pratchett
%e passage
%e title
#
#
#
%title Men at Arms (1)
%passage 1
Men at Arms, by Terry Pratchett
%e passage
%e title
#
#
#
%title Soul Music (1)
%passage 1
Soul Music, by Terry Pratchett
%e passage
%e title
#
#
#
%title Interesting Times (1)
%passage 1
Interesting Times, by Terry Pratchett
%e passage
%e title
#
#
#
%title Maskerade (4)
%passage 1
'Maybe you could... help us?'
'What's wrong?'
'It's my boy...'
Granny opened the door further and saw the womand standing behind Mr. Slot. One look at her face was enough. There was a bundle in her arms.
Granny stepped back. 'Bring him in and let me have a look at him.'
She took the baby from the woman, sat down on the room's one chair, and pulled back the blanket.
'Hmm,' said Granny, after a while.
'There's a curse on this house, that's what it is,' said Slot. 'My best cow's been taken mortally sick, too.'
'Oh? You have a cowshed?' siad Granny. 'Very good place for a sick-room, a cowshed. It's the warmth. You better show me were it is.'
'You want to take the boy down there?'
'Right now.'
[...]
'How many have you come for?'
ONE.
'The cow?'
Death shook his head.
'It could be the cow.'
NO. THAT WOULD BE CHANGING HISTORY.
'History is about things changing.'
NO.
Granny sat back.
'Then I challenge you to a game. That's traditional. That's /allowed/.'
Death was silent for a moment.
THIS IS TRUE.
'Good.'
HOWEVER... YOU UNDERSTAND THAT TO WIN ALL YOU MUST GAMBLE ALL?
'Double or quits? Yes, I know.'
BUT NOT CHESS.
'Can't abide chess.'
OR CRIPPLE MR ONION. I'VE NEVER BEEN ABLE TO UNDERSTAND THE RULES.
'Very well. How about one hand of poker? Five cards each, no draws? Sudden death, as they say.'
Death thought about this, too.
YOU KNOW THIS FAMILY?
'No.'
THEN WHY?
'Are we talking or are we playing?'
OH, VERY WELL.
Granny looked at her cards, and threw them down.
FOUR QUEENS. HMM. THAT /IS/ VERY HIGH.
Death looked down at his cards, and then up into Granny's steady, blue-eyed gaze.
Neither moved for some time.
Then Death laid the hand on the table.
I LOSE. ALL I HAVE IS FOUR ONES.
[Maskerade, by Terry Pratchett]
%e passage
%passage 2
Ahahahahaha!
Ahahahaha!
Aahahaha!
BEWARE!!!!!
Yrs sincerely,
The Opera Ghost
'What sort of person,' said Salzella, 'sits down and /writes/ a maniacal laugh? And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head. Opera can do that to a man.'
[Maskerade, by Terry Pratchett]
%e passage
%passage 3
Agnes had woken up one morning with the horrible realization that she'd been saddled with a lovely personality. It was the lack of choice that rankled. No one had asked her, before she was born, whether she wanted a lovely personality or whether she'd prefer, say, a miserable personality but a body that could take size 9 in dresses. Instead, people would take pains to tell her that beauty was only skin-deep, as if a man ever fell for an attractive pair of kidneys.
[Maskerade, by Terry Pratchett]
%e passage
%passage 4
'And what can I get you, officers?' she said.
'Officers? Us? What makes you think we're watchment?'
'He's got a helmet on,' Nanny pointed out.
'Milit'ry chic,' Nobby said. 'It's just a fashion accessory. Actually, we are gentlemen of means and have nothing to do with the City Watch whatsoever.'
'Well, /gentlemen/, would you like some wine?'
'Not while we on duty, t'anks', said the troll.
[Maskerade, by Terry Pratchett]
%e passage
%e title
#
#
#
%title Feet of Clay (1)
%passage 1
Feet of Clay, by Terry Pratchett
%e passage
%e title
#
#
#
%title Hogfather (1)
%passage 1
Hogfather, by Terry Pratchett
%e passage
%e title
#
#
#
%title Jingo (1)
%passage 1
Jingo, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Last Continent (1)
%passage 1
The Last Continent, by Terry Pratchett
%e passage
%e title
#
#
#
%title Carpe Jugulum (1)
%passage 1
Carpe Jugulum, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Fifth Elephant (1)
%passage 1
The Fifth Elephant, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Truth (1)
%passage 1
The Truth, by Terry Pratchett
There are, it has been said, two types of people in the world. There are those
who, when presented with a glass that is exactly half full, say: this glass is
half full. And then there are those who say: this glass is half empty.
The world belongs, however, to those who can look at the glass and say: What's
up with this glass? Excuse me? Excuse me? This is may glass? I don't think
so. My glass was full! And it was a bigger glass! Who's been pinching my beer?
%e passage 1
%e title
#
#
#
%title Thief of Time (1)
%passage 1
Thief of Time, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Last Hero (1)
%passage 1
The Last Hero, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Amazing Maurice and his Educated Rodents (1)
%passage 1
The Amazing Maurice and his Educated Rodents, by Terry Pratchett
%e passage
%e title
#
#
#
%title Night Watch (1)
%passage 1
Night Watch, by Terry Pratchett
%e passage
%e title
#
#
#
%title The Wee Free Men (1)
%passage 1
The Wee Free Men, by Terry Pratchett
%e passage
%e title
#
#
#
%title Monstrous Regiment (1)
%passage 1
Monstrous Regiment, by Terry Pratchett
%e passage
%e title
#
#
#
%title A Hat Full of Sky (1)
%passage 1
A Hat Full of Sky, by Terry Pratchett
%e passage
%e title
#
#
#
%title Going Postal (1)
%passage 1
Going Postal, by Terry Pratchett
%e passage
%e title
#
#
#
%title Thud! (1)
%passage 1
Thud!, by Terry Pratchett
%e passage
%e title
#
#
#
%title Wintersmith (1)
%passage 1
Wintersmith, by Terry Pratchett
%e passage
%e title
#
#
#
%title Making Money (3)
%passage 1
Making Money, by Terry Pratchett
'I'm an Igor, thur. We don't athk quethtionth.'
'Really? Why not?'
'I don't know, thur. I didn't athk.'
[Making Money, by Terry Pratchett]
%e pasasge
%passage 2
The Watch armour fitted like a glove. He'd have preferred it to fit like a helmet and breastplate. It was common knowledge that the Watch's approach to uniforms was one-size-doesn't-exactly-fit-anybody, and that Commander Vimes disapproved of armour that didn't have that kicked-by-trolls look. He liked it to make it clear that it had been doing its job.
[Making Money, by Terry Pratchett]
%e passage
%passage 3
'The world is full of things worth more than gold. But we dig the damn stuff up and then bury it in a different hole. Where's the sense in that? What are we, magpies? Good heavens, /potatoes/ are worth more than gold!'
'Surely not!'
'If you were shipwrecked on a desert island, what would you prefer, a bag of potatoes or a bag of gold?'
'Yes, but a desert island isn't Ankh-Morpork!'
'And that proves gold is only valuable because we agree it is, right? It's just a dream. But a potato is always worth a potato, anywhere. A knob of butter and a pinch of salt and you've got a meal, /anywhere/. Bury gold in the ground and you'll be worrying about thieves for ever. Bury a potato and in due season you could be looking at a dividend of a thousand per cent.'
[Making Money, by Terry Pratchett]
%e passage
%e title
#
#
#
%title Unseen Academicals (1)
%passage 1
Unseen Academicals, by Terry Pratchett
%e passage
%e title
#
#
#
%title I Shall Wear Midnight (1)
%passage 1
I Shall Wear Midnight, by Terry Pratchett
%e passage
%e title
#
#
#
%title Snuff (1)
%passage 1
Snuff, by Terry Pratchett
%e passage
%e title
#
#
#
%title Raising Steam (1)
%passage 1
Raising Steam, by Terry Pratchett
%e passage
%e title
%e section
#-----------------------------------------------------
# Currently this section is not used. It is added
# to illustrate how these could be added and adapted
# should they be useful for something
#
%section Death
%title Death Quotes (2)
%passage 1
WHERE THE FIRST PRIMAL CELL WAS, THERE WAS I ALSO. WHERE MAN IS, THERE AM I.
WHEN THE LAST LIFE CRAWLS UNDER FREEZING STARS, THERE WILL I BE.
%e passage
%passage 2
I AM DEATH, NOT TAXES. *I* TURN UP ONLY ONCE.
%e passage
%e title
%e section
+21 -17
View File
@@ -6,7 +6,7 @@
.ds vr "NetHack 3.6
.ds f0 "\*(vr
.ds f1
.ds f2 "March 27, 2015
.ds f2 "April 12, 2015
.\" labeled paragraph start (should be part of tmac.n, but I don't want to
.\" make changes to that file)
.\" .PS word
@@ -1905,6 +1905,8 @@ Cannot be set with the `O' command.
.lp autodig
Automatically dig if you are wielding a digging tool and moving into a place
that can be dug (default false).
.lp autoopen
Walking into a door attempts to open it (default true).
.lp "autopickup "
Automatically pick up things onto which you move (default on).
See
@@ -3007,6 +3009,9 @@ A string explaining how to recover a game on this system (no default value).
SEDUCE
0 or 1 to disable or enable, respectively, the SEDUCE option (see the source
for details on this function).
.lp
CHECK_SAVE_UID
0 or 1 to disable or enable, respectively, the UID checking for savefiles.
.pg
The following options affect the score file:
.pg
@@ -3281,16 +3286,6 @@ successors originally by \fBDaniel Thaler\fP and then by \fBAlex Smith\fP,
and Dynahack by \fBTung Nguyen\fP. Some of those variants continue to be
developed, maintained, and enjoyed by the community to this day.
.pg
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
.pg
In January 2015, preparation began for the release of NetHack 3.6
.pg
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of \fBWarwick Allison\fP,
\fBMichael Allison\fP, \fBKen Arromdee\fP,
@@ -3299,25 +3294,34 @@ as 3.6.0, the development team consisted of \fBWarwick Allison\fP,
\fBMike Stephenson\fP, \fBJanet Walz\fP, and \fBPaul Winner\fP.
Leading up to the release of 3.6.0 in early 2015, new members
\fBSean Hunt\fP, \fBPasi Kallinen\fP, and \fBDerek S. Ray\fP
joined the NetHack development team,
joined the NetHack development team.
.pg
\fB3.6.0 TODO insert apprpriate description of 3.6.0 here
In September 2014, an interim snapshot of the code under development was
released publicly by other parties. Since that code was a work-in-progress
and had not gone through a period of debugging, it was decided that the
version numbers present on that code snapshot would be retired and never
used in an official NetHack release. An announcement was posted on the
devteam's official nethack.org website to that effect, stating that there
would never be a 3.4.4, 3.5, or 3.5.0 official release version.
.pg
In January 2015, preparation began for the release of NetHack 3.6. The 3.6
version merges work done by the development team since the previous release with
some of the beloved community patches. Many bugs were fixed and some code was
restructured.
.pg
\fBThe development team, as well as \fBSteve VanDevender\fP and
\fBKevin Smolkowski\fP ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface.
various Unix flavors and maintained the X11 interface.
.pg
\fBKen Lorber\fP, \fBHaoyang Wang\fP, \fBPat Rankin\fP, and \fBDean Luick\fP
maintained the port of NetHack 3.6.0 for Mac.
.pg
\fBMichael Allison\fP, \fBDerek S. Ray\fP, \fBYitzhak Sapir\fP,
\fBAlex Kompel\fP, and \fBDavid Cohrs\fP maintained the port of
\fBAlex Kompel\fP, and \fBDion Nicolaas\fP maintained the port of
NetHack 3.6.0 for Microsoft Windows.
.pg
\fBJeff Bailey\fP created and maintained a port of NetHack 3.6.0 for Chrome.
.pg
TODO \fBAlex Kompel\fP maintained a port of NetHack 3.6.0 to Windows Phone.
.pg
\fBThis version of the game is special in a particular way. Near the end of
the development of 3.6, one of the significant inspirations for many of the
humorous and fun features found in the game, author \fBTerry Pratchett\fP,
+27 -25
View File
@@ -33,7 +33,7 @@
\begin{document}
%
% input file: guidebook.mn
% $Revision: 1.122 $ $Date: 2015/03/27 06:00:00 $
% $Revision: 1.122 $ $Date: 2015/04/12 06:00:00 $
%
%.ds h0 "
%.ds h1 %.ds h2 \%
@@ -46,7 +46,7 @@
%.au
\author{Eric S. Raymond\\
(Edited and expanded for 3.6)}
\date{March 27, 2015}
\date{April 12, 2015}
\maketitle
@@ -2306,6 +2306,9 @@ Cannot be set with the `{\tt O}' command.
Automatically dig if you are wielding a digging tool and moving into a place
that can be dug (default false).
%.lp
\item[\ib{autoopen}]
Walking into a door attempts to open it (default true).
%.lp
\item[\ib{autopickup}]
Automatically pick up things onto which you move (default on).
See ``{\it pickup\_types\/}'' to refine the behavior.
@@ -3597,6 +3600,9 @@ A string explaining how to recover a game on this system (no default value).
\item[\ib{SEDUCE}]
0 or 1 to disable or enable, respectively, the SEDUCE option (see the source)
for details on this function.
%.lp
\item[\ib{CHECK\_SAVE\_UID}]
0 or 1 to disable or enable, respectively, the UID checking for savefiles.
\elist
%.pg
@@ -3952,6 +3958,18 @@ originally by Daniel Thaler and then by Alex Smith, and
Dynahack by Tung Nguyen. Some of those variants continue to be developed,
maintained, and enjoyed by the community to this day.
%.pg
\medskip
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of {\it Warwick Allison},
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet},
{\it Ken Lorber}, {\it Dean Luick}, {\it Pat Rankin},
{\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}.
Leading up to the release of 3.6.0 in early 2015, new members
{\it Sean Hunt}, {\it Pasi Kallinen}, and {\it Derek S. Ray}
joined the NetHack development team.
%.pg
\medskip
In September 2014, an interim snapshot of the code under development was
@@ -3964,47 +3982,31 @@ would never be a 3.4.4, 3.5, or 3.5.0 official release version.
%.pg
\medskip
In January 2015, preparation began for the release of NetHack 3.6
%.pg
\medskip
At the beginning of development for what would eventually get released
as 3.6.0, the development team consisted of {\it Warwick Allison},
{\it Michael Allison}, {\it Ken Arromdee},
{\it David Cohrs}, {\it Jessie Collet},
{\it Ken Lorber}, {\it Dean Luick}, {\it Pat Rankin},
{\it Mike Stephenson}, {\it Janet Walz}, and {\it Paul Winner}.
Leading up to the release of 3.6.0 in early 2015, new members
{\it Sean Hunt}, {\it Pasi Kallinen}, and {\it Derek S. Ray}
joined the NetHack development team,
%.pg
\medskip
3.6.0 TODO insert apprpriate description of 3.6.0 here
In January 2015, preparation began for the release of NetHack 3.6.
The 3.6 version merges work done by the development team since the previous
release with some of the beloved community patches. Many bugs were fixed
and some code was restructured.
%.pg
\medskip
The development team, as well as {\it Steve VanDevender} and
{\it Kevin Smolkowski} ensured that NetHack 3.6.0 continued to operate on
various Unix flavors as well as maintaining the X11 interface.
various Unix flavors and maintained the X11 interface.
%.pg
{\it Ken Lorber}, {\it Haoyang Wang}, {\it Pat Rankin}, and {\it Dean Luick}
maintained the port of NetHack 3.6.0 for Mac.
%.pg
\medskip
{\it Michael Allison}, {\it Derek S. Ray}, {\it Yitzhak Sapir},
{\it Alex Kompel}, and {\it David Cohrs} maintained the port of
{\it Alex Kompel}, and {\it Dion Nicolaas} maintained the port of
NetHack 3.6.0 for Microsoft Windows.
%.pg
\medskip
{\it Jeff Bailey} created and maintained a port of NetHack 3.6.0 for Chrome.
%.pg
\medskip
{\it Alex Kompel} maintained a port of NetHack 3.6.0 to Windows Phone. <FIXME>?
%.pg
\medskip
This version of the game is special in a particular way. Near the end of
+14 -1
View File
@@ -894,6 +894,13 @@ non-pet rust monsters would eat rust-proofed non-digestibles but ignore
kicking a grave may topple the gravestone
allow showing legal positions for stinking cloud, jumping and polearms
when asked for a location
cloned creatures (of any type) don't deathdrop items
pudding corpses behave somewhat differently than before
mithril armor should have silver color
lichen corpse is an acid indicator
camera may contain a picture-painting demon
some monsters can eat through iron bars
inaccessible niches occasionally have iron bars in front
Platform- and/or Interface-Specific Fixes
@@ -1112,6 +1119,11 @@ show more explicit reason why player was helpless at death
added new hallucinatory-only gods
options to create the character blind or nudist
moving clouds on the plane of air
disclose extinct species alongside genocided ones
tribute to Terry Pratchett
Some levels in Gehennom now use the old corridor-style maze instead of
the new room-style. Beelzebub's level always does this and the
"beetle legs" are restored.
Platform- and/or Interface-Specific New Features
@@ -1152,7 +1164,8 @@ adopt/adapt/improve Dungeon Overview
Aardvark Joe's Extended Logfile
Michael Deutschmann's use_darkgray
Clive Crous' dark_room
Jukka Lahtinen's sortloot
sortloot by Jeroen Demeyer and Jukka Lahtinen
Auto open doors by Stefano Busti
Code Cleanup and Reorganization
+2 -14
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 color.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 color.h $NHDT-Date: 1428088106 2015/04/03 19:08:26 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.8 $ */
/* NetHack 3.5 color.h $Date: 2009/05/06 10:44:34 $ $Revision: 1.5 $ */
/* SCCS Id: @(#)color.h 3.5 1992/02/02 */
/* Copyright (c) Steve Linhart, Eric Raymond, 1989. */
@@ -7,10 +7,6 @@
#ifndef COLOR_H
#define COLOR_H
#ifdef MENU_COLOR_REGEX
#include <regex.h>
#endif
/*
* The color scheme used is tailored for an IBM PC. It consists of the
* standard 8 colors, folowed by their bright counterparts. There are
@@ -56,15 +52,7 @@
#define HI_ZAP CLR_BRIGHT_BLUE
struct menucoloring {
# ifdef MENU_COLOR_REGEX
# ifdef MENU_COLOR_REGEX_POSIX
regex_t match;
# else
struct re_pattern_buffer match;
# endif
# else
char *match;
# endif
struct nhregex *match;
int color, attr;
struct menucoloring *next;
};
+1 -9
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 config.h $NHDT-Date: 1425083082 2015/02/28 00:24:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.51 $ */
/* NetHack 3.5 config.h $NHDT-Date: 1428084467 2015/04/03 18:07:47 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.76 $ */
/* NetHack 3.5 config.h $Date: 2012/01/27 20:15:26 $ $Revision: 1.37 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -436,14 +436,6 @@ typedef unsigned char uchar;
* bugs left here.
*/
/* Menucolors */
# define MENU_COLOR_REGEX /* use GNU regex */
/*# define MENU_COLOR_REGEX_POSIX*/ /* use POSIX regex */
/* if neither is defined, uses pmatch()
* pmatch() provides basic globbing: '*' and '?' wildcards.
*/
#define STATUS_VIA_WINDOWPORT /* re-work of the status line updating process */
#define STATUS_HILITES /* support hilites of status fields */
/* #define WINCHAIN*/ /* stacked window systems */
+10
View File
@@ -78,6 +78,14 @@ struct polearm_info {
unsigned m_id; /* monster id of hitmon, in save file */
};
struct tribute_info {
size_t tributesz; /* make it possible to skip this in future */
boolean enabled; /* Do we have tributes turned on? */
Bitfield(bookstock,1); /* Have we stocked the book? */
/* Markers for other tributes can go here */
/* 31 free bits */
};
struct context_info {
unsigned ident; /* social security number for each monster */
unsigned no_of_wizards; /* 0, 1 or 2 (wizard and his shadow) */
@@ -102,6 +110,7 @@ struct context_info {
boolean bypasses; /* bypass flag is set on at least one fobj */
boolean botl; /* partially redo status line */
boolean botlx; /* print an entirely new bottom line */
boolean door_opened; /* set to true if door was opened during test_move */
struct dig_info digging;
struct victual_info victual;
struct tin_info tin;
@@ -109,6 +118,7 @@ struct context_info {
struct takeoff_info takeoff;
struct warntype_info warntype;
struct polearm_info polearm;
struct tribute_info tribute;
};
extern NEARDATA struct context_info context;
+2 -1
View File
@@ -266,7 +266,7 @@ E NEARDATA struct c_color_names {
const char *const c_black, *const c_amber, *const c_golden,
*const c_light_blue,*const c_red, *const c_green,
*const c_silver, *const c_blue, *const c_purple,
*const c_white;
*const c_white, *const c_orange;
} c_color_names;
#define NH_BLACK c_color_names.c_black
#define NH_AMBER c_color_names.c_amber
@@ -278,6 +278,7 @@ E NEARDATA struct c_color_names {
#define NH_BLUE c_color_names.c_blue
#define NH_PURPLE c_color_names.c_purple
#define NH_WHITE c_color_names.c_white
#define NH_ORANGE c_color_names.c_orange
/* The names of the colors used for gems, etc. */
E const char *c_obj_colors[];
+21 -3
View File
@@ -1,5 +1,4 @@
/* NetHack 3.5 extern.h $NHDT-Date: 1426966688 2015/03/21 19:38:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.411 $ */
/* NetHack 3.5 extern.h $Date: 2013/11/05 00:57:53 $ $Revision: 1.380 $ */
/* NetHack 3.5 extern.h $NHDT-Date: 1428806395 2015/04/12 02:39:55 $ $NHDT-Branch: master $:$NHDT-Revision: 1.455 $ */
/* Copyright (c) Steve Creps, 1988. */
/* NetHack may be freely redistributed. See license for details. */
@@ -395,6 +394,8 @@ E const char *NDECL(roguename);
E struct obj *FDECL(realloc_obj,
(struct obj *, int, genericptr_t, int, const char *));
E char *FDECL(coyotename, (struct monst *,char *));
E const char *FDECL(noveltitle, (int *));
E const char *FDECL(lookup_novel, (const char *, int *));
/* ### do_wear.c ### */
@@ -496,6 +497,7 @@ E int FDECL(omon_adj, (struct monst *,struct obj *,BOOLEAN_P));
E int FDECL(thitmonst, (struct monst *,struct obj *));
E int FDECL(hero_breaks, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P));
E int FDECL(breaks, (struct obj *,XCHAR_P,XCHAR_P));
E void FDECL(release_camera_demon, (struct obj *, XCHAR_P,XCHAR_P));
E void FDECL(breakobj, (struct obj *,XCHAR_P,XCHAR_P,BOOLEAN_P,BOOLEAN_P));
E boolean FDECL(breaktest, (struct obj *));
E boolean FDECL(walk_path, (coord *, coord *, boolean (*)(genericptr_t,int,int), genericptr_t));
@@ -750,6 +752,7 @@ E void NDECL(really_close);
#ifdef DEBUG
E boolean FDECL(showdebug, (const char *));
#endif
E void FDECL(read_tribute, (const char *,const char *,int));
/* ### fountain.c ### */
@@ -833,6 +836,8 @@ E int FDECL(isqrt, (int));
E int FDECL(distmin, (int,int,int,int));
E boolean FDECL(online2, (int,int,int,int));
E boolean FDECL(pmatch, (const char *,const char *));
E boolean FDECL(pmatchi, (const char *,const char *));
E boolean FDECL(pmatchz, (const char *,const char *));
#ifndef STRNCMPI
E int FDECL(strncmpi, (const char *,const char *,int));
#endif
@@ -975,6 +980,7 @@ E int NDECL(doforce);
E boolean FDECL(boxlock, (struct obj *,struct obj *));
E boolean FDECL(doorlock, (struct obj *,int,int));
E int NDECL(doopen);
E int FDECL(doopen_indir, (int,int));
E int NDECL(doclose);
#ifdef MAC
@@ -1227,6 +1233,10 @@ E void FDECL(obj_ice_effects, (int, int, BOOLEAN_P));
E long FDECL(peek_at_iced_corpse_age, (struct obj *));
E int FDECL(hornoplenty, (struct obj *,BOOLEAN_P));
E void NDECL(obj_sanity_check);
E struct obj* FDECL(obj_nexto, (struct obj*));
E struct obj* FDECL(obj_nexto_xy, (int, int, int, unsigned));
E struct obj* FDECL(obj_absorb, (struct obj**, struct obj**));
E struct obj* FDECL(obj_meld, (struct obj**, struct obj**));
/* ### mkroom.c ### */
@@ -1358,6 +1368,7 @@ E boolean FDECL(onscary, (int,int,struct monst *));
E void FDECL(monflee, (struct monst *, int, BOOLEAN_P, BOOLEAN_P));
E int FDECL(dochug, (struct monst *));
E int FDECL(m_move, (struct monst *,int));
E void FDECL(dissolve_bars, (int,int));
E boolean FDECL(closed_door, (int,int));
E boolean FDECL(accessible, (int,int));
E void FDECL(set_apparxy, (struct monst *));
@@ -1479,6 +1490,13 @@ E void NDECL(init_lan_features);
E char *NDECL(lan_username);
#endif
/* ### nhregex.c ### */
E struct nhregex * NDECL(regex_init);
E boolean FDECL(regex_compile, (const char *, struct nhregex *));
E const char *FDECL(regex_error_desc, (struct nhregex *));
E boolean FDECL(regex_match, (const char *, struct nhregex*));
E void FDECL(regex_free, (struct nhregex *));
/* ### nttty.c ### */
#ifdef WIN32CON
@@ -2660,7 +2678,7 @@ E struct monst *FDECL(bhit, (int,int,int,int,int (*)(MONST_P,OBJ_P),
int (*)(OBJ_P,OBJ_P),struct obj **));
E struct monst *FDECL(boomhit, (struct obj *,int,int));
E int FDECL(zhitm, (struct monst *,int,int,struct obj **));
E int FDECL(burn_floor_paper, (int,int,BOOLEAN_P,BOOLEAN_P));
E int FDECL(burn_floor_objects, (int,int,BOOLEAN_P,BOOLEAN_P));
E void FDECL(buzz, (int,int,XCHAR_P,XCHAR_P,int,int));
E void FDECL(melt_ice, (XCHAR_P,XCHAR_P,const char *));
E void FDECL(start_melt_ice_timeout, (XCHAR_P,XCHAR_P,long));
+1
View File
@@ -19,6 +19,7 @@ struct flag {
boolean acoustics; /* allow dungeon sound messages */
boolean autodig; /* MRKR: Automatically dig */
boolean autoquiver; /* Automatically fill quiver */
boolean autoopen; /* open doors by walking into them */
boolean beginner;
boolean biff; /* enable checking for mail */
boolean bones; /* allow saving/loading bones */
+1
View File
@@ -33,6 +33,7 @@
#define EPITAPHFILE "epitaph" /* random epitaphs on graves */
#define ENGRAVEFILE "engrave" /* random engravings on the floor */
#define BOGUSMONFILE "bogusmon" /* hallucinatory monsters */
#define TRIBUTEFILE "tribute" /* 3.6 tribute to Terry Pratchett */
#define LEV_EXT ".lev" /* extension for special level files */
+7 -1
View File
@@ -94,7 +94,7 @@ struct obj {
Bitfield(recharged,3); /* number of times it's been recharged */
#define on_ice recharged /* corpse on ice */
Bitfield(lamplit,1); /* a light-source -- can be lit */
Bitfield(oreserved1,1); /* was the placeholder for invisible objects, free for use */
Bitfield(globby,1); /* globby; will combine with like types on adjacent squares */
Bitfield(greased,1); /* covered with grease */
Bitfield(nomerge,1); /* set temporarily to prevent merging */
Bitfield(was_thrown,1); /* thrown by hero since last picked up */
@@ -108,6 +108,7 @@ struct obj {
int corpsenm; /* type of corpse is mons[corpsenm] */
#define leashmon corpsenm /* gets m_id of attached pet */
#define fromsink corpsenm /* a potion from a sink */
#define novelidx corpsenm /* 3.6.0 tribute - the index of the novel title */
#define record_achieve_special corpsenm
int usecount; /* overloaded for various things that tally */
#define spestudied usecount /* # of times a spellbook has been studied */
@@ -232,6 +233,11 @@ struct obj {
#define polyfodder(obj) (ofood(obj) && pm_to_cham((obj)->corpsenm) != NON_PM)
#define mlevelgain(obj) (ofood(obj) && (obj)->corpsenm == PM_WRAITH)
#define mhealup(obj) (ofood(obj) && (obj)->corpsenm == PM_NURSE)
#define Is_pudding(o) (o->otyp == GLOB_OF_GRAY_OOZE \
|| o->otyp == GLOB_OF_BROWN_PUDDING \
|| o->otyp == GLOB_OF_GREEN_SLIME \
|| o->otyp == GLOB_OF_BLACK_PUDDING)
/* Containers */
#define carried(o) ((o)->where == OBJ_INVENT)
+1 -1
View File
@@ -14,7 +14,7 @@
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
#define EDITLEVEL 60
#define EDITLEVEL 61
#define COPYRIGHT_BANNER_A \
"NetHack, Copyright 1985-2015"
+1
View File
@@ -35,6 +35,7 @@ struct sysopt {
# endif
#endif
int seduce;
int check_save_uid; /* restoring savefile checks UID? */
};
extern struct sysopt sysopt;
+2
View File
@@ -489,6 +489,8 @@ newgame()
context.stethoscope_move = -1L;
context.warnlevel = 1;
context.next_attrib_check = 600L; /* arbitrary first setting */
context.tribute.enabled = TRUE; /* turn on 3.6 tributes */
context.tribute.tributesz = sizeof(struct tribute_info);
for (i = 0; i < NUMMONS; i++)
mvitals[i].mvflags = mons[i].geno & G_NOCORPSE;
+1 -1
View File
@@ -1244,7 +1244,7 @@ char resultbuf[]; /* should be at least [7] to hold "18/100\0" */
void
enlightenment(mode, final)
int mode; /* BASICENLIGHTENMENT | MAGICENLIGHTENMENT (| both) */
int final; /* ENL_GAMEINPROGRESS:0, ENL_GAVEOVERALIVE, ENL_GAMEOVERDEAD */
int final; /* ENL_GAMEINPROGRESS:0, ENL_GAMEOVERALIVE, ENL_GAMEOVERDEAD */
{
char buf[BUFSZ], tmpbuf[BUFSZ];
+1 -1
View File
@@ -216,7 +216,7 @@ NEARDATA struct c_color_names c_color_names = {
"black", "amber", "golden",
"light blue", "red", "green",
"silver", "blue", "purple",
"white"
"white", "orange"
};
struct menucoloring *menu_colorings = NULL;
+1 -1
View File
@@ -160,7 +160,7 @@ magic_map_background(x, y, show)
if (!cansee(x,y) && !lev->waslit) {
/* Floor spaces are dark if unlit. Corridors are dark if unlit. */
if (lev->typ == ROOM && glyph == cmap_to_glyph(S_room))
glyph = cmap_to_glyph(S_stone);
glyph = cmap_to_glyph((flags.dark_room && iflags.use_color) ? (DARKROOMSYM) : S_stone);
else if (lev->typ == CORR && glyph == cmap_to_glyph(S_litcorr))
glyph = cmap_to_glyph(S_corr);
}
+1304 -1296
View File
File diff suppressed because it is too large Load Diff
+58 -1
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 do_name.c $NHDT-Date: 1426558927 2015/03/17 02:22:07 $ $NHDT-Branch: master $:$NHDT-Revision: 1.53 $ */
/* NetHack 3.5 do_name.c $NHDT-Date: 1428196077 2015/04/05 01:07:57 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.64 $ */
/* NetHack 3.5 do_name.c $Date: 2012/01/29 03:00:17 $ $Revision: 1.49 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -475,6 +475,12 @@ register struct obj *obj;
const char *aname;
short objtyp;
/* Do this now because there's no point in even asking for a name */
if (obj->otyp == SPE_NOVEL) {
pline("%s already has a published name.", Ysimple_name2(obj));
return;
}
Sprintf(qbuf, "What do you want to name %s ",
is_plural(obj) ? "these" : "this");
(void)safe_qbuf(qbuf, qbuf, "?", obj, xname, simpleonames, "item");
@@ -1153,4 +1159,55 @@ char *buf;
return buf;
}
/* make sure "The Colour of Magic" remains the first entry in here */
static const char * const sir_Terry_novels[] = {
"The Colour of Magic", "The Light Fantastic", "Equal Rites",
"Mort", "Sourcery", "Wyrd Sisters", "Pyramids", "Guards! Guards!",
"Eric", "Moving Pictures", "Reaper Man", "Witches Abroad",
"Small Gods", "Lords and Ladies", "Men at Arms", "Soul Music",
"Interesting Times", "Maskerade", "Feet of Clay", "Hogfather",
"Jingo", "The Last Continent", "Carpe Jugulum", "The Fifth Elephant",
"The Truth", "Thief of Time", "The Last Hero",
"The Amazing Maurice and his Educated Rodents", "Night Watch",
"The Wee Free Men", "Monstrous Regiment", "A Hat Full of Sky",
"Going Postal", "Thud!", "Wintersmith", "Making Money",
"Unseen Academicals", "I Shall Wear Midnight", "Snuff",
"Raising Steam", "The Shepherd's Crown"
};
const char *
noveltitle(novidx)
int *novidx;
{
int j, k = SIZE(sir_Terry_novels)-1;
j = rn2(k);
if (novidx) {
if (*novidx == -1) *novidx = j;
else if ((*novidx >= 0) && (*novidx <= k)) j = *novidx;
}
return sir_Terry_novels[j];
}
const char *
lookup_novel(lookname, idx)
const char *lookname;
int *idx;
{
int k;
/* Take American or U.K. spelling of this one */
if (strcmpi(lookname, "The Color of Magic") == 0)
lookname = sir_Terry_novels[0];
for (k = 0; k < SIZE(sir_Terry_novels); ++k) {
if (strcmpi(lookname, sir_Terry_novels[k]) == 0) {
if (idx) *idx = k;
return sir_Terry_novels[k];
}
}
return (const char *)0;
}
/*do_name.c*/
+18
View File
@@ -1665,6 +1665,21 @@ xchar x, y; /* object location (ox, oy may not be right) */
return 1;
}
void
release_camera_demon(obj, x,y)
struct obj *obj;
xchar x,y;
{
struct monst *mtmp;
if (!rn2(3) && (mtmp = makemon(&mons[rn2(3) ? PM_HOMUNCULUS : PM_IMP],x,y, NO_MM_FLAGS)) != 0) {
if (canspotmon(mtmp))
pline("%s is released!", Hallucination ?
An(rndmonnam(NULL)) : "The picture-painting demon");
mtmp->mpeaceful = !obj->cursed;
set_malign(mtmp);
}
}
/*
* Unconditionally break an object. Assumes all resistance checks
* and break messages have been delivered prior to getting here.
@@ -1707,6 +1722,9 @@ boolean from_invent;
}
/* monster breathing isn't handled... [yet?] */
break;
case EXPENSIVE_CAMERA:
release_camera_demon(obj, x,y);
break;
case EGG:
/* breaking your own eggs is bad luck */
if (hero_caused && obj->spe && obj->corpsenm >= LOW_PM)
+3 -3
View File
@@ -1612,7 +1612,7 @@ start_eating(otmp) /* called as you start to eat */
context.victual.fullwarn = context.victual.doreset = FALSE;
context.victual.eating = TRUE;
if (otmp->otyp == CORPSE) {
if (otmp->otyp == CORPSE || otmp->globby) {
cprefx(context.victual.piece->corpsenm);
if (!context.victual.piece || !context.victual.eating) {
/* rider revived, or died and lifesaved */
@@ -2127,7 +2127,7 @@ struct obj *otmp;
!Stone_resistance &&
!poly_when_stoned(youmonst.data));
if (mnum == PM_GREEN_SLIME)
if (mnum == PM_GREEN_SLIME || otmp->otyp == GLOB_OF_GREEN_SLIME)
stoneorslime = (!Unchanging && !slimeproof(youmonst.data));
if (cadaver && !nonrotting_corpse(mnum)) {
@@ -2397,7 +2397,7 @@ doeat() /* generic "eat" command funtion (see cmd.c) */
* for normal vs. rotten food. The reqtime and nutrit values are
* then adjusted in accordance with the amount of food left.
*/
if(otmp->otyp == CORPSE) {
if(otmp->otyp == CORPSE || otmp->globby) {
int tmp = eatcorpse(otmp);
if (tmp == 2) {
/* used up */
+39 -10
View File
@@ -1238,7 +1238,7 @@ boolean identified, all_containers, reportempty;
{
register struct obj *box, *obj;
struct obj **oarray;
int i,j,n;
int i,n;
char *invlet;
char buf[BUFSZ];
boolean cat, deadcat;
@@ -1437,43 +1437,72 @@ num_genocides()
return n;
}
int
num_extinct()
{
int i, n = 0;
for (i = LOW_PM; i < NUMMONS; ++i)
if (!(mvitals[i].mvflags & G_GENOD) &&
(mvitals[i].mvflags & G_GONE) &&
!(mons[i].geno & G_UNIQ)) ++n;
return n;
}
STATIC_OVL void
list_genocided(defquery, ask)
char defquery;
boolean ask;
{
register int i;
int ngenocided;
int ngenocided, nextinct;
char c;
winid klwin;
char buf[BUFSZ];
ngenocided = num_genocides();
nextinct = num_extinct();
/* genocided species list */
if (ngenocided != 0) {
c = ask ? yn_function("Do you want a list of species genocided?",
ynqchars, defquery) : defquery;
/* genocided or extinct species list */
if (ngenocided != 0 || nextinct != 0) {
Sprintf(buf, "Do you want a list of %sspecies%s%s?",
(nextinct && !ngenocided) ? "extinct " : "",
(ngenocided) ? " genocided" : "",
(nextinct && ngenocided) ? " and extinct" : "");
c = ask ? yn_function(buf, ynqchars, defquery) : defquery;
if (c == 'q') done_stopprint++;
if (c == 'y') {
klwin = create_nhwindow(NHW_MENU);
putstr(klwin, 0, "Genocided species:");
Sprintf(buf, "%s%s species:",
(ngenocided) ? "Genocided" : "Extinct",
(nextinct && ngenocided) ? " or extinct" : "");
putstr(klwin, 0, buf);
putstr(klwin, 0, "");
for (i = LOW_PM; i < NUMMONS; i++)
if (mvitals[i].mvflags & G_GENOD) {
if (mvitals[i].mvflags & G_GONE && !(mons[i].geno & G_UNIQ)) {
if ((mons[i].geno & G_UNIQ) && i != PM_HIGH_PRIEST)
Sprintf(buf, "%s%s",
!type_is_pname(&mons[i]) ? "" : "the ",
mons[i].mname);
else
Strcpy(buf, makeplural(mons[i].mname));
if (!(mvitals[i].mvflags & G_GENOD))
Strcat(buf, " (extinct)");
putstr(klwin, 0, buf);
}
putstr(klwin, 0, "");
Sprintf(buf, "%d species genocided.", ngenocided);
putstr(klwin, 0, buf);
if (ngenocided > 0) {
Sprintf(buf, "%d species genocided.", ngenocided);
putstr(klwin, 0, buf);
}
if (nextinct > 0) {
Sprintf(buf, "%d species extinct.", nextinct);
putstr(klwin, 0, buf);
}
display_nhwindow(klwin, TRUE);
destroy_nhwindow(klwin);
+2019 -1869
View File
File diff suppressed because it is too large Load Diff
+1929 -1914
View File
File diff suppressed because it is too large Load Diff
+58 -14
View File
@@ -1,15 +1,15 @@
/* NetHack 3.5 hacklib.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 hacklib.c $NHDT-Date: 1428806394 2015/04/12 02:39:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
/* NetHack 3.5 hacklib.c $Date: 2009/05/06 10:46:32 $ $Revision: 1.23 $ */
/* SCCS Id: @(#)hacklib.c 3.5 2007/04/30 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* Copyright (c) Robert Patrick Rankin, 1991 */
/* NetHack may be freely redistributed. See license for details. */
/* We could include only config.h, except for the overlay definitions... */
#include "hack.h"
#include "hack.h" /* for config.h+extern.h */
/*=
Assorted 'small' utility routines. They're virtually independent of
NetHack, except that rounddiv may call panic().
NetHack, except that rounddiv may call panic(). setrandom calls one of
srandom(), srand48(), or srand() depending upon configuration.
return type routine name argument type(s)
boolean digit (char)
@@ -40,9 +40,12 @@ NetHack, except that rounddiv may call panic().
int dist2 (int, int, int, int)
boolean online2 (int, int)
boolean pmatch (const char *, const char *)
boolean pmatchi (const char *, const char *)
boolean pmatchz (const char *, const char *)
int strncmpi (const char *, const char *, int)
char * strstri (const char *, const char *)
boolean fuzzymatch (const char *,const char *,const char *,boolean)
boolean fuzzymatch (const char *,const char *,
const char *,boolean)
void setrandom (void)
time_t getnow (void)
int getyear (void)
@@ -62,6 +65,9 @@ NetHack, except that rounddiv may call panic().
# define Static static
#endif
static boolean FDECL(pmatch_internal, (const char *,const char *,
BOOLEAN_P,const char *));
boolean
digit(c) /* is 'c' a digit? */
char c;
@@ -465,9 +471,12 @@ online2(x0, y0, x1, y1) /* are two points lined up (on a straight line)? */
return((boolean)(!dy || !dx || (dy == dx) || (dy + dx == 0))); /* (dy == -dx) */
}
boolean
pmatch(patrn, strng) /* match a string against a pattern */
/* guts of pmatch(), pmatchi(), and pmatchz() */
static boolean
pmatch_internal(patrn, strng, ci, sk) /* match a string against a pattern */
const char *patrn, *strng;
boolean ci; /* True => case-insensitive, False => case-sensitive */
const char *sk; /* set of characters to skip */
{
char s, p;
/*
@@ -475,18 +484,53 @@ pmatch(patrn, strng) /* match a string against a pattern */
: any single character. Returns TRUE if 'strng' matches 'patrn'.
*/
pmatch_top:
s = *strng++; p = *patrn++; /* get next chars and pre-advance */
if (!sk) {
s = *strng++; p = *patrn++; /* get next chars and pre-advance */
} else {
/* fuzzy match variant of pmatch; particular characters are ignored */
do { s = *strng++; } while (index(sk, s));
do { p = *patrn++; } while (index(sk, p));
}
if (!p) /* end of pattern */
return((boolean)(s == '\0')); /* matches iff end of string too */
return (boolean)(s == '\0'); /* matches iff end of string too */
else if (p == '*') /* wildcard reached */
return((boolean)((!*patrn || pmatch(patrn, strng-1)) ? TRUE :
s ? pmatch(patrn-1, strng) : FALSE));
else if (p != s && (p != '?' || !s)) /* check single character */
return (boolean)
((!*patrn || pmatch_internal(patrn, strng-1, ci, sk)) ? TRUE :
s ? pmatch_internal(patrn-1, strng, ci, sk) : FALSE);
else if ((ci ? lowc(p) != lowc(s) : p != s) /* check single character */
&& (p != '?' || !s)) /* & single-char wildcard */
return FALSE; /* doesn't match */
else /* return pmatch(patrn, strng); */
else /* return pmatch_internal(patrn, strng, ci, sk); */
goto pmatch_top; /* optimize tail recursion */
}
/* case-sensitive wildcard match */
boolean
pmatch(patrn, strng)
const char *patrn, *strng;
{
return pmatch_internal(patrn, strng, FALSE, (const char *)0);
}
/* case-insensitive wildcard match */
boolean
pmatchi(patrn, strng)
const char *patrn, *strng;
{
return pmatch_internal(patrn, strng, TRUE, (const char *)0);
}
/* case-insensitive wildcard fuzzymatch */
boolean
pmatchz(patrn, strng)
const char *patrn, *strng;
{
/* ignore spaces, tabs (just in case), dashes, and underscores */
static const char fuzzychars[] = " \t-_";
return pmatch_internal(patrn, strng, TRUE, fuzzychars);
}
#ifndef STRNCMPI
int
strncmpi(s1, s2, n) /* case insensitive counted string comparison */
@@ -603,7 +647,7 @@ STATIC_DCL struct tm *NDECL(getlt);
void
setrandom()
{
unsigned long seed = getnow(); /* time((TIME_type) 0) */
unsigned long seed = (unsigned long)getnow(); /* time((TIME_type) 0) */
#ifdef UNIX
/* Quick dirty band-aid to prevent PRNG prediction */
seed *= getpid();
+2022 -2014
View File
File diff suppressed because it is too large Load Diff
+12 -1
View File
@@ -523,6 +523,14 @@ doforce() /* try to force a chest with your weapon */
int
doopen() /* try to open a door */
{
return doopen_indir(0, 0);
}
int
doopen_indir(x, y) /* try to open a door in direction u.dx/u.dy */
int x, y;
{
coord cc;
register struct rm *door;
struct monst *mtmp;
@@ -539,7 +547,10 @@ doopen() /* try to open a door */
return 0;
}
if(!get_adjacent_loc((char *)0, (char *)0, u.ux, u.uy, &cc)) return(0);
if (x > 0 && y > 0) {
cc.x = x;
cc.y = y;
} else if(!get_adjacent_loc((char *)0, (char *)0, u.ux, u.uy, &cc)) return(0);
if((cc.x == u.ux) && (cc.y == u.uy)) return(0);
+1 -1
View File
@@ -519,7 +519,7 @@ int spellnum;
destroy_item(SCROLL_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE);
destroy_item(SPBOOK_CLASS, AD_FIRE);
(void) burn_floor_paper(u.ux, u.uy, TRUE, FALSE);
(void) burn_floor_objects(u.ux, u.uy, TRUE, FALSE);
break;
case CLC_LIGHTNING:
{
+9
View File
@@ -493,6 +493,15 @@ int trap_type;
if(rn2(7))
dosdoor(xx, yy, aroom, rn2(5) ? SDOOR : DOOR);
else {
/* inaccessible niches occasionally have iron bars */
if (!rn2(5) && IS_WALL(levl[xx][yy].typ)) {
levl[xx][yy].typ = IRONBARS;
if (rn2(3))
(void) mkcorpstat(CORPSE,
(struct monst *)0,
mkclass(S_HUMAN, 0),
xx, yy+dy, TRUE);
}
if (!level.flags.noteleport)
(void) mksobj_at(SCR_TELEPORTATION,
xx, yy+dy, TRUE, FALSE);
-1
View File
@@ -879,7 +879,6 @@ fumaroles()
for (n = rn2(3)+2; n; n--) {
xchar x = rn1(COLNO-4,3);
xchar y = rn1(ROWNO-4,3);
struct trap *ttmp = t_at(x,y);
if (levl[x][y].typ == LAVAPOOL) {
NhRegion *r = create_gas_cloud(x,y, 4+rn2(5), rn1(10,5));
clear_heros_fault(r);
+1276 -1135
View File
File diff suppressed because it is too large Load Diff
+2340 -2322
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -285,6 +285,7 @@ struct permonst *mptr;
{
return (boolean) (passes_walls(mptr) || amorphous(mptr) ||
unsolid(mptr) || is_whirly(mptr) || verysmall(mptr) ||
dmgtype(mptr, AD_CORR) || dmgtype(mptr, AD_RUST) ||
(slithy(mptr) && !bigmonst(mptr)));
}
+16 -1
View File
@@ -1180,7 +1180,14 @@ postmov:
add_damage(mtmp->mx, mtmp->my, 0L);
}
} else if (levl[mtmp->mx][mtmp->my].typ == IRONBARS) {
if (flags.verbose && canseemon(mtmp))
if (may_dig(mtmp->mx,mtmp->my) &&
(dmgtype(ptr, AD_RUST) || dmgtype(ptr, AD_CORR))) {
if (canseemon(mtmp))
pline("%s eats through the iron bars.",
Monnam(mtmp));
dissolve_bars(mtmp->mx, mtmp->my);
return(3);
} else if (flags.verbose && canseemon(mtmp))
Norep("%s %s %s the iron bars.", Monnam(mtmp),
/* pluralization fakes verb conjugation */
makeplural(locomotion(ptr, "pass")),
@@ -1266,6 +1273,14 @@ postmov:
return(mmoved);
}
void
dissolve_bars(x, y)
register int x, y;
{
levl[x][y].typ = (Is_special(&u.uz) || *in_rooms(x,y,0)) ? ROOM : CORR;
newsym(x, y);
}
boolean
closed_door(x, y)
register int x, y;
+4 -4
View File
@@ -1820,7 +1820,7 @@ struct permonst _mons2[] = {
* Puddings
*/
MON("gray ooze", S_PUDDING,
LVL(3, 1, 8, 0, 0), (G_GENO|2),
LVL(3, 1, 8, 0, 0), (G_GENO|G_NOCORPSE|2),
A(ATTK(AT_BITE, AD_RUST, 2, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
@@ -1829,7 +1829,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_GRAY),
MON("brown pudding", S_PUDDING,
LVL(5, 3, 8, 0, 0), (G_GENO|1),
LVL(5, 3, 8, 0, 0), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_BITE, AD_DCAY, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(500, 250, MS_SILENT, MZ_MEDIUM),
@@ -1838,7 +1838,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID,
M2_HOSTILE|M2_NEUTER, 0, CLR_BROWN),
MON("green slime", S_PUDDING,
LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|1),
LVL(6, 6, 6, 0, 0), (G_HELL|G_GENO|G_NOCORPSE|1),
A(ATTK(AT_TUCH, AD_SLIM, 1, 4), ATTK(AT_NONE, AD_SLIM, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(400, 150, MS_SILENT, MZ_LARGE),
@@ -1847,7 +1847,7 @@ struct permonst _mons2[] = {
M1_MINDLESS|M1_OMNIVORE|M1_ACID|M1_POIS,
M2_HOSTILE|M2_NEUTER, 0, CLR_GREEN),
MON("black pudding", S_PUDDING,
LVL(10, 6, 6, 0, 0), (G_GENO|1),
LVL(10, 6, 6, 0, 0), (G_GENO|G_NOCORPSE|1),
A(ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_NONE, AD_CORR, 0, 0),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(900, 250, MS_SILENT, MZ_LARGE),
+13 -4
View File
@@ -1,5 +1,4 @@
/* NetHack 3.5 objects.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 objects.c $Date: 2011/07/28 04:00:20 $ $Revision: 1.23 $ */
/* NetHack 3.5 objects.c $NHDT-Date: 1428802519 2015/04/12 01:35:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
/* Copyright (c) Mike Threepoint, 1989. */
/* NetHack may be freely redistributed. See license for details. */
@@ -374,9 +373,9 @@ ARMOR("splint mail", (char *)0,
ARMOR("banded mail", (char *)0,
1, 0, 1, 0, 72, 5, 350, 90, 4, 1, ARM_SUIT, IRON, HI_METAL),
ARMOR("dwarvish mithril-coat", (char *)0,
1, 0, 0, 0, 10, 1, 150, 240, 4, 2, ARM_SUIT, MITHRIL, HI_METAL),
1, 0, 0, 0, 10, 1, 150, 240, 4, 2, ARM_SUIT, MITHRIL, HI_SILVER),
ARMOR("elven mithril-coat", (char *)0,
1, 0, 0, 0, 15, 1, 150, 240, 5, 2, ARM_SUIT, MITHRIL, HI_METAL),
1, 0, 0, 0, 15, 1, 150, 240, 5, 2, ARM_SUIT, MITHRIL, HI_SILVER),
ARMOR("chain mail", (char *)0,
1, 0, 0, 0, 72, 5, 300, 75, 5, 1, ARM_SUIT, IRON, HI_METAL),
ARMOR("orcish chain mail", "crude chain mail",
@@ -670,11 +669,18 @@ FOOD("egg", 85, 1, 1, 1, FLESH, 80, CLR_WHITE),
FOOD("meatball", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
FOOD("meat stick", 0, 1, 1, 0, FLESH, 5, CLR_BROWN),
FOOD("huge chunk of meat", 0,20,400, 0, FLESH,2000, CLR_BROWN),
/* special case because it's not mergable */
OBJECT(OBJ("meat ring", (char *)0),
BITS(1,0,0,0,0,0,0,0,0,0,0,0,FLESH),
0, FOOD_CLASS, 0, 1, 5, 1, 0, 0, 0, 0, 5, CLR_BROWN),
/* pudding 'corpses' will turn into these and combine */
FOOD("glob of gray ooze", 0, 2, 20, 0, FLESH, 20, CLR_GRAY),
FOOD("glob of brown pudding", 0, 2, 20, 0, FLESH, 20, CLR_BROWN),
FOOD("glob of green slime", 0, 2, 20, 0, FLESH, 20, CLR_GREEN),
FOOD("glob of black pudding", 0, 2, 20, 0, FLESH, 20, CLR_BLACK),
/* fruits & veggies */
FOOD("kelp frond", 0, 1, 1, 0, VEGGY, 30, CLR_GREEN),
FOOD("eucalyptus leaf", 3, 1, 1, 0, VEGGY, 30, CLR_GREEN),
@@ -821,6 +827,9 @@ SPELL("freeze sphere", "hardcover", P_MATTER_SPELL, 20, 2, 1, 1, NODIR, CLR
#endif
/* blank spellbook must come last because it retains its description */
SPELL("blank paper", "plain", P_NONE, 18, 0, 0, 0, 0, HI_PAPER),
/* tribute book for 3.6 */
OBJECT(OBJ("novel", "paperback"), BITS(0,0,1,0,0,0,0,1,0,0,0,P_NONE,HI_PAPER), 0,
SPBOOK_CLASS, 0, 0, 0, 1, 0, 0, 0, 1, 20, CLR_BRIGHT_BLUE),
/* a special, one of a kind, spellbook */
OBJECT(OBJ("Book of the Dead", "papyrus"), BITS(0,0,1,0,1,0,1,1,0,0,0,P_NONE,PAPER), 0,
SPBOOK_CLASS, 0, 0,20, 10000, 0, 0, 0, 7, 20, HI_PAPER),
+2505 -2445
View File
File diff suppressed because it is too large Load Diff
+7 -42
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 options.c $NHDT-Date: 1427073746 2015/03/23 01:22:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.164 $ */
/* NetHack 3.5 options.c $NHDT-Date: 1428088105 2015/04/03 19:08:25 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.182 $ */
/* NetHack 3.5 options.c $Date: 2012/04/09 02:56:30 $ $Revision: 1.153 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -78,6 +78,7 @@ static struct Bool_Opt
{"asksavedisk", (boolean *)0, FALSE, SET_IN_FILE},
#endif
{"autodig", &flags.autodig, FALSE, SET_IN_GAME},
{"autoopen", &flags.autoopen, TRUE, SET_IN_GAME},
{"autopickup", &flags.pickup, TRUE, SET_IN_GAME},
{"autoquiver", &flags.autoquiver, FALSE, SET_IN_GAME},
#if defined(MICRO) && !defined(AMIGA)
@@ -1170,11 +1171,6 @@ char *str;
int i, c = NO_COLOR, a = ATR_NONE;
struct menucoloring *tmp;
char *tmps, *cs = strchr(str, '=');
#ifdef MENU_COLOR_REGEX_POSIX
int errnum;
char errbuf[80];
#endif
const char *err = (char *)0;
if (!cs || !str) return FALSE;
@@ -1217,28 +1213,9 @@ char *str;
}
tmp = (struct menucoloring *)alloc(sizeof(struct menucoloring));
#ifdef MENU_COLOR_REGEX
#ifdef MENU_COLOR_REGEX_POSIX
errnum = regcomp(&tmp->match, tmps, REG_EXTENDED | REG_NOSUB);
if (errnum != 0)
{
regerror(errnum, &tmp->match, errbuf, sizeof(errbuf));
err = errbuf;
}
#else
tmp->match.translate = 0;
tmp->match.fastmap = 0;
tmp->match.buffer = 0;
tmp->match.allocated = 0;
tmp->match.regs_allocated = REGS_FIXED;
err = re_compile_pattern(tmps, strlen(tmps), &tmp->match);
#endif
#else
tmp->match = (char *)alloc(strlen(tmps)+1);
(void) memcpy((genericptr_t)tmp->match, (genericptr_t)tmps, strlen(tmps)+1);
#endif
if (err) {
raw_printf("\nMenucolor regex error: %s\n", err);
tmp->match = regex_init();
if (!regex_compile(tmps, tmp->match)) {
raw_printf("\nMenucolor regex error: %s\n", regex_error_desc(tmp->match));
wait_synch();
free(tmp);
return FALSE;
@@ -1259,15 +1236,7 @@ int *color, *attr;
struct menucoloring *tmpmc;
if (iflags.use_menu_color)
for (tmpmc = menu_colorings; tmpmc; tmpmc = tmpmc->next)
#ifdef MENU_COLOR_REGEX
# ifdef MENU_COLOR_REGEX_POSIX
if (regexec(&tmpmc->match, str, 0, NULL, 0) == 0) {
# else
if (re_search(&tmpmc->match, str, strlen(str), 0, 9999, 0) >= 0) {
# endif
#else
if (pmatch(tmpmc->match, str)) {
#endif
if (regex_match(str, tmpmc->match)) {
*color = tmpmc->color;
*attr = tmpmc->attr;
return TRUE;
@@ -1282,11 +1251,7 @@ free_menu_coloring()
while (tmp) {
struct menucoloring *tmp2 = tmp->next;
#ifdef MENU_COLOR_REGEX
(void) regfree(&tmp->match);
#else
free(tmp->match);
#endif
regex_free(tmp->match);
free(tmp);
tmp = tmp2;
}
+2 -2
View File
@@ -708,7 +708,7 @@ menu_item **pick_list; /* return list of items picked */
int how; /* type of query */
boolean FDECL((*allow), (OBJ_P));/* allow function */
{
int i, j, n;
int i, n;
winid win;
struct obj *curr, *last, fake_hero_object;
struct obj **oarray;
@@ -823,7 +823,7 @@ boolean FDECL((*allow), (OBJ_P));/* allow function */
if (n > 0) {
menu_item *mi;
int i, k;
int k;
/* fix up counts: -1 means no count used => pick all;
if fake_hero_object was picked, discard that choice */
+9
View File
@@ -1819,6 +1819,15 @@ dodip()
return 1;
}
if(potion->otyp == POT_ACID && obj->otyp == CORPSE &&
obj->corpsenm == PM_LICHEN & !Blind) {
pline("%s %s %s around the edges.", The(cxname(obj)),
otense(obj, "turn"), potion->odiluted ?
hcolor(NH_ORANGE) : hcolor(NH_RED));
potion->in_use = FALSE; /* didn't go poof */
return(1);
}
if(is_poisonable(obj)) {
if(potion->otyp == POT_SICKNESS && !obj->opoisoned) {
char buf[BUFSZ];
+1 -1
View File
@@ -1370,7 +1370,7 @@ dosacrifice()
a_gname(), u_gname());
pline("%s is enraged...", u_gname());
pline("Fortunately, %s permits you to live...", a_gname());
pline(cloud_of_smoke, hcolor("orange"));
pline(cloud_of_smoke, hcolor(NH_ORANGE));
done(ESCAPED);
} else { /* super big win */
adjalign(10);
+3 -1
View File
@@ -320,9 +320,11 @@ doread()
#endif
/* Actions required to win the game aren't counted towards conduct */
/* Novel conduct is handled in read_tribute so exclude it too*/
if (scroll->otyp != SPE_BOOK_OF_THE_DEAD &&
scroll->otyp != SPE_BLANK_PAPER &&
scroll->otyp != SCR_BLANK_PAPER)
scroll->otyp != SCR_BLANK_PAPER &&
scroll->otyp != SPE_NOVEL)
u.uconduct.literate++;
if(scroll->oclass == SPBOOK_CLASS) {
+8 -1
View File
@@ -502,6 +502,13 @@ register struct obj *otmp;
else otmp->spe = fruitadd(oldf->fname, (struct fruit *)0);
}
#ifdef SYSCF
#define SYSOPT_CHECK_SAVE_UID sysopt.check_save_uid
#else
#define SYSOPT_CHECK_SAVE_UID TRUE
#endif
STATIC_OVL
boolean
restgamestate(fd, stuckid, steedid)
@@ -517,7 +524,7 @@ unsigned int *stuckid, *steedid;
unsigned long uid;
mread(fd, (genericptr_t) &uid, sizeof uid);
if (uid != (unsigned long)getuid()) { /* strange ... */
if (SYSOPT_CHECK_SAVE_UID && uid != (unsigned long)getuid()) { /* strange ... */
/* for wizard mode, issue a reminder; for others, treat it
as an attempt to cheat and refuse to restore this file */
pline("Saved game was not yours.");
+39 -5
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 shknam.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 shknam.c $NHDT-Date: 1428207608 2015/04/05 04:20:08 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.32 $ */
/* NetHack 3.5 shknam.c $Date: 2011/04/15 01:55:42 $ $Revision: 1.24 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -10,7 +10,7 @@
STATIC_DCL boolean FDECL(veggy_item, (struct obj *obj,int));
STATIC_DCL int NDECL(shkveg);
STATIC_DCL void FDECL(mkveggy_at, (int,int));
STATIC_DCL void FDECL(mkshobj_at, (const struct shclass *,int,int));
STATIC_DCL void FDECL(mkshobj_at, (const struct shclass *,int,int,BOOLEAN_P));
STATIC_DCL void FDECL(nameshk, (struct monst *,const char * const *));
STATIC_DCL int FDECL(shkinit, (const struct shclass *,struct mkroom *));
@@ -357,15 +357,24 @@ int sx, sy;
}
STATIC_OVL void
mkshobj_at(shp, sx, sy)
mkshobj_at(shp, sx, sy, mkspecl)
/* make an object of the appropriate type for a shop square */
const struct shclass *shp;
int sx, sy;
boolean mkspecl;
{
struct monst *mtmp;
int atype;
struct permonst *ptr;
/* 3.6.0 tribute */
if (mkspecl && (!strcmp(shp->name, "rare books") ||
!strcmp(shp->name, "second-hand bookstore"))) {
struct obj *novel=mksobj_at(SPE_NOVEL, sx, sy, FALSE, FALSE);
if (novel) context.tribute.bookstock = TRUE;
return;
}
if (rn2(100) < depth(&u.uz) &&
!MON_AT(sx, sy) && (ptr = mkclass(S_MIMIC,0)) &&
(mtmp = makemon(ptr,sx,sy,NO_MM_FLAGS)) != 0) {
@@ -572,7 +581,8 @@ register struct mkroom *sroom;
* shop-style placement (all squares except a row nearest the first
* door get objects).
*/
register int sx, sy, sh;
int sx, sy, sh;
int stockcount = 0, specialspot = 0;
char buf[BUFSZ];
int rmno = (int)((sroom - rooms) + ROOMOFFSET);
const struct shclass *shp = &shtypes[shp_indx];
@@ -608,6 +618,29 @@ register struct mkroom *sroom;
make_engr_at(m, n, buf, 0L, DUST);
}
if (context.tribute.enabled && !context.tribute.bookstock) {
/*
* Out of the number of spots where we're actually
* going to put stuff, randomly single out one in particular.
*/
for (sx = sroom->lx; sx <= sroom->hx; sx++)
for (sy = sroom->ly; sy <= sroom->hy; sy++) {
if (sroom->irregular) {
if (levl[sx][sy].edge || (int)levl[sx][sy].roomno != rmno ||
distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1)
continue;
}
else if ((sx == sroom->lx && doors[sh].x == sx - 1) ||
(sx == sroom->hx && doors[sh].x == sx + 1) ||
(sy == sroom->ly && doors[sh].y == sy - 1) ||
(sy == sroom->hy && doors[sh].y == sy + 1)) continue;
stockcount++;
}
specialspot = rnd(stockcount);
stockcount = 0;
}
for(sx = sroom->lx; sx <= sroom->hx; sx++)
for(sy = sroom->ly; sy <= sroom->hy; sy++) {
if(sroom->irregular) {
@@ -618,7 +651,8 @@ register struct mkroom *sroom;
(sx == sroom->hx && doors[sh].x == sx+1) ||
(sy == sroom->ly && doors[sh].y == sy-1) ||
(sy == sroom->hy && doors[sh].y == sy+1)) continue;
mkshobj_at(shp, sx, sy);
stockcount++;
mkshobj_at(shp, sx, sy, ((stockcount) && (stockcount == specialspot)));
}
/*
+25 -9
View File
@@ -15,6 +15,11 @@
#include "sp_lev.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4244)
#endif
typedef void (*select_iter_func)(int, int, genericptr_t);
extern void FDECL(mkmap, (lev_init *));
@@ -403,7 +408,7 @@ opvar_clone(ov)
case SPOVAR_VARIABLE:
case SPOVAR_STRING:
case SPOVAR_SEL:
tmpov->vardata.str = strdup(ov->vardata.str);
tmpov->vardata.str = dupstr(ov->vardata.str);
break;
default: impossible("Unknown push value type (%i)!", ov->spovartyp);
}
@@ -2673,7 +2678,7 @@ spo_monster(coder)
case SP_M_V_NAME:
if ((OV_typ(parm) == SPOVAR_STRING) &&
!tmpmons.name.str)
tmpmons.name.str = strdup(OV_s(parm));
tmpmons.name.str = dupstr(OV_s(parm));
break;
case SP_M_V_APPEAR:
if ((OV_typ(parm) == SPOVAR_INT) &&
@@ -2681,7 +2686,7 @@ spo_monster(coder)
tmpmons.appear = OV_i(parm);
opvar_free(parm);
OV_pop(parm);
tmpmons.appear_as.str = strdup(OV_s(parm));
tmpmons.appear_as.str = dupstr(OV_s(parm));
}
break;
case SP_M_V_ASLEEP:
@@ -2816,7 +2821,7 @@ spo_object(coder)
case SP_O_V_NAME:
if ((OV_typ(parm) == SPOVAR_STRING) &&
!tmpobj.name.str)
tmpobj.name.str = strdup(OV_s(parm));
tmpobj.name.str = dupstr(OV_s(parm));
break;
case SP_O_V_CORPSENM:
if (OV_typ(parm) == SPOVAR_MONST) {
@@ -3921,7 +3926,7 @@ spo_levregion(coder)
tmplregion->del_islev = OV_i(del_islev);
tmplregion->rtype = OV_i(rtype);
tmplregion->padding = OV_i(padding);
tmplregion->rname.str = strdup(OV_s(rname));
tmplregion->rname.str = dupstr(OV_s(rname));
if(!tmplregion->in_islev) {
get_location(&tmplregion->inarea.x1, &tmplregion->inarea.y1,
@@ -4490,7 +4495,7 @@ spo_var_init(coder)
tmpvar = (struct splev_var *)malloc(sizeof(struct splev_var));
if (!tmpvar) panic("newvar tmpvar alloc");
tmpvar->next = coder->frame->variables;
tmpvar->name = strdup(OV_s(vname));
tmpvar->name = dupstr(OV_s(vname));
coder->frame->variables = tmpvar;
if (OV_i(arraylen) < 0) {
@@ -5032,7 +5037,7 @@ sp_lev *lvl;
break;
case SPO_SEL_LINE:
{
struct opvar *tmp, *tmp2, *pt = selection_opvar(NULL);
struct opvar *tmp = NULL, *tmp2 = NULL, *pt = selection_opvar(NULL);
schar x1,y1,x2,y2;
if (!OV_pop_c(tmp)) panic("no ter sel linecoord1");
if (!OV_pop_c(tmp2)) panic("no ter sel linecoord2");
@@ -5050,7 +5055,7 @@ sp_lev *lvl;
break;
case SPO_SEL_RNDLINE:
{
struct opvar *tmp, *tmp2, *tmp3, *pt = selection_opvar(NULL);
struct opvar *tmp = NULL, *tmp2 = NULL, *tmp3, *pt = selection_opvar(NULL);
schar x1,y1,x2,y2;
if (!OV_pop_i(tmp3)) panic("no ter sel randline1");
if (!OV_pop_c(tmp)) panic("no ter sel randline2");
@@ -5163,7 +5168,14 @@ next_opcode:
link_doors_rooms();
fill_rooms();
remove_boundary_syms();
wallification(1, 0, COLNO-1, ROWNO-1);
/* FIXME: Ideally, we want this call to only cover areas of the map
* which were not inserted directly by the special level file (see
* the insect legs on Baalzebub's level, for instance). Since that
* is currently not possible, we overload the corrmaze flag for this
* purpose.
*/
if (!level.flags.corrmaze)
wallification(1, 0, COLNO-1, ROWNO-1);
count_features();
@@ -5215,4 +5227,8 @@ const char *name;
}
#ifdef _MSC_VER
#pragma warning(pop)
#endif
/*sp_lev.c*/
+14 -3
View File
@@ -411,8 +411,8 @@ int
study_book(spellbook)
register struct obj *spellbook;
{
register int booktype = spellbook->otyp;
register boolean confused = (Confusion != 0);
int booktype = spellbook->otyp;
boolean confused = (Confusion != 0);
boolean too_hard = FALSE;
/* attempting to read dull book may make hero fall asleep */
@@ -440,7 +440,8 @@ register struct obj *spellbook;
/* handle the sequence: start reading, get interrupted,
have context.spbook.book become erased somehow, resume reading it */
booktype != SPE_BLANK_PAPER) {
You("continue your efforts to memorize the spell.");
You("continue your efforts to %s.", (booktype == SPE_NOVEL) ?
"read the novel" : "memorize the spell");
} else {
/* KMH -- Simplified this code */
if (booktype == SPE_BLANK_PAPER) {
@@ -448,6 +449,16 @@ register struct obj *spellbook;
makeknown(booktype);
return(1);
}
/* 3.6.0 tribute */
if (booktype == SPE_NOVEL) {
/* Obtain current Terry Pratchett book
title for the current game. */
const char *tribtitle = noveltitle(&spellbook->novelidx);
read_tribute("books", tribtitle, 0);
return(1);
}
switch (objects[booktype].oc_level) {
case 1:
case 2:
+1
View File
@@ -67,6 +67,7 @@ sys_early_init()
# endif
#endif
sysopt.check_save_uid = 1;
sysopt.seduce = 1; /* if it's compiled in, default to on */
sysopt_seduce_set(sysopt.seduce);
}
+8 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 trap.c $NHDT-Date: 1427934551 2015/04/02 00:29:11 $ $NHDT-Branch: master $:$NHDT-Revision: 1.223 $ */
/* NetHack 3.5 trap.c $NHDT-Date: 1428207616 2015/04/05 04:20:16 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.224 $ */
/* NetHack 3.5 trap.c $Date: 2013/03/14 01:58:21 $ $Revision: 1.179 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -2215,7 +2215,7 @@ glovecheck: target = which_armor(mtmp, W_ARMG);
(void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE);
(void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE);
}
if (burn_floor_paper(mtmp->mx, mtmp->my, see_it, FALSE) &&
if (burn_floor_objects(mtmp->mx, mtmp->my, see_it, FALSE) &&
!see_it && distu(mtmp->mx, mtmp->my) <= 3*3)
You("smell smoke.");
if (is_ice(mtmp->mx,mtmp->my))
@@ -2853,7 +2853,7 @@ struct obj *box; /* null for floor trap */
boolean see_it = !Blind;
int num, alt;
/* Bug: for box case, the equivalent of burn_floor_paper() ought
/* Bug: for box case, the equivalent of burn_floor_objects() ought
* to be done upon its contents.
*/
@@ -2898,7 +2898,7 @@ struct obj *box; /* null for floor trap */
destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE);
}
if (!box && burn_floor_paper(u.ux, u.uy, see_it, TRUE) && !see_it)
if (!box && burn_floor_objects(u.ux, u.uy, see_it, TRUE) && !see_it)
You("smell paper burning.");
if (is_ice(u.ux, u.uy))
melt_ice(u.ux, u.uy, (char *)0);
@@ -3206,6 +3206,10 @@ boolean force;
pline("Steam rises from %s.", the(xname(obj)));
return 0;
}
if (obj->otyp == SPE_NOVEL) {
obj->novelidx = 0;
free_oname(obj);
}
obj->otyp = SPE_BLANK_PAPER;
obj->dknown = 0;
if (carried(obj))
+1
View File
@@ -741,6 +741,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
case EXPENSIVE_CAMERA:
You("succeed in destroying %s. Congratulations!",
ysimple_name(obj));
release_camera_demon(obj, u.ux, u.uy);
useup(obj);
return(TRUE);
/*NOTREACHED*/
+20 -32
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 vision.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* NetHack 3.5 vision.c $NHDT-Date: 1426449474 2015/03/15 19:57:54 $ $NHDT-Branch: derek-farming $:$NHDT-Revision: 1.14 $ */
/* NetHack 3.5 vision.c $Date: 2009/05/06 10:48:10 $ $Revision: 1.12 $ */
/* SCCS Id: @(#)vision.c 3.5 2007/11/05 */
/* Copyright (c) Dean Luick, with acknowledgements to Dave Cohrs, 1990. */
@@ -499,7 +499,7 @@ vision_recalc(control)
char *next_rmin; /* min pointer for the new array */
char *next_rmax; /* max pointer for the new array */
char *ranges; /* circle ranges -- used for xray & night vision */
int row; /* row counter (outer loop) */
int row = 0; /* row counter (outer loop) */
int start, stop; /* inner loop starting/stopping index */
int dx, dy; /* one step from a lit door or lit wall (see below) */
register int col; /* inner loop counter */
@@ -513,10 +513,6 @@ vision_recalc(control)
vision_full_recalc = 0; /* reset flag */
if (in_mklev || !iflags.vision_inited) return;
#ifdef GCC_WARN
row = 0;
#endif
/*
* Either the light sources have been taken care of, or we must
* recalculate them here.
@@ -1655,18 +1651,15 @@ right_side(row, cb_row, cb_col, fb_row, fb_col, left, right_mark, limits)
char *limits; /* points at range limit for current row, or NULL */
{
register int i;
register char *rowp;
register char *rowp = NULL;
int hit_stone = 0;
int left_shadow, right_shadow, loc_right;
int lblock_col; /* local block column (current row) */
int nrow, deeper;
char *row_min; /* left most */
char *row_max; /* right most */
char *row_min = NULL; /* left most */
char *row_max = NULL; /* right most */
int lim_max; /* right most limit of circle */
#ifdef GCC_WARN
rowp = 0;
#endif
nrow = row + step;
deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1)));
if(!vis_func) {
@@ -1910,18 +1903,15 @@ left_side(row, cb_row, cb_col, fb_row, fb_col, left_mark, right, limits)
char *limits;
{
register int i;
register char *rowp;
register char *rowp = NULL;
int hit_stone = 0;
int left_shadow, right_shadow, loc_left;
int lblock_col; /* local block column (current row) */
int nrow, deeper;
char *row_min; /* left most */
char *row_max; /* right most */
char *row_min = NULL; /* left most */
char *row_max = NULL; /* right most */
int lim_min;
#ifdef GCC_WARN
rowp = 0;
#endif
nrow = row + step;
deeper = good_row(nrow) && (!limits || (*limits >= *(limits+1)));
if(!vis_func) {
@@ -2192,20 +2182,17 @@ right_side(row, left, right_mark, limits)
int right_mark; /* last (right side) visible spot on prev row */
char *limits; /* points at range limit for current row, or NULL */
{
int right; /* right limit of "could see" */
int right_edge; /* right edge of an opening */
int nrow; /* new row (calculate once) */
int deeper; /* if TRUE, call self as needed */
int result; /* set by q?_path() */
register int i; /* loop counter */
int right; /* right limit of "could see" */
int right_edge; /* right edge of an opening */
int nrow; /* new row (calculate once) */
int deeper; /* if TRUE, call self as needed */
int result; /* set by q?_path() */
register int i; /* loop counter */
register char *rowp = NULL; /* row optimization */
char *row_min = NULL; /* left most [used by macro set_min()] */
char *row_max = NULL; /* right most [used by macro set_max()] */
int lim_max; /* right most limit of circle */
int lim_max; /* right most limit of circle */
#ifdef GCC_WARN
rowp = row_min = row_max = 0;
#endif
nrow = row + step;
/*
* Can go deeper if the row is in bounds and the next row is within
@@ -2372,11 +2359,12 @@ left_side(row, left_mark, right, limits)
int row, left_mark, right;
char *limits;
{
int left, left_edge, nrow, deeper, result;
register int i;
int left, left_edge, nrow, deeper, result;
register int i;
register char *rowp = NULL;
char *row_min = NULL, *row_max = NULL;
int lim_min;
char *row_min = NULL;
char *row_max = NULL;
int lim_min;
#ifdef GCC_WARN
rowp = row_min = row_max = 0;
+179 -158
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 zap.c $NHDT-Date: 1427782839 2015/03/31 06:20:39 $ $NHDT-Branch: master $:$NHDT-Revision: 1.200 $ */
/* NetHack 3.5 zap.c $NHDT-Date: 1428207622 2015/04/05 04:20:22 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.215 $ */
/* NetHack 3.5 zap.c $Date: 2013/11/05 00:57:56 $ $Revision: 1.183 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
@@ -956,7 +956,9 @@ register struct obj *obj;
obj->spe = 0;
break;
case SPBOOK_CLASS:
if (otyp != SPE_CANCELLATION && otyp != SPE_BOOK_OF_THE_DEAD) {
if (otyp != SPE_CANCELLATION &&
otyp != SPE_NOVEL &&
otyp != SPE_BOOK_OF_THE_DEAD) {
costly_alteration(obj, COST_CANCEL);
obj->otyp = SPE_BLANK_PAPER;
}
@@ -2110,18 +2112,19 @@ boolean ordinary;
case FIRE_HORN:
learn_it = TRUE;
if (Fire_resistance) {
shieldeff(u.ux, u.uy);
You_feel("rather warm.");
ugolemeffects(AD_FIRE, d(12,6));
} else {
pline("You've set yourself afire!");
damage = d(12,6);
shieldeff(u.ux, u.uy);
You_feel("rather warm.");
ugolemeffects(AD_FIRE, d(12,6));
} else {
pline("You've set yourself afire!");
damage = d(12,6);
}
burn_away_slime();
(void) burnarmor(&youmonst);
destroy_item(SCROLL_CLASS, AD_FIRE);
destroy_item(POTION_CLASS, AD_FIRE);
destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(FOOD_CLASS, AD_FIRE); /* only slime for now */
break;
case WAN_COLD:
@@ -3327,6 +3330,7 @@ struct obj **ootmp; /* to return worn armor for caller to disintegrate */
if (!rn2(3)) (void)destroy_mitem(mon, POTION_CLASS, AD_FIRE);
if (!rn2(3)) (void)destroy_mitem(mon, SCROLL_CLASS, AD_FIRE);
if (!rn2(5)) (void)destroy_mitem(mon, SPBOOK_CLASS, AD_FIRE);
destroy_mitem(mon, FOOD_CLASS, AD_FIRE); /* carried slime */
}
break;
case ZT_COLD:
@@ -3471,6 +3475,7 @@ xchar sx, sy;
if (!rn2(3)) destroy_item(POTION_CLASS, AD_FIRE);
if (!rn2(3)) destroy_item(SCROLL_CLASS, AD_FIRE);
if (!rn2(5)) destroy_item(SPBOOK_CLASS, AD_FIRE);
destroy_item(FOOD_CLASS, AD_FIRE);
}
break;
case ZT_COLD:
@@ -3567,11 +3572,11 @@ xchar sx, sy;
}
/*
* burn scrolls and spellbooks on floor at position x,y
* return the number of scrolls and spellbooks burned
* burn objects (such as scrolls and spellbooks) on floor
* at position x,y; return the number of objects burned
*/
int
burn_floor_paper(x, y, give_feedback, u_caused)
burn_floor_objects(x, y, give_feedback, u_caused)
int x, y;
boolean give_feedback; /* caller needs to decide about visibility checks */
boolean u_caused;
@@ -3583,37 +3588,39 @@ boolean u_caused;
for (obj = level.objects[x][y]; obj; obj = obj2) {
obj2 = obj->nexthere;
if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS) {
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL ||
obj_resists(obj, 2, 100))
continue;
scrquan = obj->quan; /* number present */
delquan = 0L; /* number to destroy */
for (i = scrquan; i > 0L; i--)
if (!rn2(3)) delquan++;
if (delquan) {
/* save name before potential delobj() */
if (give_feedback) {
obj->quan = 1L;
Strcpy(buf1, (x == u.ux && y == u.uy) ?
xname(obj) : distant_name(obj, xname));
obj->quan = 2L;
Strcpy(buf2, (x == u.ux && y == u.uy) ?
xname(obj) : distant_name(obj, xname));
obj->quan = scrquan;
}
/* useupf(), which charges, only if hero caused damage */
if (u_caused) useupf(obj, delquan);
else if (delquan < scrquan) obj->quan -= delquan;
else delobj(obj);
cnt += delquan;
if (give_feedback) {
if (delquan > 1L)
pline("%ld %s burn.", delquan, buf2);
else
pline("%s burns.", An(buf1));
}
}
if (obj->oclass == SCROLL_CLASS || obj->oclass == SPBOOK_CLASS
|| (obj->oclass == FOOD_CLASS
&& obj->otyp == GLOB_OF_GREEN_SLIME)) {
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL ||
obj_resists(obj, 2, 100))
continue;
scrquan = obj->quan; /* number present */
delquan = 0L; /* number to destroy */
for (i = scrquan; i > 0L; i--)
if (!rn2(3)) delquan++;
if (delquan) {
/* save name before potential delobj() */
if (give_feedback) {
obj->quan = 1L;
Strcpy(buf1, (x == u.ux && y == u.uy) ?
xname(obj) : distant_name(obj, xname));
obj->quan = 2L;
Strcpy(buf2, (x == u.ux && y == u.uy) ?
xname(obj) : distant_name(obj, xname));
obj->quan = scrquan;
}
/* useupf(), which charges, only if hero caused damage */
if (u_caused) useupf(obj, delquan);
else if (delquan < scrquan) obj->quan -= delquan;
else delobj(obj);
cnt += delquan;
if (give_feedback) {
if (delquan > 1L)
pline("%ld %s burn.", delquan, buf2);
else
pline("%s burns.", An(buf1));
}
}
}
}
return cnt;
@@ -4253,7 +4260,7 @@ short exploding_wand_typ;
}
if(OBJ_AT(x, y) && abstype == ZT_FIRE)
if (burn_floor_paper(x, y, FALSE, type > 0) && couldsee(x, y)) {
if (burn_floor_objects(x, y, FALSE, type > 0) && couldsee(x, y)) {
newsym(x,y);
You("%s of smoke.",
!Blind ? "see a puff" : "smell a whiff");
@@ -4363,129 +4370,137 @@ const char * const destroy_strings[][3] = { /* also used in trap.c */
void
destroy_item(osym, dmgtyp)
register int osym, dmgtyp;
register int osym, dmgtyp;
{
register struct obj *obj, *obj2;
register int dmg, xresist, skip;
register long i, cnt, quan;
register int dindx;
const char *mult;
boolean physical_damage;
register struct obj *obj, *obj2;
register int dmg, xresist, skip;
register long i, cnt, quan;
register int dindx;
const char *mult;
boolean physical_damage;
for(obj = invent; obj; obj = obj2) {
obj2 = obj->nobj;
physical_damage = FALSE;
if(obj->oclass != osym) continue; /* test only objs of type osym */
if(obj->oartifact) continue; /* don't destroy artifacts */
if(obj->in_use && obj->quan == 1L) continue; /* not available */
xresist = skip = 0;
/* lint suppression */
dmg = dindx = 0;
quan = 0L;
for(obj = invent; obj; obj = obj2) {
obj2 = obj->nobj;
physical_damage = FALSE;
if(obj->oclass != osym) continue; /* test only objs of type osym */
if(obj->oartifact) continue; /* don't destroy artifacts */
if(obj->in_use && obj->quan == 1L) continue; /* not available */
xresist = skip = 0;
/* lint suppression */
dmg = dindx = 0;
quan = 0L;
switch(dmgtyp) {
case AD_COLD:
if(osym == POTION_CLASS && obj->otyp != POT_OIL) {
quan = obj->quan;
dindx = 0;
dmg = rnd(4);
} else skip++;
break;
case AD_FIRE:
xresist = (Fire_resistance && obj->oclass != POTION_CLASS);
switch(dmgtyp) {
case AD_COLD:
if(osym == POTION_CLASS && obj->otyp != POT_OIL) {
quan = obj->quan;
dindx = 0;
dmg = rnd(4);
} else skip++;
break;
case AD_FIRE:
xresist = (Fire_resistance
&& obj->oclass != POTION_CLASS
&& obj->otyp != GLOB_OF_GREEN_SLIME);
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
skip++;
if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
skip++;
if (!Blind)
pline("%s glows a strange %s, but remains intact.",
The(xname(obj)), hcolor("dark red"));
}
quan = obj->quan;
switch(osym) {
case POTION_CLASS:
dindx = (obj->otyp != POT_OIL) ? 1 : 2;
dmg = rnd(6);
break;
case SCROLL_CLASS:
dindx = 3;
dmg = 1;
break;
case SPBOOK_CLASS:
dindx = 4;
dmg = 1;
break;
default:
skip++;
break;
}
break;
case AD_ELEC:
xresist = (Shock_resistance && obj->oclass != RING_CLASS);
quan = obj->quan;
switch(osym) {
case RING_CLASS:
if(obj->otyp == RIN_SHOCK_RESISTANCE)
{ skip++; break; }
dindx = 5;
dmg = 0;
break;
case WAND_CLASS:
if(obj->otyp == WAN_LIGHTNING) { skip++; break; }
if (obj->otyp == SCR_FIRE || obj->otyp == SPE_FIREBALL)
skip++;
if (obj->otyp == SPE_BOOK_OF_THE_DEAD) {
skip++;
if (!Blind)
pline("%s glows a strange %s, but remains intact.",
The(xname(obj)), hcolor("dark red"));
}
quan = obj->quan;
switch(osym) {
case POTION_CLASS:
dindx = (obj->otyp != POT_OIL) ? 1 : 2;
dmg = rnd(6);
break;
case SCROLL_CLASS:
dindx = 3;
dmg = 1;
break;
case SPBOOK_CLASS:
dindx = 4;
dmg = 1;
break;
case FOOD_CLASS:
if (obj->otyp == GLOB_OF_GREEN_SLIME) {
dindx = obj->owt / 20;
dmg = 1;
} else { skip++; }
break;
default:
skip++;
break;
}
break;
case AD_ELEC:
xresist = (Shock_resistance && obj->oclass != RING_CLASS);
quan = obj->quan;
switch(osym) {
case RING_CLASS:
if(obj->otyp == RIN_SHOCK_RESISTANCE)
{ skip++; break; }
dindx = 5;
dmg = 0;
break;
case WAND_CLASS:
if(obj->otyp == WAN_LIGHTNING) { skip++; break; }
#if 0
if (obj == current_wand) { skip++; break; }
if (obj == current_wand) { skip++; break; }
#endif
dindx = 6;
dmg = rnd(10);
break;
default:
skip++;
break;
}
break;
default:
skip++;
break;
}
if(!skip) {
if (obj->in_use) --quan; /* one will be used up elsewhere */
for(i = cnt = 0L; i < quan; i++)
if(!rn2(3)) cnt++;
dindx = 6;
dmg = rnd(10);
break;
default:
skip++;
break;
}
break;
default:
skip++;
break;
}
if(!skip) {
if (obj->in_use) --quan; /* one will be used up elsewhere */
for(i = cnt = 0L; i < quan; i++)
if(!rn2(3)) cnt++;
if(!cnt) continue;
mult = (cnt == quan) ? "Your" :
(cnt == 1L) ? "One of your" : "Some of your";
pline("%s %s %s!", mult, xname(obj),
destroy_strings[dindx][(cnt > 1L)]);
if(osym == POTION_CLASS && dmgtyp != AD_COLD) {
if (!breathless(youmonst.data) || haseyes(youmonst.data))
potionbreathe(obj);
}
if (obj->owornmask) {
if (obj->owornmask & W_RING) /* ring being worn */
Ring_gone(obj);
else
setnotworn(obj);
}
if (obj == current_wand) current_wand = 0; /* destroyed */
for (i = 0; i < cnt; i++)
useup(obj);
if(dmg) {
if(xresist) You("aren't hurt!");
else {
const char *how = destroy_strings[dindx][2];
boolean one = (cnt == 1L);
if(!cnt) continue;
mult = (cnt == quan) ? (quan > 1) ? "All of your " : "Your" :
(cnt == 1L) ? "One of your" : "Some of your";
pline("%s %s %s!", mult, xname(obj),
destroy_strings[dindx][(cnt > 1L)]);
if(osym == POTION_CLASS && dmgtyp != AD_COLD) {
if (!breathless(youmonst.data) || haseyes(youmonst.data))
potionbreathe(obj);
}
if (obj->owornmask) {
if (obj->owornmask & W_RING) /* ring being worn */
Ring_gone(obj);
else
setnotworn(obj);
}
if (obj == current_wand) current_wand = 0; /* destroyed */
for (i = 0; i < cnt; i++)
useup(obj);
if(dmg) {
if(xresist) You("aren't hurt!");
else {
const char *how = destroy_strings[dindx][2];
boolean one = (cnt == 1L);
if (physical_damage) dmg = Maybe_Half_Phys(dmg);
losehp(dmg, one ? how : (const char *)makeplural(how),
one ? KILLED_BY_AN : KILLED_BY);
exercise(A_STR, FALSE);
}
}
}
}
return;
if (physical_damage) dmg = Maybe_Half_Phys(dmg);
losehp(dmg, one ? how : (const char *)makeplural(how),
one ? KILLED_BY_AN : KILLED_BY);
exercise(A_STR, FALSE);
}
}
}
}
return;
}
int
@@ -4544,6 +4559,12 @@ int osym, dmgtyp;
dindx = 4;
tmp++;
break;
case FOOD_CLASS:
if (obj->otyp == GLOB_OF_GREEN_SLIME) {
dindx = obj->owt / 20;
tmp++;
} else { skip++; }
break;
default:
skip++;
break;
+56
View File
@@ -0,0 +1,56 @@
/* NetHack 3.5 cppregex.cpp $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
/* Copyright (c) Sean Hunt 2015. */
/* NetHack may be freely redistributed. See license for details. */
#include <regex>
#include <memory>
/* nhregex interface documented in sys/share/posixregex.c */
extern "C" {
#include <hack.h>
struct nhregex {
std::unique_ptr<std::regex> re;
std::unique_ptr<std::regex_error> err;
};
struct nhregex *regex_init(void) {
return new nhregex;
}
boolean regex_compile(const char *s, struct nhregex *re) {
if (!re)
return FALSE;
try {
re->re.reset(new std::regex(s, std::regex::extended | std::regex::nosubs | std::regex::optimize));
re->err.reset(nullptr);
return TRUE;
} catch (const std::regex_error& err) {
re->err.reset(new std::regex_error(err));
re->re.reset(nullptr);
return FALSE;
}
}
const char *regex_error_desc(struct nhregex *re) {
if (re->err)
return re->err->what();
else
return nullptr;
}
boolean regex_match(const char *s, struct nhregex *re) {
if (!re->re)
return false;
try {
return regex_search(s, *re->re, std::regex_constants::match_any);
} catch (const std::regex_error& err) {
return false;
}
}
void regex_free(struct nhregex *re) {
delete re;
}
}
+806 -816
View File
File diff suppressed because it is too large Load Diff
+1228 -1126
View File
File diff suppressed because it is too large Load Diff
+441 -414
View File
File diff suppressed because it is too large Load Diff
+92
View File
@@ -0,0 +1,92 @@
/* NetHack 3.5 posixregex.c $NHDT-Date: 1428590280 2015/04/09 14:38:00 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.0 $ */
/* Copyright (c) Sean Hunt 2015. */
/* NetHack may be freely redistributed. See license for details. */
#include <hack.h>
#include <regex.h>
/* The nhregex interface is implemented by several source files. The
* file to be used can be linked in by the build.
*
* The regex standard implemented should be POSIX extended regular
* expressions, see:
* http://pubs.opengroup.org/onlinepubs/009696899/basedefs/xbd_chap09.html
* If an implementation uses an alternate expression format, this should
* be clearly noted; this will result in incompatibility of config files
* when NetHack is compiled with that implementation.
*
* struct nhregex
* The nhregex structure is an opaque structure type containing the
* information about a compiled regular expression.
*
* struct nhregex *regex_init(void)
* Used to create a new instance of the nhregex structure. It is
* uninitialized and can only safely be passed to regex_compile.
*
* boolean regex_compile(const char *s, struct nhregex *re)
* Used to compile s into a regex and store it in re. Returns TRUE if
* successful and FALSE otherwise. re is invalidated regardless of
* success.
*
* const char *regex_error_desc(struct nhregex *re)
* Used to retrieve an error description from an error created involving
* re. Returns NULL if no description can be retrieved. The returned
* string may be a static buffer and so is only valid until the next
* call to regex_error_desc.
*
* boolean regex_match(const char *s, struct nhregex *re)
* Used to determine if s (or any substring) matches the regex compiled
* into re. Only valid if the most recent call to regex_compile on re
* succeeded.
*
* void regex_free(struct nhregex *re)
* Deallocate a regex object.
*/
struct nhregex {
regex_t re;
int err;
};
struct nhregex *regex_init() {
return malloc (sizeof (struct nhregex));
}
boolean regex_compile(const char *s, struct nhregex *re) {
if (!re)
return FALSE;
if ((re->err = regcomp(&re->re, s, REG_EXTENDED | REG_NOSUB)))
return FALSE;
return TRUE;
}
const char *regex_error_desc(struct nhregex *re) {
static char buf[BUFSZ];
if (!re || !re->err)
return NULL;
/* FIXME: Using a static buffer here is not ideal, but avoids memory
* leaks. Consider the allocation more carefully. */
regerror(re->err, &re->re, buf, BUFSZ);
return buf;
}
boolean regex_match(const char *s, struct nhregex *re) {
if (!re)
return FALSE;
int result;
if ((result = regexec(&re->re, s, 0, NULL, 0))) {
if (result != REG_NOMATCH)
re->err = result;
return FALSE;
}
return TRUE;
}
void regex_free(struct nhregex *re) {
free(re);
}
+5 -3
View File
@@ -1,5 +1,5 @@
# NetHack Makefile.
# NetHack 3.5 Makefile.src $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$
# NetHack 3.5 Makefile.src $NHDT-Date: 1428590253 2015/04/09 14:37:33 $ $NHDT-Branch: scshunt-regex $:$NHDT-Revision: 1.38 $
# NetHack 3.5 Makefile.src $Date: 2012/01/20 03:41:33 $ $Revision: 1.37 $
# Root of source tree:
@@ -338,7 +338,7 @@ HACKCSRC = allmain.c alloc.c apply.c artifact.c attrib.c ball.c bones.c \
# all operating-system-dependent .c (for dependencies and such)
SYSCSRC = ../sys/atari/tos.c ../sys/share/pcmain.c ../sys/share/pcsys.c \
../sys/share/pctty.c ../sys/share/pcunix.c ../sys/share/random.c \
../sys/share/pctty.c ../sys/share/pcunix.c ../sys/share/posixregex.c ../sys/share/random.c \
../sys/share/ioctl.c ../sys/share/unixtty.c ../sys/unix/unixmain.c \
../sys/unix/unixunix.c ../sys/unix/unixres.c ../sys/be/bemain.c
@@ -391,7 +391,7 @@ HOBJ = $(FIRSTOBJ) allmain.o alloc.o apply.o artifact.o attrib.o ball.o \
minion.o mklev.o mkmap.o \
mkmaze.o mkobj.o mkroom.o mon.o mondata.o monmove.o monstr.o \
mplayer.o mthrowu.o muse.o music.o o_init.o objnam.o options.o \
pager.o pickup.o pline.o polyself.o potion.o pray.o priest.o \
pager.o pickup.o pline.o polyself.o posixregex.o potion.o pray.o priest.o \
quest.o questpgr.o read.o rect.o region.o restore.o rip.o rnd.o \
role.o rumors.o save.o shk.o shknam.o sit.o sounds.o sp_lev.o spell.o \
sys.o \
@@ -603,6 +603,8 @@ random.o: ../sys/share/random.c $(HACK_H)
$(CC) $(CFLAGS) -c ../sys/share/random.c
ioctl.o: ../sys/share/ioctl.c $(HACK_H) ../include/tcap.h
$(CC) $(CFLAGS) -c ../sys/share/ioctl.c
posixregex.o: ../sys/share/posixregex.c $(HACK_H)
$(CC) $(CFLAGS) -c ../sys/share/posixregex.c
unixtty.o: ../sys/share/unixtty.c $(HACK_H)
$(CC) $(CFLAGS) -c ../sys/share/unixtty.c
unixmain.o: ../sys/unix/unixmain.c $(HACK_H) ../include/dlb.h
+2 -2
View File
@@ -1,5 +1,5 @@
# NetHack Makefile.
# NetHack 3.5 Makefile.top $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$
# NetHack 3.5 Makefile.top $NHDT-Date: 1428453876 2015/04/08 00:44:36 $ $NHDT-Branch: nhmall-booktribute $:$NHDT-Revision: 1.25 $
# NetHack 3.5 Makefile.top $Date: 2012/01/10 17:47:30 $ $Revision: 1.19 $
# Root of source tree:
@@ -87,7 +87,7 @@ SPEC_LEVS = asmodeus.lev baalz.lev bigrm-*.lev castle.lev fakewiz?.lev \
QUEST_LEVS = ???-goal.lev ???-fil?.lev ???-loca.lev ???-strt.lev
DATNODLB = $(VARDATND) license
DATDLB = $(DATHELP) dungeon $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD)
DATDLB = $(DATHELP) dungeon tribute $(SPEC_LEVS) $(QUEST_LEVS) $(VARDATD)
DAT = $(DATNODLB) $(DATDLB)
$(GAME):
+3
View File
@@ -35,6 +35,9 @@ MAXPLAYERS=10
# Uncomment the next line to disable the SEDUCE option.
#SEDUCE=0
# Uncomment to disable savefile UID checking.
#CHECK_SAVE_UID=0
# Record (high score) file options.
# CAUTION: changing these after people have started playing games can
# lead to lost high scores!
+10 -4
View File
@@ -1,4 +1,4 @@
# NetHack 3.5 Makefile.msc $NHDT-Date: 1426967393 2015/03/21 19:49:53 $ $NHDT-Branch: master $:$NHDT-Revision: 1.72 $ */
# NetHack 3.5 Makefile.msc $NHDT-Date: 1428855415 2015/04/12 16:16:55 $ $NHDT-Branch: master $:$NHDT-Revision: 1.80 $ */
# Copyright (c) NetHack PC Development Team 1993-2015
#
#==============================================================================
@@ -403,6 +403,9 @@ DLB =
{$(SSYS)}.c{$(OBJ)}.o:
@$(CC) $(cflagsUtil) -Fo$@ $<
{$(SSYS)}.cpp{$(OBJ)}.o:
@$(CC) $(cflagsUtil) -Fo$@ $<
#==========================================
# Rules for files in sys\winnt
#==========================================
@@ -528,9 +531,10 @@ VOBJ24 = $(O)track.o $(O)trap.o $(O)u_init.o $(O)uhitm.o
VOBJ25 = $(O)vault.o $(O)vis_tab.o $(O)vision.o $(O)weapon.o
VOBJ26 = $(O)were.o $(O)wield.o $(O)windows.o $(O)wizard.o
VOBJ27 = $(O)worm.o $(O)worn.o $(O)write.o $(O)zap.o
DLBOBJ = $(O)dlb.o
REGEX = $(O)cppregex.o
TTYOBJ = $(O)topl.o $(O)getline.o $(O)wintty.o
SOBJ = $(O)winnt.o $(O)pcsys.o $(O)pcunix.o \
@@ -541,7 +545,7 @@ OBJS = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \
$(VOBJ11) $(VOBJ12) $(VOBJ13) $(VOBJ14) $(VOBJ15) \
$(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \
$(VOBJ21) $(VOBJ22) $(VOBJ23) $(VOBJ24) $(VOBJ25) \
$(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29)
$(VOBJ26) $(VOBJ27) $(VOBJ28) $(VOBJ29) $(REGEX)
WINPOBJ = $(WINPORT)
@@ -622,6 +626,7 @@ all : install
install: envchk $(GAME) $(O)install.tag
@echo Done.
$(O)install.tag: $(DAT)\data $(DAT)\rumors $(DAT)\dungeon \
$(DAT)\oracles $(DAT)\quest.dat $(O)sp_lev.tag $(DLB)
! IF ("$(USE_DLB)"=="Y")
@@ -1042,7 +1047,7 @@ $(DAT)\porthelp: $(MSWSYS)\porthelp
nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \
$(DAT)\quest.dat $(DAT)\rumors $(DAT)\help $(DAT)\hh $(DAT)\cmdhelp \
$(DAT)\history $(DAT)\opthelp $(DAT)\wizhelp $(DAT)\dungeon $(DAT)\porthelp \
$(DAT)\license $(DAT)\engrave $(DAT)\epitaph $(DAT)\bogusmon $(O)sp_lev.tag
$(DAT)\license $(DAT)\engrave $(DAT)\epitaph $(DAT)\bogusmon $(DAT)\tribute $(O)sp_lev.tag
cd $(DAT)
echo data >dlb.lst
echo oracles >>dlb.lst
@@ -1055,6 +1060,7 @@ nhdat: $(U)dlb_main.exe $(DAT)\data $(DAT)\oracles $(OPTIONS_FILE) \
echo engrave >>dlb.lst
echo epitaph >>dlb.lst
echo bogusmon >>dlb.lst
echo tribute >>dlb.lst
echo help >>dlb.lst
echo hh >>dlb.lst
echo cmdhelp >>dlb.lst
+1
View File
@@ -8,5 +8,6 @@ lev_yacc.c
tile2x11
lev_comp
tileedit
tile2bmp
dlb
recover
+1 -1
View File
@@ -112,7 +112,7 @@ FILE *orig_yyin = NULL;
map_cnt = 0;
return MAP_ID;
}
<MAPC>[-|}{+xABCISHKMPLWTtFYU\\#. 0123456789]*\r?\n {
<MAPC>[-|}{+xABCISHKPLWTF\\#. 0123456789]*\r?\n {
int len = yyleng;
savetoken(yytext);
/* convert \r\n to \n */
+4 -4
View File
@@ -1186,15 +1186,15 @@ char c;
case 'H' : return(SCORR);
case '{' : return(FOUNTAIN);
case '\\' : return(THRONE);
case 'K' :
return(SINK);
case 'K' : return(SINK);
case '}' : return(MOAT);
case 'P' : return(POOL);
case 'L' : return(LAVAPOOL);
case 'I' : return(ICE);
case 'W' : return(WATER);
case 'T' : return (TREE);
case 'F' : return (IRONBARS); /* Fe = iron */
case 'T' : return (TREE);
case 'F' : return (IRONBARS); /* Fe = iron */
case 'x' : return(MAX_TYPE); /* "see-through" */
}
return(INVALID_TYPE);
}
+19 -12
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 winmenu.c $NHDT-Date: 1427881480 2015/04/01 09:44:40 $ $NHDT-Branch: master $:$NHDT-Revision: 1.5 $ */
/* NetHack 3.5 winmenu.c $NHDT-Date: 1428828477 2015/04/12 08:47:57 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */
/* NetHack 3.5 winmenu.c $Date: 2009/05/06 10:55:53 $ $Revision: 1.5 $ */
/* SCCS Id: @(#)winmenu.c 3.5 1996/08/15 */
/* Copyright (c) Dean Luick, 1992 */
@@ -249,9 +249,13 @@ menu_key(w, event, params, num_params)
return;
} else if (ch == MENU_SEARCH) { /* search */
if (menu_info->how == PICK_ANY || menu_info->how == PICK_ONE) {
char buf[BUFSZ];
X11_getlin("Search for:", buf);
if (!*buf || *buf == '\033') return;
char buf[BUFSZ+2], tmpbuf[BUFSZ];
X11_getlin("Search for:", tmpbuf);
if (!*tmpbuf || *tmpbuf == '\033') return;
/* convert "string" into "*string*" for use with pmatch() */
Sprintf(buf, "*%s*", tmpbuf);
if (menu_info->how == PICK_ANY) {
invert_match(wp, buf);
return;
@@ -395,10 +399,12 @@ menu_search(w, client_data, call_data)
{
struct xwindow *wp = (struct xwindow *) client_data;
struct menu_info_t *menu_info = wp->menu_information;
char buf[BUFSZ+2], tmpbuf[BUFSZ];
char buf[BUFSZ];
X11_getlin("Search for:", buf);
if (!*buf || *buf == '\033') return;
X11_getlin("Search for:", tmpbuf);
if (!*tmpbuf || *tmpbuf == '\033') return;
/* convert "string" into "*string*" for use with pmatch() */
Sprintf(buf, "*%s*", tmpbuf);
if (menu_info->how == PICK_ANY)
invert_match(wp, buf);
@@ -479,7 +485,7 @@ invert_all(wp)
static void
invert_match(wp, match)
struct xwindow *wp;
char *match;
char *match; /* wildcard pattern for pmatch() */
{
x11_menu_item *curr;
int count;
@@ -488,7 +494,7 @@ invert_match(wp, match)
reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++)
if (curr->identifier.a_void != 0 && strstri(curr->str, match)) {
if (curr->identifier.a_void != 0 && pmatchi(match, curr->str)) {
invert_line(wp, curr, count, -1L);
changed = TRUE;
}
@@ -503,7 +509,7 @@ invert_match(wp, match)
static void
select_match(wp, match)
struct xwindow *wp;
char *match;
char *match; /* wildcard pattern for pmatch() */
{
x11_menu_item *curr;
int count;
@@ -511,11 +517,12 @@ select_match(wp, match)
reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++)
if (curr->identifier.a_void != 0 && strstri(curr->str, match)) {
if (curr->identifier.a_void != 0 && pmatchi(match, curr->str)) {
if (!curr->selected) {
invert_line(wp, curr, count, -1L);
#ifndef USE_FWF
XawListChange(wp->w, wp->menu_information->curr_menu.list_pointer,
XawListChange(wp->w,
wp->menu_information->curr_menu.list_pointer,
0, 0, True);
#endif
}
+282 -187
View File
File diff suppressed because it is too large Load Diff
+87
View File
@@ -0,0 +1,87 @@
#!/bin/perl
#
# $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$
# $Date: 2002/01/05 21:06:02 $ $Revision: 1.1 $
#
sub bail($);
use Getopt::Std;
# TODO: switch to Getopt::Long so we can parse normal arguments too
$Getopt::Std::STANDARD_HELP_VERSION = TRUE;
$main::VERSION = 1.0;
my %commands = (
'd' => 'debug mode; parse objects.txt to stdout instead of updating',
);
getopts(join('', keys(%commands)));
my $debug = (defined($opt_d) && $opt_d == 1);
my $tilecount = 0;
my $outfile = $debug ? "-" : "objects.txt";
my $infile = $debug ? "objects.txt" : "objects.bak";
unless ($debug) {
if (-e "$infile") { die "something didn't clean up objects.bak from last time; stopping\n"; }
rename($outfile,$infile) or die "couldn't move objects.txt to objects.bak; stopping\n";
}
open(INFILE, "<$infile") or bail("couldn't open $infile; bailing");
open(OUTFILE, ">$outfile") or bail("couldn't open $outfile; bailing");
while (my $line = <INFILE>)
{
if (my ($tiletext) = $line =~ /^# tile \d+ (.*)/)
{
$line = "# tile $tilecount $tiletext\n";
$tilecount++;
}
print OUTFILE $line;
}
close(INFILE);
close(OUTFILE);
unless ($debug) { unlink $infile; }
exit;
sub main::HELP_MESSAGE()
{
print <<"STARTHELP";
Usage: renumtiles.pl [OPTIONS] <textfile>
STARTHELP
foreach $cmd (keys(%commands)) {
printf("%10s %s\n", '-'.$cmd, $commands{$cmd});
}
print <<"ENDHELP";
\t--help display this help message and exit
\t--version display version and exit
ENDHELP
exit;
}
sub main::VERSION_MESSAGE()
{
my ($objglob, $optpackage, $ver, $switches) = @_;
print <<"STARTHELP";
renumtiles $ver -- tile-renumbering utility for NetHack
STARTHELP
}
sub bail($)
{
unless ($debug) {
unlink $outfile;
rename ($infile,$outfile);
}
shift;
die "$_\n";
}
+8 -4
View File
@@ -1,4 +1,4 @@
/* NetHack 3.5 wintty.c $NHDT-Date: 1428394244 2015/04/07 08:10:44 $ $NHDT-Branch: master $:$NHDT-Revision: 1.84 $ */
/* NetHack 3.5 wintty.c $NHDT-Date: 1428828474 2015/04/12 08:47:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.85 $ */
/* NetHack 3.5 wintty.c $Date: 2012/01/22 06:27:09 $ $Revision: 1.66 $ */
/* Copyright (c) David Cohrs, 1991 */
/* NetHack may be freely redistributed. See license for details. */
@@ -1664,20 +1664,24 @@ struct WinDesc *cw;
tty_nhbell();
break;
} else {
char searchbuf[BUFSZ], tmpbuf[BUFSZ];
char searchbuf[BUFSZ+2], tmpbuf[BUFSZ];
boolean on_curr_page = FALSE;
int lineno = 0;
tty_getlin("Search for:", tmpbuf);
if (!tmpbuf[0] || tmpbuf[0] == '\033') break;
Sprintf(searchbuf, "*%s*", tmpbuf);
for (curr = cw->mlist; curr; curr = curr->next) {
if (on_curr_page) lineno++;
if (curr == page_start)
on_curr_page = TRUE;
else if (curr == page_end)
on_curr_page = FALSE;
if (curr->identifier.a_void && pmatch(searchbuf, curr->str)) {
toggle_menu_curr(window, curr, lineno, on_curr_page, counting, count);
if (curr->identifier.a_void
&& pmatchi(searchbuf, curr->str)) {
toggle_menu_curr(window, curr, lineno,
on_curr_page, counting, count);
if (cw->how == PICK_ONE) {
finished = TRUE;
break;
+11 -1
View File
@@ -636,6 +636,16 @@ copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="..\sys\share\cppregex.cpp">
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="..\win\tty\getline.c">
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
@@ -1776,4 +1786,4 @@ copy ..\sys\winnt\defaults.nh ..\binary\defaults.nh
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>