Merge branch 'master' of https://rodney.nethack.org:20040/git/NHsource
This commit is contained in:
+1
-1
@@ -4,7 +4,7 @@ TAGS
|
||||
.make.state
|
||||
.nse_depinfo
|
||||
*~
|
||||
#*
|
||||
\#*
|
||||
.#*
|
||||
,*
|
||||
_$*
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -9,6 +9,7 @@ bogusmon
|
||||
engrave
|
||||
epitaph
|
||||
x11tiles
|
||||
nhtiles.bmp
|
||||
*.lev
|
||||
spec_levs
|
||||
quest_levs
|
||||
|
||||
+11
-11
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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.
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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
@@ -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));
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -35,6 +35,7 @@ struct sysopt {
|
||||
# endif
|
||||
#endif
|
||||
int seduce;
|
||||
int check_save_uid; /* restoring savefile checks UID? */
|
||||
};
|
||||
|
||||
extern struct sysopt sysopt;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
+58
-1
@@ -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*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1929
-1914
File diff suppressed because it is too large
Load Diff
+58
-14
@@ -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
File diff suppressed because it is too large
Load Diff
+12
-1
@@ -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
@@ -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:
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
+7
-42
@@ -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
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
@@ -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
@@ -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))
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1228
-1126
File diff suppressed because it is too large
Load Diff
+441
-414
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -8,5 +8,6 @@ lev_yacc.c
|
||||
tile2x11
|
||||
lev_comp
|
||||
tileedit
|
||||
tile2bmp
|
||||
dlb
|
||||
recover
|
||||
|
||||
+1
-1
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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;
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user