pull/3/head
			
			
		
		
							parent
							
								
									cc4a231803
								
							
						
					
					
						commit
						f15289d512
					
				@ -0,0 +1,64 @@
 | 
				
			||||
---
 | 
				
			||||
Language:        Cpp
 | 
				
			||||
# BasedOnStyle:  LLVM
 | 
				
			||||
AccessModifierOffset: -2
 | 
				
			||||
AlignAfterOpenBracket: true
 | 
				
			||||
AlignEscapedNewlinesLeft: true
 | 
				
			||||
AlignOperands:   true
 | 
				
			||||
AlignTrailingComments: true
 | 
				
			||||
AllowAllParametersOfDeclarationOnNextLine: false
 | 
				
			||||
AllowShortBlocksOnASingleLine: false
 | 
				
			||||
AllowShortCaseLabelsOnASingleLine: false
 | 
				
			||||
AllowShortIfStatementsOnASingleLine: false
 | 
				
			||||
AllowShortLoopsOnASingleLine: false
 | 
				
			||||
AllowShortFunctionsOnASingleLine: None
 | 
				
			||||
AlwaysBreakAfterDefinitionReturnType: true
 | 
				
			||||
AlwaysBreakTemplateDeclarations: false
 | 
				
			||||
AlwaysBreakBeforeMultilineStrings: false
 | 
				
			||||
BreakBeforeBinaryOperators: NonAssignment
 | 
				
			||||
BreakBeforeTernaryOperators: true
 | 
				
			||||
BreakConstructorInitializersBeforeComma: false
 | 
				
			||||
BinPackParameters: true
 | 
				
			||||
BinPackArguments: true
 | 
				
			||||
ColumnLimit:     78
 | 
				
			||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
 | 
				
			||||
ConstructorInitializerIndentWidth: 4
 | 
				
			||||
DerivePointerAlignment: false
 | 
				
			||||
ExperimentalAutoDetectBinPacking: false
 | 
				
			||||
IndentCaseLabels: false
 | 
				
			||||
IndentWrappedFunctionNames: false
 | 
				
			||||
IndentFunctionDeclarationAfterType: false
 | 
				
			||||
MaxEmptyLinesToKeep: 1
 | 
				
			||||
KeepEmptyLinesAtTheStartOfBlocks: false
 | 
				
			||||
NamespaceIndentation: None
 | 
				
			||||
ObjCBlockIndentWidth: 2
 | 
				
			||||
ObjCSpaceAfterProperty: false
 | 
				
			||||
ObjCSpaceBeforeProtocolList: true
 | 
				
			||||
PenaltyBreakBeforeFirstCallParameter: 19
 | 
				
			||||
PenaltyBreakComment: 300
 | 
				
			||||
PenaltyBreakString: 1000
 | 
				
			||||
PenaltyBreakFirstLessLess: 120
 | 
				
			||||
PenaltyExcessCharacter: 1000000
 | 
				
			||||
PenaltyReturnTypeOnItsOwnLine: 100
 | 
				
			||||
PointerAlignment: Right
 | 
				
			||||
SpacesBeforeTrailingComments: 1
 | 
				
			||||
Cpp11BracedListStyle: false
 | 
				
			||||
Standard:        Cpp03
 | 
				
			||||
IndentWidth:     4
 | 
				
			||||
TabWidth:        8
 | 
				
			||||
UseTab:          Never
 | 
				
			||||
BreakBeforeBraces: Linux
 | 
				
			||||
SpacesInParentheses: false
 | 
				
			||||
SpacesInSquareBrackets: false
 | 
				
			||||
SpacesInAngles:  false
 | 
				
			||||
SpaceInEmptyParentheses: false
 | 
				
			||||
SpacesInCStyleCastParentheses: false
 | 
				
			||||
SpaceAfterCStyleCast: true
 | 
				
			||||
SpacesInContainerLiterals: true
 | 
				
			||||
SpaceBeforeAssignmentOperators: true
 | 
				
			||||
ContinuationIndentWidth: 4
 | 
				
			||||
CommentPragmas:  '^ NetHack 3'
 | 
				
			||||
ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
 | 
				
			||||
SpaceBeforeParens: ControlStatements
 | 
				
			||||
DisableFormat:   false
 | 
				
			||||
...
 | 
				
			||||
@ -0,0 +1,17 @@
 | 
				
			||||
*.[ch] NHSUBST
 | 
				
			||||
*.cpp NHSUBST
 | 
				
			||||
*.sh NHSUBST
 | 
				
			||||
*.pl NHSUBST
 | 
				
			||||
Porting NHSUBST
 | 
				
			||||
README NHSUBST
 | 
				
			||||
* text=auto
 | 
				
			||||
*.hqx -text
 | 
				
			||||
*.sln -text
 | 
				
			||||
*.vcxproj -text
 | 
				
			||||
*.doc !diff
 | 
				
			||||
*.DOC !diff
 | 
				
			||||
*.uu NH_header=no
 | 
				
			||||
*.xpm NH_header=no
 | 
				
			||||
.git* NH_header=no
 | 
				
			||||
* NH_filestag=(file%s_in_top_directory)
 | 
				
			||||
NetHack.dsw NH_filestag=(file%s_for_win32_that_are_moved_into_._at_compile_time)
 | 
				
			||||
@ -0,0 +1,93 @@
 | 
				
			||||
# CVS default ignores begin
 | 
				
			||||
tags
 | 
				
			||||
TAGS
 | 
				
			||||
.make.state
 | 
				
			||||
.nse_depinfo
 | 
				
			||||
*~
 | 
				
			||||
\#*
 | 
				
			||||
.#*
 | 
				
			||||
,*
 | 
				
			||||
_$*
 | 
				
			||||
*$
 | 
				
			||||
*.old
 | 
				
			||||
*.bak
 | 
				
			||||
*.BAK
 | 
				
			||||
*.orig
 | 
				
			||||
*.rej
 | 
				
			||||
.del-*
 | 
				
			||||
*.a
 | 
				
			||||
*.olb
 | 
				
			||||
*.o
 | 
				
			||||
*.obj
 | 
				
			||||
*.so
 | 
				
			||||
*.exe
 | 
				
			||||
*.Z
 | 
				
			||||
*.elc
 | 
				
			||||
*.ln
 | 
				
			||||
core
 | 
				
			||||
# CVS default ignores end
 | 
				
			||||
.*.swp
 | 
				
			||||
 | 
				
			||||
# We generate makefiles by shell script
 | 
				
			||||
Makefile
 | 
				
			||||
 | 
				
			||||
# Win32-specific ignores
 | 
				
			||||
Debug/
 | 
				
			||||
Release/
 | 
				
			||||
binary/
 | 
				
			||||
build/
 | 
				
			||||
ipch/
 | 
				
			||||
lib/*
 | 
				
			||||
Nethack.sln
 | 
				
			||||
Nethack.sdf
 | 
				
			||||
Nethack.opensdf
 | 
				
			||||
Makefile.bcc
 | 
				
			||||
Makefile.gcc
 | 
				
			||||
Makefile-orig
 | 
				
			||||
Makefile.bcc-orig
 | 
				
			||||
Makefile.gcc-orig
 | 
				
			||||
*.suo
 | 
				
			||||
*.pdb
 | 
				
			||||
*.ilk
 | 
				
			||||
# VS2013 extension to auto-whine about questionable code generates these
 | 
				
			||||
*.lastcodeanalysissucceeded
 | 
				
			||||
# VS 2017 caches data into the hidden directory .vs
 | 
				
			||||
.vs
 | 
				
			||||
# Win32-specific ignores end
 | 
				
			||||
.DS_Store
 | 
				
			||||
# ms-dos 
 | 
				
			||||
# resulting zip
 | 
				
			||||
NH*DOS.ZIP
 | 
				
			||||
# 8.3 versions
 | 
				
			||||
dat/data.bas
 | 
				
			||||
sys/share/posixreg.c
 | 
				
			||||
include/patchlev.h
 | 
				
			||||
doc/guidebk.txt
 | 
				
			||||
# folders compiler, target objs, binary results
 | 
				
			||||
djgpp/
 | 
				
			||||
src/msdos_o/
 | 
				
			||||
msdos-binary/
 | 
				
			||||
dat/NHTILES.BMP
 | 
				
			||||
dat/msdoshlp.txt
 | 
				
			||||
src/host_o/
 | 
				
			||||
util/djgpp-linux64-gcc550.tar.bz2
 | 
				
			||||
util/djgpp-osx-gcc550.tar.bz2
 | 
				
			||||
util/djgpp-mingw-gcc550-standalone.zip
 | 
				
			||||
util/dlb_main
 | 
				
			||||
util/thintile
 | 
				
			||||
util/til2bin2
 | 
				
			||||
util/tile2bin
 | 
				
			||||
win/share/monthin.txt
 | 
				
			||||
win/share/objthin.txt
 | 
				
			||||
win/share/oththin.txt
 | 
				
			||||
# end of ms-dos
 | 
				
			||||
 | 
				
			||||
#libnethack
 | 
				
			||||
targets/*
 | 
				
			||||
bundle/*
 | 
				
			||||
#test.js
 | 
				
			||||
#sys/lib/npm-package/build/nethack.js
 | 
				
			||||
#sys/lib/npm-package/build/nethack.wasm
 | 
				
			||||
*.user
 | 
				
			||||
util/*.lib
 | 
				
			||||
util/*.exp
 | 
				
			||||
@ -0,0 +1,9 @@
 | 
				
			||||
[submodule "submodules/lua"]
 | 
				
			||||
	path = submodules/lua
 | 
				
			||||
	url = https://github.com/lua/lua.git
 | 
				
			||||
[submodule "submodules/pdcurses"]
 | 
				
			||||
	path = submodules/pdcurses
 | 
				
			||||
	url = https://github.com/wmcbrine/PDCurses.git
 | 
				
			||||
[submodule "submodules/pdcursesmod"]
 | 
				
			||||
	path = submodules/pdcursesmod
 | 
				
			||||
	url = https://github.com/Bill-Gray/PDCursesMod.git
 | 
				
			||||
@ -0,0 +1,696 @@
 | 
				
			||||
Cross-compiling NetHack 3.7 Last edit: February 18, 2023
 | 
				
			||||
 | 
				
			||||
The NetHack 3.7 build process differs from the build process of previous
 | 
				
			||||
versions in some important ways. Those differences make it possible to use
 | 
				
			||||
a cross-compiler running on one platform (the "host" platform of the build)
 | 
				
			||||
to produce a binary NetHack package that can execute on an entirely different
 | 
				
			||||
platform.
 | 
				
			||||
 | 
				
			||||
Part A Contents:
 | 
				
			||||
    A1. Why cross-compile?
 | 
				
			||||
    A2. Building NetHack 3.6 (before)
 | 
				
			||||
    A3. Building NetHack 3.7 (going forward)
 | 
				
			||||
    A4. How was the build procedure reduced to 5 steps?
 | 
				
			||||
    A5. How can I help with the cross-compiling initiative?
 | 
				
			||||
 | 
				
			||||
Part B Contents:
 | 
				
			||||
    B1. Two sets of compiles and procedures
 | 
				
			||||
    B2. What needs to be built and executed on the HOST?
 | 
				
			||||
    B3. What needs to be built for the TARGET?
 | 
				
			||||
    B4. Case sample: msdos
 | 
				
			||||
    B5. Case sample: amiga (started but incomplete)
 | 
				
			||||
    B6. Case sample: Web Assembly, libnh
 | 
				
			||||
 | 
				
			||||
--------------------------------------------------------------------------------
 | 
				
			||||
 Part A - Cross-compiling NetHack
 | 
				
			||||
--------------------------------------------------------------------------------
 | 
				
			||||
 | 
				
			||||
  +--------------------------+
 | 
				
			||||
  | A1. Why cross-compile?   |
 | 
				
			||||
  +--------------------------+
 | 
				
			||||
 | 
				
			||||
By using cross-compilers on host platforms with fast processors, plenty of RAM
 | 
				
			||||
and storage resources, and an available cross-compiler, it may be possible to
 | 
				
			||||
keep or resurrect a working version of NetHack on platforms that are now too
 | 
				
			||||
constrained to carry out the build process natively on the platform anymore.
 | 
				
			||||
 | 
				
			||||
Some of the constraints in carrying out a native build on the desired target
 | 
				
			||||
may include, but not necessarily be limited to, any of the following:
 | 
				
			||||
 | 
				
			||||
  o Access: Somebody with a working knowledge of the NetHack build process may
 | 
				
			||||
    not have the desired target build platform available to them. Conversely,
 | 
				
			||||
    somebody with a keen knowledge of the target platform, and access to it,
 | 
				
			||||
    may not be all that familiar with the NetHack build process.
 | 
				
			||||
 | 
				
			||||
  o Resources: Address space limitations, insufficient RAM, low amounts of disk
 | 
				
			||||
    storage, slow processor performance, may impede the ability to execute the
 | 
				
			||||
    compile process on the target platform.
 | 
				
			||||
 | 
				
			||||
  o Compilers: Some of the native compilers on historical platforms may only
 | 
				
			||||
    support the dialect of C that was popular when the platform and compiler
 | 
				
			||||
    were in their prime.
 | 
				
			||||
 | 
				
			||||
Another useful potential result of cross-compiling, is that it paves the way
 | 
				
			||||
for carrying out test and production builds of NetHack for multiple target
 | 
				
			||||
platforms through automated steps carried out on the host platform(s).
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  +-------------------------------------+
 | 
				
			||||
  | A2. Building NetHack 3.6 (before)   |
 | 
				
			||||
  +-------------------------------------+
 | 
				
			||||
 | 
				
			||||
Very generally, the build of NetHack in past versions required the following
 | 
				
			||||
steps to be carried out:
 | 
				
			||||
 | 
				
			||||
    1. Compile and link util/makedefs.
 | 
				
			||||
    2. Run makedefs repeatedly with different command line options to produce
 | 
				
			||||
       several output files that are required for:
 | 
				
			||||
        (a) additional build steps to follow, including some header
 | 
				
			||||
            files: pm.h, onames.h, date.h.
 | 
				
			||||
        (b) creation of files, containing information required by,
 | 
				
			||||
            or about the game during its execution, that are stored in a
 | 
				
			||||
            portable, platform-independent way, that need to be inserted
 | 
				
			||||
            into the game package.
 | 
				
			||||
        (c) creation of files containing information required by, or about
 | 
				
			||||
            the game during its execution, that are stored in an architecture
 | 
				
			||||
            and/or platform and/or operating system dependent way, that need
 | 
				
			||||
            to be inserted into the game package (the quest text format is
 | 
				
			||||
            one example).
 | 
				
			||||
    3. Compile and link the level compiler. This step needs to execute
 | 
				
			||||
       work-alike tools to lex and yacc, or needs to build pre-built lex and
 | 
				
			||||
       yacc output (.c, .h files) that are provided in the sys/share part of
 | 
				
			||||
       the NetHack source code tree.
 | 
				
			||||
    4. Execute the level compiler to read dat/*.des files and create
 | 
				
			||||
       a set of binary output files that are architecture and/or operating
 | 
				
			||||
       system dependent on the build platform, for use by the game during
 | 
				
			||||
       its execution.
 | 
				
			||||
    5. Compile and link the dungeon compiler. Like the level compiler, this
 | 
				
			||||
       step needs to execute work-alike tools to lex and yacc, or needs to
 | 
				
			||||
       build pre-built lex and yacc output (.c, .h files) that are provided
 | 
				
			||||
       in the sys/share part of the NetHack source code tree.
 | 
				
			||||
    6. Execute the dungeon compiler to read dat/dungeon.def and create
 | 
				
			||||
       a set of binary output files that are architecture and/or operating
 | 
				
			||||
       system dependent on the build platform, for use by the game during
 | 
				
			||||
       its execution.
 | 
				
			||||
    7. Compile and link several less critical utilities such as uudecode,
 | 
				
			||||
       tile-generation utilities, and so forth, all of which need to execute
 | 
				
			||||
       on the build platform during the build process to produce output files
 | 
				
			||||
       for use during the game, that are reasonably portable (not architecture
 | 
				
			||||
       and/or operating system dependent; only the output of the utilities
 | 
				
			||||
       becomes part of the game package, not the executable utilities
 | 
				
			||||
       themselves.
 | 
				
			||||
    8. Compile and link the game itself.
 | 
				
			||||
    9. Package the game and its required files including the output from
 | 
				
			||||
       previous steps 2b, 2c, 4, 6, 7 and 8 above.
 | 
				
			||||
 | 
				
			||||
Steps 1, 2a, 2b, 7, and 9 above are not impediments to cross-compiling NetHack.
 | 
				
			||||
 | 
				
			||||
Steps 2c, 3, 4, 5, 6 and 8 above are impediments to cross-compiling NetHack.
 | 
				
			||||
 | 
				
			||||
That's because the files that those steps produce are very much tied to the
 | 
				
			||||
platform where the build of NetHack is being carried out. Variations between
 | 
				
			||||
platforms (such as 32-bit vs 64-bit, integer sizes, pointer sizes, processor
 | 
				
			||||
byte order, data alignment requirements, struct padding and the way bitfields
 | 
				
			||||
are stored) impact the portability of those data files between different
 | 
				
			||||
platforms and operating systems. If all those things happen to match, the files
 | 
				
			||||
might, just might, be usable across platforms, but the chances are against it,
 | 
				
			||||
and that certainly cannot be counted on.
 | 
				
			||||
 | 
				
			||||
  +------------------------------------------+
 | 
				
			||||
  | A3. Building NetHack 3.7 (going forward) |
 | 
				
			||||
  +------------------------------------------+
 | 
				
			||||
 | 
				
			||||
Again, very generally, the build of NetHack in 3.7 requires the following
 | 
				
			||||
steps to be carried out:
 | 
				
			||||
 | 
				
			||||
    1. Compile and link util/makedefs.
 | 
				
			||||
    2. Run makedefs repeatedly with different command line options to produce
 | 
				
			||||
       several required output files that contain information required by the
 | 
				
			||||
       game, or contain information about the game during its execution, that
 | 
				
			||||
       are stored in a portable, platform-independent way, that need to be
 | 
				
			||||
       inserted into the game package (makedefs -d, -o, -r, -h, -s).
 | 
				
			||||
    3. Compile and link several less critical utilities such as uudecode,
 | 
				
			||||
       tile-generation utilities, and so forth, all of which need to execute
 | 
				
			||||
       on the build platform during the build process to produce output files
 | 
				
			||||
       for use during the game, that are reasonably portable (not architecture
 | 
				
			||||
       and/or operating system dependent; only the output of the utilities
 | 
				
			||||
       becomes part of the game package, not the executable utilities
 | 
				
			||||
       themselves.
 | 
				
			||||
    4. Compile and link the game components for the TARGET; that includes
 | 
				
			||||
       NetHack itself, Lua, and any optional regular-expression or window port
 | 
				
			||||
       libraries that you plan to link into the NetHack game executable.
 | 
				
			||||
    5. Package the game and its required files including the output from
 | 
				
			||||
       previous steps 2, 3 and 4 above.
 | 
				
			||||
 | 
				
			||||
Step 4 is now the only impediment to cross-compiling NetHack. That impediment
 | 
				
			||||
is resolved by executing step 4 using a cross-compiler that runs on the build (host)
 | 
				
			||||
platform to produce a resulting binary for the target platform, instead of
 | 
				
			||||
executing the native compiler.
 | 
				
			||||
 | 
				
			||||
  +-----------------------------------------------------+
 | 
				
			||||
  | A4. How was the build procedure reduced to 5 steps? |
 | 
				
			||||
  +-----------------------------------------------------+
 | 
				
			||||
 | 
				
			||||
The following are among several design changes planned in NetHack 3.7,
 | 
				
			||||
and these specific changes are what altered the build process to make
 | 
				
			||||
cross-compiling possible:
 | 
				
			||||
 | 
				
			||||
    o  There is no creation of platform-dependent files, such as the quest
 | 
				
			||||
       text files, by makedefs during the build process. Instead, the quest
 | 
				
			||||
       text files have been converted to Lua and are inserted into the game
 | 
				
			||||
       package for processing by the embedded Lua during execution of NetHack.
 | 
				
			||||
 | 
				
			||||
    o  There is no build-time level compiler involved. Instead, the level
 | 
				
			||||
       descriptions have been converted to Lua and are inserted into the game
 | 
				
			||||
       package for processing by the embedded Lua during execution of NetHack.
 | 
				
			||||
 | 
				
			||||
    o  There is no build-time dungeon compiler involved. Instead, the dungeon
 | 
				
			||||
       description has been converted to Lua and is inserted into the game
 | 
				
			||||
       package for processing by the embedded Lua during execution of NetHack.
 | 
				
			||||
 | 
				
			||||
    o  Some of the build and option information that was formerly produced
 | 
				
			||||
       during build time by makedefs, and contained information about the
 | 
				
			||||
       build-platform specifically, is now produced at runtime within the
 | 
				
			||||
       game under a cross-compiled build. As such, it now produces information
 | 
				
			||||
       applicable to the target NetHack environment, not the build environment.
 | 
				
			||||
 | 
				
			||||
  +------------------------------------------------------------+
 | 
				
			||||
  | A5. How can I help with the cross-compiling initiative?    |
 | 
				
			||||
  +------------------------------------------------------------+
 | 
				
			||||
 | 
				
			||||
    o  If you have a favourite target platform (let's call it XX-Platform for
 | 
				
			||||
       example purposes) that you'd like to see NetHack be able to run on, do
 | 
				
			||||
       some research to find out if a cross-compiler exists that:
 | 
				
			||||
           - produces output for XX-Platform.
 | 
				
			||||
           - executes on a platform that you use and love (Linux, Windows,
 | 
				
			||||
             macOS are some examples of platforms that have cross-compilers
 | 
				
			||||
             for other targets available)
 | 
				
			||||
 | 
				
			||||
    o  Then, make the community, devteam, and others aware that you're starting
 | 
				
			||||
       a cross-compile of NetHack for XX-Platform. You might need to ask some
 | 
				
			||||
       "starting out" questions initially, and as you get deeper into it, you
 | 
				
			||||
       might need to ask some tougher questions.
 | 
				
			||||
 | 
				
			||||
    o  Perhaps consider forking from NetHack on GitHub, and do the
 | 
				
			||||
       cross-compiler work there in your fork. Strive to get it to a point where
 | 
				
			||||
       it's ready to play-test on XX-Platform, or perhaps even use an emulator
 | 
				
			||||
       of XX-Platform if one is available. We live in a time where plenty do.
 | 
				
			||||
 | 
				
			||||
       Doing your work on a GitHub fork has the following advantages:
 | 
				
			||||
           - It will make it really simple to integrate your work back into
 | 
				
			||||
             the NetHack source tree if that's one of your goals.
 | 
				
			||||
           - It will make it possible and straightforward to merge upstream
 | 
				
			||||
             NetHack changes into your work for the XX-Platform cross-compile
 | 
				
			||||
             so that it stays current with the game as it evolves.
 | 
				
			||||
           - You may get help from others in the form of suggestions, or
 | 
				
			||||
             pull-requests, or offers to join the development. Chances are,
 | 
				
			||||
             you aren't the only person out there that would like to
 | 
				
			||||
             establish/resurrect/maintain NetHack on XX-Platform.
 | 
				
			||||
 | 
				
			||||
       Have fun!
 | 
				
			||||
 | 
				
			||||
-----------------------------------------------------------------------------
 | 
				
			||||
 Part B - Cross-compiling details
 | 
				
			||||
-----------------------------------------------------------------------------
 | 
				
			||||
 | 
				
			||||
Part B Contents:
 | 
				
			||||
    B1. Two sets of compiles and procedures
 | 
				
			||||
    B2. What needs to be built and executed on the HOST?
 | 
				
			||||
    B3. What needs to be built for the TARGET?
 | 
				
			||||
    B4. Case sample: msdos
 | 
				
			||||
 | 
				
			||||
  +-----------------------------------------+
 | 
				
			||||
  | B1. Two sets of compiles and procedures |
 | 
				
			||||
  +-----------------------------------------+
 | 
				
			||||
 | 
				
			||||
The HOST is the platform/place that you're running the build procedures using
 | 
				
			||||
the native compiler/linker, and the cross-compiler/linker that runs on the HOST
 | 
				
			||||
to build the game for a TARGET platform.
 | 
				
			||||
 | 
				
			||||
You have to:
 | 
				
			||||
    1. Build mandatory utilities on the HOST.
 | 
				
			||||
    2. Execute the mandatory utilities to generate components that will be used
 | 
				
			||||
       during step 4 to build the game itself, or that will generate components
 | 
				
			||||
       that will become part of the TARGET game package.
 | 
				
			||||
    3. Build optional or enhancing utilities on the HOST, execute those
 | 
				
			||||
       optional or enhancing utilities on the HOST to generate components that
 | 
				
			||||
       will become part of the TARGET game package.
 | 
				
			||||
    4. Execute a supported cross-compiler to compile the rest of the game
 | 
				
			||||
       components like NetHack, Lua, and any optional libraries (the word
 | 
				
			||||
       "supported", in this sense, means a compiler that runs on your HOST
 | 
				
			||||
       build platform, and generates output executable files for the TARGET
 | 
				
			||||
       platform).
 | 
				
			||||
 | 
				
			||||
It should be mentioned that you can execute the cross-compile build approach
 | 
				
			||||
to generate binaries for the same platform as the host, where the HOST
 | 
				
			||||
compiler and the TARGET compiler are the same.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  +------------------------------------------------------+
 | 
				
			||||
  | B2. What needs to be built and executed on the HOST? |
 | 
				
			||||
  +------------------------------------------------------+
 | 
				
			||||
 | 
				
			||||
On the HOST, here are the mandatory things that have to be built.
 | 
				
			||||
 | 
				
			||||
    a) Using the HOST native compiler, build  HOST native utility makedefs
 | 
				
			||||
 | 
				
			||||
       Compile and link the following with these compiler switches:
 | 
				
			||||
         -DCROSSCOMPILE
 | 
				
			||||
       from sources: util/makedefs.c, src/mdlib.c, src/monst.c, src/objects.c
 | 
				
			||||
                     src/date.c, src/alloc.c
 | 
				
			||||
 | 
				
			||||
    b) Execute HOST native makedefs utility, util/makedefs, as follows:
 | 
				
			||||
          Required for complete packaging of the game, but not the C source
 | 
				
			||||
          game compile:
 | 
				
			||||
              util/makedefs -d
 | 
				
			||||
              util/makedefs -r
 | 
				
			||||
              util/makedefs -h
 | 
				
			||||
              util/makedefs -s
 | 
				
			||||
 | 
				
			||||
    c) Using the HOST native compiler, build these additional utilities if your
 | 
				
			||||
       target platform requires components that they produce. It is important
 | 
				
			||||
       to note that all of the required source files need to be compiled to
 | 
				
			||||
       native obj files for linking into the HOST-side utility. Some of the
 | 
				
			||||
       source files (src/monst.c, src/objects.c) were likely already compiled
 | 
				
			||||
       as native HOST-side obj files in order to build the native HOST utility
 | 
				
			||||
       'makedefs' HOST utility above, and you don't need to compile them again
 | 
				
			||||
       for use in linking other HOST utilities if the HOST-native obj files
 | 
				
			||||
       produced from them are still around.
 | 
				
			||||
 | 
				
			||||
       NOTE: There are some source files that need to be compiled for linking
 | 
				
			||||
       into utilities that are needed on the HOST side, but that are also
 | 
				
			||||
       needed again later as TARGET obj files for linking into the TARGET
 | 
				
			||||
       executable, and therefore must be compiled twice.
 | 
				
			||||
       They include: src/drawing.c, src/objects.c, src/monst.c,
 | 
				
			||||
       src/alloc.c, util/panic.c. It is important to keep the compiled
 | 
				
			||||
       HOST-side obj files produced by the HOST native compiler distinct from
 | 
				
			||||
       the TARGET-side obj files produced by the cross-compiler. That can be
 | 
				
			||||
       accomplished either by naming the generated object files a little
 | 
				
			||||
       differently (perhaps with a suffix) between the HOST-side and the
 | 
				
			||||
       TARGET-side, or by placing the HOST-side obj files and the TARGET-side
 | 
				
			||||
       obj files into distinct, different directories during the build process.
 | 
				
			||||
       Use whatever method works best for your cross-compile effort and tools.
 | 
				
			||||
 | 
				
			||||
          util/dlb
 | 
				
			||||
 | 
				
			||||
                   from sources: src/dlb.c, src/dlb_main.c, src/alloc.c,
 | 
				
			||||
                                 util/panic.c
 | 
				
			||||
                   purpose:      For packaging up many files that are
 | 
				
			||||
                                 required components of the TARGET game
 | 
				
			||||
                                 into a single nhdat or nhdat370 combined
 | 
				
			||||
                                 file
 | 
				
			||||
 | 
				
			||||
          util/uudecode
 | 
				
			||||
 | 
				
			||||
                   from sources: sys/share/uudecode.c
 | 
				
			||||
                   purpose:      convert some binary files, that are
 | 
				
			||||
                                 distributed in the NetHack sources in
 | 
				
			||||
                                 uuencoded format, back into their
 | 
				
			||||
                                 original binary state
 | 
				
			||||
          util/tilemap
 | 
				
			||||
 | 
				
			||||
                   from sources: win/share/tilemap.c
 | 
				
			||||
                   purpose:      produce output file src/tile.c that is
 | 
				
			||||
                                 required for building TARGET packages with
 | 
				
			||||
                                 tile support
 | 
				
			||||
 | 
				
			||||
          util/tile2bmp
 | 
				
			||||
 | 
				
			||||
                   from sources: win/share/tile2bmp.c, win/share/tiletext.c,
 | 
				
			||||
                                 win/share/tilemap.c, src/drawing.c,
 | 
				
			||||
                                 src/monst.c, src/objects.c
 | 
				
			||||
                   purpose:      Read win/share/monsters.txt,
 | 
				
			||||
                                 win/share/objects.txt and win/share/other.txt
 | 
				
			||||
                                 files and produce a .bmp file.
 | 
				
			||||
 | 
				
			||||
          util/gif2txt
 | 
				
			||||
 | 
				
			||||
                   from sources: win/share/gifread.c, win/share/tiletext.c,
 | 
				
			||||
                                 win/share/tilemap.c, src/drawing.c,
 | 
				
			||||
                                 src/monst.c, src/objects.c,
 | 
				
			||||
                                 src/alloc.c, util/panic.c
 | 
				
			||||
                   purpose:      Read win/share/monsters.txt,
 | 
				
			||||
                                 win/share/objects.txt and win/share/other.txt
 | 
				
			||||
                                 files and produce a .gif file.
 | 
				
			||||
 | 
				
			||||
          util/ppmwrite
 | 
				
			||||
 | 
				
			||||
                   from sources: win/share/ppmwrite.c, win/share/tiletext.c,
 | 
				
			||||
                                 win/share/tilemap.c, src/drawing.c,
 | 
				
			||||
                                 src/monst.c, src/objects.c,
 | 
				
			||||
                                 src/alloc.c, util/panic.c
 | 
				
			||||
                   purpose:      Read win/share/monsters.txt,
 | 
				
			||||
                                 win/share/objects.txt and win/share/other.txt
 | 
				
			||||
                                 files and produce a .ppm file.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  +--------------------------------------------+
 | 
				
			||||
  | B3. What needs to be built for the TARGET? |
 | 
				
			||||
  +--------------------------------------------+
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
For the TARGET side, here are the mandatory things that have to be built via
 | 
				
			||||
the HOST-executed cross-compiler that generates code for the TARGET platform.
 | 
				
			||||
 | 
				
			||||
Using the cross-compiler, build the following targets:
 | 
				
			||||
 | 
				
			||||
    a) NetHack sources (core is mandatory)
 | 
				
			||||
 | 
				
			||||
       With the cross-compiler and linker for the TARGET platform,
 | 
				
			||||
       cross-compile and link with these compiler switches:
 | 
				
			||||
         -DCROSSCOMPILE and -DCROSSCOMPILE_TARGET
 | 
				
			||||
 | 
				
			||||
       core sources (2019): src/allmain.c, src/alloc.c, src/apply.c,
 | 
				
			||||
                           src/artifact.c, src/attrib.c, src/ball.c,
 | 
				
			||||
                           src/bones.c, src/botl.c, src/cmd.c, src/dbridge.c,
 | 
				
			||||
                           src/decl.c, src/detect.c, src/dig.c, src/display.c,
 | 
				
			||||
                           src/dlb.c, src/do.c, src/do_name.c, src/do_wear.c,
 | 
				
			||||
                           src/dog.c, src/dogmove.c, src/dokick.c,
 | 
				
			||||
                           src/dothrow.c, src/drawing.c, src/dungeon.c,
 | 
				
			||||
                           src/eat.c, src/end.c, src/engrave.c, src/exper.c,
 | 
				
			||||
                           src/explode.c, src/extralev.c, src/files.c,
 | 
				
			||||
                           src/fountain.c, src/hack.c, src/hacklib.c,
 | 
				
			||||
                           src/insight.c, src/invent.c, src/isaac64.c,
 | 
				
			||||
                           src/light.c, src/lock.c, src/mail.c,
 | 
				
			||||
                           src/makemon.c, src/mcastu.c,
 | 
				
			||||
                           src/mdlib.c, src/mhitm.c, src/mhitu.c, src/minion.c,
 | 
				
			||||
                           src/mklev.c, src/mkmap.c, src/mkmaze.c, src/mkobj.c,
 | 
				
			||||
                           src/mkroom.c, src/mon.c, src/mondata.c,
 | 
				
			||||
                           src/monmove.c, src/monst.c, src/mplayer.c,
 | 
				
			||||
                           src/mthrowu.c, src/muse.c, src/music.c,
 | 
				
			||||
                           src/nhlsel.c, src/nhlua.c, src/nhlobj.c,
 | 
				
			||||
                           src/o_init.c, src/objects.c, src/objnam.c,
 | 
				
			||||
                           src/options.c, src/pager.c, src/pickup.c,
 | 
				
			||||
                           src/pline.c, src/polyself.c, src/potion.c,
 | 
				
			||||
                           src/pray.c, src/priest.c, src/quest.c,
 | 
				
			||||
                           src/questpgr.c, src/read.c, src/rect.c,
 | 
				
			||||
                           src/region.c, src/restore.c, src/rip.c, src/rnd.c,
 | 
				
			||||
                           src/role.c, src/rumors.c, src/save.c, src/sfstruct.c,
 | 
				
			||||
                           src/shk.c, src/shknam.c, src/sit.c, src/sounds.c,
 | 
				
			||||
                           src/sp_lev.c, src/spell.c, src/steal.c, src/steed.c,
 | 
				
			||||
                           src/symbols.c, src/sys.c, src/teleport.c,
 | 
				
			||||
                           src/timeout.c, src/topten.c, src/track.c,
 | 
				
			||||
                           src/trap.c, src/u_init.c, src/uhitm.c, src/vault.c,
 | 
				
			||||
                           src/version.c, src/vision.c,
 | 
				
			||||
                           src/weapon.c, src/were.c, src/wield.c, src/windows.c,
 | 
				
			||||
                           src/wizard.c, src/worm.c, src/worn.c, src/write.c,
 | 
				
			||||
                           src/zap.c, sys/share/cppregex.cpp
 | 
				
			||||
 | 
				
			||||
       tty sources:        win/tty/getline.c, win/tty/termcap.c,
 | 
				
			||||
                           win/tty/topl.c, win/tty/wintty.c
 | 
				
			||||
 | 
				
			||||
       generated (if req'd):
 | 
				
			||||
                          src/tile.c
 | 
				
			||||
 | 
				
			||||
       plus your platform-specific source files that contain main, typically
 | 
				
			||||
       *main.c, and unix support in *unix.c, tty support in *tty.c, and other
 | 
				
			||||
       system support in *sys.c as well as others sources pertaining to your
 | 
				
			||||
       specific target platform(s).
 | 
				
			||||
 | 
				
			||||
    b) Lua (mandatory in 3.7)
 | 
				
			||||
 | 
				
			||||
          lib/lua-5.4.6/src
 | 
				
			||||
 | 
				
			||||
                   from sources: lua.c, lapi.c, lauxlib.c, lbaselib.c, lcode.c,
 | 
				
			||||
                                 lcorolib.c, lctype.c, ldblib.c, ldebug.c,
 | 
				
			||||
                                 ldo.c, ldump.c, lfunc.c, lgc.c, linit.c,
 | 
				
			||||
                                 liolib.c, llex.c, lmathlib.c, lmem.c,
 | 
				
			||||
                                 loadlib.c, lobject.c, lopcodes.c,
 | 
				
			||||
                                 loslib.c, lparser.c, lstate.c, lstring.c,
 | 
				
			||||
                                 lstrlib.c, ltable.c, ltablib.c, ltm.c,
 | 
				
			||||
                                 lundump.c, lutf8lib.c, lvm.c, lzio.c,
 | 
				
			||||
                                 lbitlib.c
 | 
				
			||||
                   purpose:      links into the game executable to interpret
 | 
				
			||||
                                 lua level description files, lua dungeon
 | 
				
			||||
                                 description files, and a lua quest text file.
 | 
				
			||||
 | 
				
			||||
    d) recover (optional if desired/required; some targets have recover
 | 
				
			||||
       functionality built into NetHack itself)
 | 
				
			||||
 | 
				
			||||
    c) Additional optional library packages/obj files as required
 | 
				
			||||
 | 
				
			||||
          lib/pdcurses/...
 | 
				
			||||
          or lib/pdcursesmod/...
 | 
				
			||||
 | 
				
			||||
                   from sources: addch.c, addchstr.c, addstr.c, attr.c, beep.c,
 | 
				
			||||
                                 bkgd.c, border.c, clear.c, color.c, delch.c,
 | 
				
			||||
                                 deleteln.c, getch.c, getstr.c, getyx.c,
 | 
				
			||||
                                 inch.c, inchstr.c, initscr.c, inopts.c,
 | 
				
			||||
                                 insch.c, insstr.c, instr.c, kernel.c,
 | 
				
			||||
                                 keyname.c, mouse.c, move.c, outopts.c,
 | 
				
			||||
                                 overlay.c, pad.c, panel.c, printw.c,
 | 
				
			||||
                                 refresh.c, scanw.c, scr_dump.c, scroll.c,
 | 
				
			||||
                                 slk.c, termattr.c, touch.c, util.c, window.c,
 | 
				
			||||
                                 debug.c, pdcclip.c, pdcdisp.c, pdcgetsc.c,
 | 
				
			||||
                                 pdckbd.c, pdcutil.c
 | 
				
			||||
                   purpose:      underlying curses platform support for some
 | 
				
			||||
                                 target platforms where inclusion of the
 | 
				
			||||
                                 NetHack curses window port in win/curses is
 | 
				
			||||
                                 desired
 | 
				
			||||
 | 
				
			||||
  +-------------------------+
 | 
				
			||||
  | B4. Case sample: msdos  |
 | 
				
			||||
  +-------------------------+
 | 
				
			||||
 | 
				
			||||
Cross-compiler used:     Andrew Wu's djgpp cross-compiler
 | 
				
			||||
Cross-compiler url:      https://github.com/andrewwutw/build-djgpp
 | 
				
			||||
Cross-compiler pre-built binary downloads:
 | 
				
			||||
    https://github.com/andrewwutw/build-djgpp/releases
 | 
				
			||||
 | 
				
			||||
    Cross-compiler bits tested:
 | 
				
			||||
           https://github.com/andrewwutw/build-djgpp
 | 
				
			||||
       and the pre-built binary for your platform from:
 | 
				
			||||
           https://github.com/andrewwutw/build-djgpp/releases
 | 
				
			||||
       and a DOS-extender (for including in msdos packaging) from
 | 
				
			||||
           http://sandmann.dotster.com/cwsdpmi/csdpmi7b.zip
 | 
				
			||||
       and pdcurses from:
 | 
				
			||||
           https://github.com/wmcbrine/PDCurses.git
 | 
				
			||||
       or pdcursesmod from:
 | 
				
			||||
           https://github.com/Bill-Gray/PDCursesMod.git
 | 
				
			||||
 | 
				
			||||
    - A shell script to download that djgpp cross-compiler and associated
 | 
				
			||||
      pieces for either linux or macOS is available:
 | 
				
			||||
 | 
				
			||||
           sh sys/msdos/fetch-cross-compiler.sh
 | 
				
			||||
 | 
				
			||||
    That script won't install anything, it just does file fetches and stores
 | 
				
			||||
    them in subfolders of lib. The linux.370 and macOS.370 hints files are
 | 
				
			||||
    configured to find the cross-compiler there if you add
 | 
				
			||||
        CROSS_TO_MSDOS=1
 | 
				
			||||
    on your make command line.
 | 
				
			||||
 | 
				
			||||
    Note: Both the fetch-cross-compiler.sh script and and the msdos
 | 
				
			||||
    cross-compile and package procedures require unzip and zip to be available
 | 
				
			||||
    on your host build system.
 | 
				
			||||
 | 
				
			||||
    On your linux host:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/linux.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    On your macOS host:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/macOS.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    The MSDOS cross-compile can then be carried out by specifying
 | 
				
			||||
    CROSS_TO_MSDOS=1 on the make command line:
 | 
				
			||||
 | 
				
			||||
        make CROSS_TO_MSDOS=1 all
 | 
				
			||||
        make CROSS_TO_MSDOS=1 package
 | 
				
			||||
 | 
				
			||||
    You can explicitly include tty and curses support if desired. The default
 | 
				
			||||
    you'll end up with is a tty-only cross-compile build:
 | 
				
			||||
 | 
				
			||||
        make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 package
 | 
				
			||||
 | 
				
			||||
    Result: The "make package" target will bundle all of the necessary
 | 
				
			||||
            components to run NetHack on msdos into a folder:
 | 
				
			||||
                targets/msdos/pkg
 | 
				
			||||
            and then it zips the contents of that folder into:
 | 
				
			||||
                targets/msdos/nh370dos.zip
 | 
				
			||||
 | 
				
			||||
    Also note that building the msdos targets using the make command
 | 
				
			||||
    above, does not preclude you from building local linux or macOS
 | 
				
			||||
    targets as well. Just drop the CROSS_TO_MSDOS=1 from the make
 | 
				
			||||
    command line. That's because the cross-compiler hints additions are
 | 
				
			||||
    enclosed inside ifdef sections and won't interfere with the
 | 
				
			||||
    non-cross-compile build in that case.
 | 
				
			||||
 | 
				
			||||
  +-------------------------+
 | 
				
			||||
  | B5. Case sample: amiga  |
 | 
				
			||||
  +-------------------------+
 | 
				
			||||
 | 
				
			||||
Disclaimer: This is a minimal recipe, just to help someone else get
 | 
				
			||||
            started if they have a desire to get a full cross-compile of
 | 
				
			||||
            NetHack going for the Amiga.
 | 
				
			||||
            See CAVEATS below.
 | 
				
			||||
 | 
				
			||||
Cross-compiler used:     bebbo's amiga-gcc
 | 
				
			||||
Cross-compiler url:      https://github.com/bebbo/amiga-gcc
 | 
				
			||||
 | 
				
			||||
    To our knowledge, a pre-built copy of the cross-compiler isn't available,
 | 
				
			||||
    so you will likely have to obtain the cross-compiler sources via git and
 | 
				
			||||
    build it on your system.
 | 
				
			||||
 | 
				
			||||
    The build prerequisite packages for building the compiler on Ubuntu can be
 | 
				
			||||
    easily obtained:
 | 
				
			||||
 | 
				
			||||
        sudo apt install make wget git gcc g++ lhasa libgmp-dev \
 | 
				
			||||
            libmpfr-dev libmpc-dev flex bison gettext texinfo ncurses-dev \
 | 
				
			||||
            autoconf rsync
 | 
				
			||||
 | 
				
			||||
    The build prerequisite packages for macOS via homebrew are documented but
 | 
				
			||||
    not tested by us any of us to date.
 | 
				
			||||
 | 
				
			||||
        brew install bash wget make lhasa gmp mpfr libmpc flex gettext \
 | 
				
			||||
        texinfo gcc make autoconf
 | 
				
			||||
 | 
				
			||||
    After installing the prerequite packages and the cross-compiler
 | 
				
			||||
    it was a straightforward build:
 | 
				
			||||
 | 
				
			||||
            git clone https://github.com/bebbo/amiga-gcc.git
 | 
				
			||||
            cd amiga-gcc
 | 
				
			||||
            make update
 | 
				
			||||
 | 
				
			||||
           [Note that you may have to take ownership of the files in the bebbo
 | 
				
			||||
            repo via chown before succesfully carrying out the next steps]
 | 
				
			||||
 | 
				
			||||
            make clean
 | 
				
			||||
            make clean-prefix
 | 
				
			||||
            date; make all -j3 >&b.log; date
 | 
				
			||||
 | 
				
			||||
    The compiler pieces are installed in /opt/amiga by default. If you prefer,
 | 
				
			||||
    you can alter the prefix before you build if you want. The instructions
 | 
				
			||||
    for doing so were spelled out at the time of this writing at:
 | 
				
			||||
 | 
				
			||||
        https://github.com/bebbo/amiga-gcc
 | 
				
			||||
 | 
				
			||||
    On your linux host:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/linux.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    On your macOS host:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/macOS.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    The Amiga cross-compile can then be carried out by specifying
 | 
				
			||||
    CROSS_TO_AMIGA=1 on the make command line:
 | 
				
			||||
 | 
				
			||||
        make CROSS_TO_AMIGA=1 all
 | 
				
			||||
        make CROSS_TO_AMIGA=1 package
 | 
				
			||||
 | 
				
			||||
    You can explicitly include tty and curses support if desired, otherwise
 | 
				
			||||
    you'll end up with a tty-only cross-compile build. The SDL1 pdcurses
 | 
				
			||||
    support has not been tested.
 | 
				
			||||
 | 
				
			||||
        make WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_AMIGA=1 all
 | 
				
			||||
 | 
				
			||||
    Result: The "make package" target will bundle the (hopefully) necessary
 | 
				
			||||
            components to run NetHack on msdos into a folder:
 | 
				
			||||
                targets/amiga/pkg
 | 
				
			||||
            and then it zips the contents of that folder into:
 | 
				
			||||
                targets/amiga/nh370ami.zip
 | 
				
			||||
 | 
				
			||||
    Also note that building the amiga targets using the make command
 | 
				
			||||
    above, does not preclude you from building local linux or macOS
 | 
				
			||||
    targets as well. Just drop the CROSS_TO_AMIGA=1 from the make
 | 
				
			||||
    command line.
 | 
				
			||||
 | 
				
			||||
    The cross-compiler hints additions are enclosed inside ifdef sections
 | 
				
			||||
    and won't interfere with the non-cross-compile build in that case.
 | 
				
			||||
 | 
				
			||||
    CAVEATS: The original NetHack Amiga build steps included the source for
 | 
				
			||||
             some utilities that were built and executed on the amiga:
 | 
				
			||||
                 txt2iff and xpm2iff
 | 
				
			||||
             as part of the NetHack build procedure on amiga.
 | 
				
			||||
             Those did not compile out-of-the-box on the linux host. They
 | 
				
			||||
             will either have to be:
 | 
				
			||||
             - ported to build and run on the linux or macOS cross-compile
 | 
				
			||||
               host
 | 
				
			||||
          or
 | 
				
			||||
 | 
				
			||||
             - their functionality will have to be rolled into amiga NetHack
 | 
				
			||||
               itself and executed on the target Amiga the first time the game
 | 
				
			||||
               is run, perhaps.
 | 
				
			||||
 | 
				
			||||
    If you make headway, or are successful getting a working copy of
 | 
				
			||||
    NetHack going on the amiga, drop us a note at devteam@nethack.org.
 | 
				
			||||
 | 
				
			||||
  +--------------------------------+
 | 
				
			||||
  | B6. Case sample: Web Assembly  |
 | 
				
			||||
  +--------------------------------+
 | 
				
			||||
 | 
				
			||||
Credit: The initial Web Assembly cross compile was found in a pull request:
 | 
				
			||||
            https://github.com/NetHack/NetHack/pull/385
 | 
				
			||||
        by apowers313. The pull request was merged with some accompanying
 | 
				
			||||
        NetHack source tree integration changes in early October 2020.
 | 
				
			||||
 | 
				
			||||
Cross-compiler used: emscripten
 | 
				
			||||
Cross-compiler url: https://emscripten.org/docs/getting_started/downloads.html
 | 
				
			||||
 | 
				
			||||
    Here's a brief guide to obtaining the cross-compiler sources via git and
 | 
				
			||||
    building it on your system.
 | 
				
			||||
 | 
				
			||||
    For Ubuntu, the build prerequisite packages for building the compiler can
 | 
				
			||||
    be easily obtained:
 | 
				
			||||
 | 
				
			||||
        sudo apt-get install python3 cmake default-jre
 | 
				
			||||
 | 
				
			||||
    For macOS, you will need to install Xcode, git, cmake, Python 3.5 or new
 | 
				
			||||
    (at time of this writing).
 | 
				
			||||
 | 
				
			||||
    After installing the prerequite packages above, obtain the cross-compiler
 | 
				
			||||
    via git and build it from the directory of your choice using steps similar
 | 
				
			||||
    to these:
 | 
				
			||||
 | 
				
			||||
            git clone https://github.com/emscripten-core/emsdk.git
 | 
				
			||||
            cd emsdk
 | 
				
			||||
            git pull
 | 
				
			||||
            ./emsdk install latest
 | 
				
			||||
            ./emsdk activate latest
 | 
				
			||||
            source ./emsdk_env.sh
 | 
				
			||||
 | 
				
			||||
    The steps above reflect what was outlined at this url at the time
 | 
				
			||||
    of writing:
 | 
				
			||||
 | 
				
			||||
            https://emscripten.org/docs/getting_started/downloads.html
 | 
				
			||||
 | 
				
			||||
    That is the definitive source and trumps anything documented here.
 | 
				
			||||
 | 
				
			||||
    On your linux host, prepare to cross-compile NetHack as follows:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/linux.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    On your macOS host, prepare to cross-compile NetHack as follows:
 | 
				
			||||
 | 
				
			||||
        cd sys/unix ; sh setup.sh hints/macOS.370 ; cd ../..
 | 
				
			||||
        make fetch-lua
 | 
				
			||||
 | 
				
			||||
    Then, cross-compile to targets/wasm as follows:
 | 
				
			||||
 | 
				
			||||
        make CROSS_TO_WASM=1
 | 
				
			||||
 | 
				
			||||
    You can build src/libnh.a from pull request 385 as follows:
 | 
				
			||||
 | 
				
			||||
        make WANT_LIBNH=1
 | 
				
			||||
 | 
				
			||||
    Do not add any additional windowport interfaces to your build
 | 
				
			||||
    (such as WANT_WIN_TTY=1 WANT_WIN_CURSES=1 WANT_WIN_X11=1 or
 | 
				
			||||
    WANT_WIN_QT=1) as those aren't applicable to the Web Assembly
 | 
				
			||||
    or nethacklib builds. A "shim" pseudo-windowport is included
 | 
				
			||||
    from pull request 385.
 | 
				
			||||
 | 
				
			||||
    Result: As mentioned, the wasm cross-compile will end up in
 | 
				
			||||
            targets/wasm and the nethacklib.a will end up in
 | 
				
			||||
            src.
 | 
				
			||||
 | 
				
			||||
    The cross-compiler hints additions are enclosed inside ifdef sections
 | 
				
			||||
    and shouldn't interfere with the non-cross-compile builds using
 | 
				
			||||
    hints/linux.370 or hints/macOS.370.
 | 
				
			||||
 | 
				
			||||
---
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,7 @@
 | 
				
			||||
*.txt NHSUBST
 | 
				
			||||
nhgitset.pl NHSUBST
 | 
				
			||||
hooksdir/* NHSUBST
 | 
				
			||||
* text=auto
 | 
				
			||||
DOTGIT/TARGET NH_header=no
 | 
				
			||||
hooksdir/TARGET NH_header=no
 | 
				
			||||
* NH_filestag=(file%s_for_people_developing_changes_to_NetHack)
 | 
				
			||||
@ -0,0 +1 @@
 | 
				
			||||
.git
 | 
				
			||||
@ -0,0 +1,234 @@
 | 
				
			||||
  ___              _
 | 
				
			||||
 |   \ _____ _____| |___ _ __  ___ _ _
 | 
				
			||||
 | |) / -_) V / -_) / _ \ '_ \/ -_) '_|
 | 
				
			||||
 |___/\___|\_/\___|_\___/ .__/\___|_|
 | 
				
			||||
                        |_|
 | 
				
			||||
 | 
				
			||||
# NetHack 3.7  Developer.txt       $NHDT-Date: 1596498265 2020/08/03 23:44:25 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.19 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
Welcome to the NetHack Infrastructure Developer's Guide.
 | 
				
			||||
 | 
				
			||||
This is the info you need if you are developing code for NetHack.
 | 
				
			||||
(This information is from DevTeam.  If you are working with a variant please
 | 
				
			||||
check for additional documentation for that variant.)
 | 
				
			||||
 | 
				
			||||
For information on building NetHack, see README in the top level directory.
 | 
				
			||||
For information on playing NetHack, see the Guidebook in the doc directory.
 | 
				
			||||
 | 
				
			||||
DANGER!  WORK IN PROGRESS!  Known issues marked XXX.
 | 
				
			||||
 | 
				
			||||
CONTENTS
 | 
				
			||||
1. email
 | 
				
			||||
2. git repositories
 | 
				
			||||
3. bug reporting
 | 
				
			||||
4. git configuration
 | 
				
			||||
5. variable expansion
 | 
				
			||||
6. reserved names
 | 
				
			||||
7. nhadd/nhcommit
 | 
				
			||||
8. hooks
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
1. email
 | 
				
			||||
Email to devteam@nethack.org will usually get a response, but it may take a
 | 
				
			||||
while.  Please do not send save files, binary screen grabs, or other large
 | 
				
			||||
things.
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
2. git repositories
 | 
				
			||||
The public NetHack git repository is available (read-only) at:
 | 
				
			||||
    https://github.com/NetHack/NetHack
 | 
				
			||||
     or
 | 
				
			||||
    https://sourceforge.net/p/nethack/NetHack/
 | 
				
			||||
 | 
				
			||||
Branches:
 | 
				
			||||
NetHack-3.6.0	The 3.6.0 release code and subsequent fixes and additions.
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
3. bug reporting
 | 
				
			||||
Please use the form at http://www.nethack.org/common/contact.html (or send
 | 
				
			||||
us an email if that's more appropriate).
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
4. git configuration
 | 
				
			||||
 | 
				
			||||
NOTE: These instructions assume you are on the default branch; this _is_
 | 
				
			||||
      where you want to be for setting things up.  This may or may not be
 | 
				
			||||
      the branch you want to use for your changes; see the appropriate
 | 
				
			||||
      project private documentation for more information (if you are working
 | 
				
			||||
      alone we suggest using branch names starting with "LOCAL-").
 | 
				
			||||
 | 
				
			||||
NOTE: The following instructions require perl.  If you do not have perl on
 | 
				
			||||
      your system, please install it before proceeding.
 | 
				
			||||
 | 
				
			||||
A. If you have never set up git on this machine before:
 | 
				
			||||
   (This assumes you will only be using git for NetHack.  If you are going to
 | 
				
			||||
   use it for other projects as well, think before you type.)
 | 
				
			||||
	Tell git what name (or nickname) and email address to use for you:
 | 
				
			||||
		git config --global user.name "MY NAME"
 | 
				
			||||
		git config --global user.email USER@EXAMPLE.COM
 | 
				
			||||
   You probably want to set up a credential cache.
 | 
				
			||||
	macOS (10 - 12):
 | 
				
			||||
		git config --global credential.helper osxkeychain
 | 
				
			||||
	Windows:
 | 
				
			||||
		git config --global credential.helper store
 | 
				
			||||
XXX linux
 | 
				
			||||
B. Specify the prefix for variable substitution:
 | 
				
			||||
   (This assumes you are not a member of DevTeam or any variant's development
 | 
				
			||||
   team.  If you are, this may be wrong.  Look for more specific documentation.
 | 
				
			||||
   For example, this file uses "MINE" for the substitution prefix - this will
 | 
				
			||||
   almost always be wrong if you are working with someone else.)
 | 
				
			||||
	Decide where you want to put this info; it should NOT be inside the
 | 
				
			||||
	tree you cloned from git.  I use ~/nethack/GITADDDIR; for that base,
 | 
				
			||||
	create the needed directories and edit the file:
 | 
				
			||||
		~/nethack/GITADDDIR/DOTGIT/PRE
 | 
				
			||||
	Put this in it (if your OS is not Unix-like you may need to change
 | 
				
			||||
	the first line):
 | 
				
			||||
		#!/bin/sh
 | 
				
			||||
		git config nethack.substprefix MINE
 | 
				
			||||
	Now make it executable:
 | 
				
			||||
		chmod +x ~/nethack/GITADDDIR/DOTGIT/PRE
 | 
				
			||||
C. Configure the repository:
 | 
				
			||||
	- cd to the top level of the repository
 | 
				
			||||
	- tell the repository about the directory you created above:
 | 
				
			||||
		git config nethack.gitadddir FULL_PATH_TO_GITADDDIR
 | 
				
			||||
	   so for the example above:
 | 
				
			||||
		git config nethack.gitadddir ~/nethack/GITADDDIR
 | 
				
			||||
	- do the automated setup:
 | 
				
			||||
		perl DEVEL/nhgitset.pl
 | 
				
			||||
	  If it complains, fix what it complains about.  nhgitset.pl accepts
 | 
				
			||||
	  the following options:
 | 
				
			||||
		-v verbose
 | 
				
			||||
		-n dry run
 | 
				
			||||
   You can re-run nhgitset.pl as often as needed; occasionally we will
 | 
				
			||||
   update it (or something it installs) and you will need to run it again
 | 
				
			||||
   so the changes take effect.
 | 
				
			||||
D. aliases
 | 
				
			||||
   Two aliases are installed by nhgitset.pl:
 | 
				
			||||
	nhadd
 | 
				
			||||
	nhcommit
 | 
				
			||||
   These two commands take the same options as the normal git add and commit
 | 
				
			||||
   commands but perform RCS/CVS-style variable substitution.
 | 
				
			||||
 | 
				
			||||
   Note that nothing terrible will happen if you do not use the nh* versions
 | 
				
			||||
   of the commands.
 | 
				
			||||
 | 
				
			||||
   Supported substitutions:
 | 
				
			||||
	MINE-Date	the commit time and date
 | 
				
			||||
   Experimental substitutions:
 | 
				
			||||
	MINE-Revision	CVS style revision number
 | 
				
			||||
	MINE-Branch	the current git branch
 | 
				
			||||
 | 
				
			||||
   For direct access to the substitution mechanism, use:
 | 
				
			||||
	nhsub
 | 
				
			||||
 | 
				
			||||
   See the section "nhadd/nhcommit" for details on those aliases.
 | 
				
			||||
   Run "perldoc DEVEL/hooksdir/nhsub" for details on nhsub.
 | 
				
			||||
 | 
				
			||||
That's it.  If you need to do something more when setting up your repository,
 | 
				
			||||
keep reading.  Otherwise, you are done with this section.
 | 
				
			||||
 | 
				
			||||
1) to run your own hooks in addition to ours:
 | 
				
			||||
	name your hook
 | 
				
			||||
		WHEN-HOOKNAME
 | 
				
			||||
	where WHEN is
 | 
				
			||||
		PRE	(run your code before the NetHack hook)
 | 
				
			||||
		POST	(run your code after the NetHack hook)
 | 
				
			||||
	and HOOKNAME is the normal git name of the hook.
 | 
				
			||||
   Make sure the hooks are executable (chmod +x ...).
 | 
				
			||||
   Be sure to test carefully since the composition of two bits of code may or
 | 
				
			||||
   may not do what you want.
 | 
				
			||||
2) to install other bits on setup:
 | 
				
			||||
	Put additional files in the GITADDDIR tree.  Use "DOTGIT" instead of
 | 
				
			||||
	".git".  If a file called PRE, POST, or INSTEAD exists in a
 | 
				
			||||
	subdirectory of GITADDDIR, it is run before the copy, after the copy,
 | 
				
			||||
	or instead of the copy.  No copy operation is attempted in the DOTGIT
 | 
				
			||||
	directory; use a script and standard git commands to change the
 | 
				
			||||
	contents as needed.
 | 
				
			||||
3) NB: In all namespaces, anything that matches m/^nh/i or m/^nethack/i is
 | 
				
			||||
   reserved.
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
5. variable expansion
 | 
				
			||||
A. Introduction
 | 
				
			||||
   We have implemented an RCS/CVS/SVN style variable expansion mechanism.
 | 
				
			||||
   References of either of the formats:
 | 
				
			||||
	$PREFIX-VARNAME$
 | 
				
			||||
	$PREFIX-VARNAME: VALUE $
 | 
				
			||||
   will be handled (if enabled).
 | 
				
			||||
 | 
				
			||||
   The PREFIX is the value in the git config variable nethack.substprefix.
 | 
				
			||||
   VARNAME is one of:
 | 
				
			||||
	Date
 | 
				
			||||
	Branch (experimental)
 | 
				
			||||
	Revision (experimental)
 | 
				
			||||
   other names will give a warning.
 | 
				
			||||
 | 
				
			||||
B. Enabling variable expansion
 | 
				
			||||
   Variable expansion is controlled by the .gitattributes file.
 | 
				
			||||
 | 
				
			||||
   To enable variable expansion:
 | 
				
			||||
        pattern NHSUBST
 | 
				
			||||
   To disable variable expansion:
 | 
				
			||||
	pattern -NHSUBST
 | 
				
			||||
 | 
				
			||||
   More information: "git help gitattributes"
 | 
				
			||||
 | 
				
			||||
C. Oddities
 | 
				
			||||
   To trigger variable expansion, you _must_ use "git nhadd" or "git nhcommit"
 | 
				
			||||
   instead of "git add" or "git commit."  Nothing terrible will happen if you
 | 
				
			||||
   use the wrong one, but the values will not be updated.
 | 
				
			||||
 | 
				
			||||
   Variable expansion modifies the files in the work tree - your editor or
 | 
				
			||||
   IDE may or may not be happy with this.
 | 
				
			||||
 | 
				
			||||
D. Using your own hooks
 | 
				
			||||
   You can use your own hooks - put them in .git/hooks as usual BUT name them
 | 
				
			||||
   as follows:
 | 
				
			||||
	WHEN-HOOKNAME
 | 
				
			||||
   where WHEN is:
 | 
				
			||||
	PRE	(execute the code before the NetHack hook)
 | 
				
			||||
	POST	(execute the code after the NetHack hook)
 | 
				
			||||
   and HOOKNAME is the normal git name for the hook.
 | 
				
			||||
 | 
				
			||||
   Test carefully - interactions between hooks can be nasty.
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
6. reserved names
 | 
				
			||||
   Anything that matches m/^nh/i or m/^nethack/i is reserved in all
 | 
				
			||||
   namespaces (environment, file names, git config, etc).
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
7. nhadd/nhcommit
 | 
				
			||||
   nhadd is essentially "git nhsub $*; git add $*"
 | 
				
			||||
   nhcommit is essentially "git nhsub $*; git commit $*"
 | 
				
			||||
 | 
				
			||||
   As "git add" and "git commit" have complex arguments, nhsub attempts to
 | 
				
			||||
   do the right thing - or at least something reasonable - for most arguments.
 | 
				
			||||
   If nhadd/nhcommit don't do what you need, run "git nhsub" on its own then
 | 
				
			||||
   add/commit.
 | 
				
			||||
 | 
				
			||||
   So when do I need to use what?
 | 
				
			||||
   The object is to get nhsub run right before git takes a snapshot of each
 | 
				
			||||
   file.  So for example:
 | 
				
			||||
   - use "git nhcommit <filespec>" instead of "git commit <filespec>"
 | 
				
			||||
   - use "git nhadd <filespec>" instead of "git add <filespec>"
 | 
				
			||||
   - use either "git commit" or "git nhcommit" (because the snapshot was
 | 
				
			||||
     already taken)
 | 
				
			||||
   - if you use "git nhsub <filespec>" then you can "git add <filespec>" or
 | 
				
			||||
     "git commit <filespec>" 
 | 
				
			||||
 | 
				
			||||
   For more complex situations, "git nhsub" takes -v and -n flags - see
 | 
				
			||||
   "perldoc DEVEL/hooksdir/nhsub".
 | 
				
			||||
   
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
8. hooks
 | 
				
			||||
 | 
				
			||||
   nhgitset.pl also installs hooks into .git/hooks.  These hooks provide
 | 
				
			||||
   a framework which allows local hook code to co-exist with hook code we
 | 
				
			||||
   supply - see DEVEL/hooksdir/NHgithook.pm for details.
 | 
				
			||||
 | 
				
			||||
   We currently use the following hooks:
 | 
				
			||||
    post-checkout
 | 
				
			||||
    post-commit
 | 
				
			||||
    post-merge
 | 
				
			||||
   These are used to generate dat/gitinfo.txt which provides the data that
 | 
				
			||||
   ends up available through the game command #version and the command line
 | 
				
			||||
   option --version.
 | 
				
			||||
 | 
				
			||||
------------------------------------------------------------------------------
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,124 @@
 | 
				
			||||
# NetHack 3.7  code_features.txt $NHDT-Date: 1596498264 2020/08/03 23:44:24 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.6 $
 | 
				
			||||
# Copyright (c) 2015 by Michael Allison
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
Developer-useful info about code features, assumptions, purpose,
 | 
				
			||||
rationale, etc.
 | 
				
			||||
 | 
				
			||||
==============================================
 | 
				
			||||
FEATURE_NOTICE Alerts for a Release
 | 
				
			||||
 | 
				
			||||
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:
 | 
				
			||||
   o Where the change in behavior needs to alert the player,
 | 
				
			||||
     - Add an 'if statement' to invoke the alert behavior
 | 
				
			||||
       if the condition is met, for example
 | 
				
			||||
          if (flags.suppress_alert < FEATURE_NOTICE_VER(3.6.0))
 | 
				
			||||
             pline("Note: and explain the change here.");
 | 
				
			||||
     - The example above will alert the users for a new feature
 | 
				
			||||
       added in 3.6.0 via a one-liner via pline(), but you
 | 
				
			||||
       could get more elaborate (just make sure it is all done
 | 
				
			||||
       in the 'if' code block.
 | 
				
			||||
 | 
				
			||||
Once the user finds the alert no longer useful, or becoming 
 | 
				
			||||
annoying, they can set the "suppress_alert" option.
 | 
				
			||||
      - The user can only set the suppress_alert to the current 
 | 
				
			||||
        version, not future versions. That restriction is done
 | 
				
			||||
        so that the feature can be used for new things in new
 | 
				
			||||
        releases.
 | 
				
			||||
      - The suppression can be done interactively mid game with
 | 
				
			||||
        the 'O' command, or via 
 | 
				
			||||
           OPTIONS=suppress_alert:3.6.0
 | 
				
			||||
        in the user's config file.
 | 
				
			||||
 | 
				
			||||
==============================================
 | 
				
			||||
PREFIXES_IN_USE and NOCWD_ASSUMPTIONS
 | 
				
			||||
 | 
				
			||||
Those provide a storage mechanism for holding the paths to various different
 | 
				
			||||
types of files. Those paths are stored in the fqn_prefix[] array. They are a
 | 
				
			||||
mechanism for enabling separation of the different files that NetHack needs. 
 | 
				
			||||
 | 
				
			||||
The prefixes are added to the beginning of file names  by various routines in
 | 
				
			||||
files.c immediately prior to opening one of the types of files that the game
 | 
				
			||||
uses.
 | 
				
			||||
 | 
				
			||||
They aren't about config file options (although config file options would be
 | 
				
			||||
one way to set non-default values for some of the paths in the fqn_prefix[]
 | 
				
			||||
array). Obviously the very first path needed (now sysconfdir, previously
 | 
				
			||||
configdir) isn't viable for setting via config file options, but the game
 | 
				
			||||
still needs to hunt it down "someplace."  When the "someplace" is figured
 | 
				
			||||
out, that place (path) would be stored in fqn_prefix[SYSCONPREFIX].  How it
 | 
				
			||||
gets stored in fqn_prefix[SYSCONPREFIX] is up to us as developers.
 | 
				
			||||
 | 
				
			||||
Any of the fqn_prefix[] entries can be set somehow. It could be done in port
 | 
				
			||||
startup code; in options processing; in config file processing; by 
 | 
				
			||||
translating a system environment variable such as USERPROFILE; whatever 
 | 
				
			||||
you/we want.  The point is that NOCWD_ASSUMPTIONS and PREFIXES_IN_USE are
 | 
				
			||||
there to ensure that there is a place to store that path information.  The
 | 
				
			||||
code to *utilize* the information is already in files.c (see fqname()).
 | 
				
			||||
 | 
				
			||||
There is a fqn_prefix[] entry for holding the path to each of the following:
 | 
				
			||||
    PREFIX        NAME
 | 
				
			||||
0 HACKPREFIX     hackdir
 | 
				
			||||
1 LEVELPREFIX    leveldir    location to create level files
 | 
				
			||||
2 SAVEPREFIX     savedir location to create/read saved games
 | 
				
			||||
3 BONESPREFIX    bonesir location to create/read bones
 | 
				
			||||
4 DATAPREFIX     datadir location to read data.base etc.
 | 
				
			||||
5 SCOREPREFIX    scoredir    location to read/write scorefile
 | 
				
			||||
6 LOCKPREFIX     lockdir     location to create/read lock files
 | 
				
			||||
7 SYSCONFPREFIX  sysconfdir  location to read SYSCF_FILE
 | 
				
			||||
8 CONFIGPREFIX   configdir   location to read user configuration file
 | 
				
			||||
9 TROUBLEPREFIX  troubledir  location to place panic files etc.
 | 
				
			||||
 | 
				
			||||
To recap, they are about enabling "different paths for different things", and
 | 
				
			||||
separation of:
 | 
				
			||||
- read-only stuff from read-write stuff.
 | 
				
			||||
- sysadmin stuff from user-writable stuff.
 | 
				
			||||
etc.
 | 
				
			||||
 | 
				
			||||
==============================================
 | 
				
			||||
REGULAR EXPRESSIONS
 | 
				
			||||
 | 
				
			||||
There are multiple regular expression libraries supported. Currently, one (and
 | 
				
			||||
only one) of the following files should be linked into a built:
 | 
				
			||||
  sys/share/cppregex.cpp
 | 
				
			||||
  sys/share/posixregex.c
 | 
				
			||||
  sys/share/pmatchregex.c
 | 
				
			||||
 | 
				
			||||
This provides a way to access different system regular expression libraries,
 | 
				
			||||
or fall back onto pmatch() if none is available. cppregex.cpp uses the regular
 | 
				
			||||
expression library in the C++11 standard, and is the default on Windows.
 | 
				
			||||
posixregex.c uses the POSIX regular expression library, and is the default on
 | 
				
			||||
POSIX. pmatchregex.c is the fallback.
 | 
				
			||||
 | 
				
			||||
Configuration files written using either of the two true regex engines are
 | 
				
			||||
compatible with one another, as the regular expressions are both POSIX
 | 
				
			||||
extended regular expressions. Configuration files written using the fallback
 | 
				
			||||
engine are incompatible.
 | 
				
			||||
 | 
				
			||||
Additional regular expression implementations can be written. The full
 | 
				
			||||
interface documentation is in sys/share/posixregex.c
 | 
				
			||||
 | 
				
			||||
===========================================================
 | 
				
			||||
HEADER FILE NOTES
 | 
				
			||||
 | 
				
			||||
hack.h defines values that are available to all NetHack source files,
 | 
				
			||||
contains enums for use in all NetHack source files, and contains a
 | 
				
			||||
number of struct definitions for use in all NetHack source files.
 | 
				
			||||
hack.h does not contain variable declarations or variable definitions.
 | 
				
			||||
 | 
				
			||||
decl.h and decl.c are related: decl.h contains the extern declarations
 | 
				
			||||
for variables that are defined in decl.c. These variables are global
 | 
				
			||||
and available to all NetHack source files.
 | 
				
			||||
decl.c variable definitions are generally laid out in much the same
 | 
				
			||||
order as their corresponding declarations in decl.h.
 | 
				
			||||
 | 
				
			||||
A new header file cstd.h was added to coincide with 3.7's switch to
 | 
				
			||||
C99. It contains calls to some C99 standard header files.
 | 
				
			||||
 | 
				
			||||
=================== NEXT FEATURE ==========================
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,289 @@
 | 
				
			||||
# NetHack 3.7  code_style.txt       $NHDT-Date: 1694890786 2023/09/16 18:59:46 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.8 $
 | 
				
			||||
# Copyright (c) 2015 by Derek S. Ray
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
NetHack DevTeam Coding Style
 | 
				
			||||
============================
 | 
				
			||||
 | 
				
			||||
NetHack is written in C, with a little bit of C++ to access platform
 | 
				
			||||
libraries. This coding style document is concerned primarily with the style
 | 
				
			||||
used for C source files. We do not have a defined style for C++ files, but C++
 | 
				
			||||
should be styled in keeping with C.
 | 
				
			||||
 | 
				
			||||
The code base in C files was, close to the 3.6 release, reformatted using a
 | 
				
			||||
version of the clang-format tool patched to support K&R-style argument
 | 
				
			||||
declarations. Due to some incompatibilities, the patch is not publicly
 | 
				
			||||
available and clang-format is not expected to be regularly used.  Since then,
 | 
				
			||||
function declarations and definitions have been switched to ANSI.
 | 
				
			||||
 | 
				
			||||
Developers should do their best to adhere to the coding style to promote
 | 
				
			||||
legible, easy-to-edit code. Legibility is paramount, so in some cases, it may
 | 
				
			||||
be better not to fully adhere to the style guidelines.
 | 
				
			||||
 | 
				
			||||
Recipes for common text editors can be found at the end of this file.
 | 
				
			||||
 | 
				
			||||
Indentation and Spacing
 | 
				
			||||
-----------------------
 | 
				
			||||
 | 
				
			||||
The basic indentation is 4 spaces wide. All indentation is done using space
 | 
				
			||||
characters, not tabs.
 | 
				
			||||
 | 
				
			||||
Lines should be at most 78 characters wide. If a line would be longer than the
 | 
				
			||||
limit, the line should be wrapped and the wrapped portion should be aligned
 | 
				
			||||
with the parentheses or brackets containing the wrap. If there is no set of
 | 
				
			||||
parentheses or brackets, the line should be indented four spaces. Wrapping
 | 
				
			||||
should normally occur after a comma or before a binary operator, when
 | 
				
			||||
possible:
 | 
				
			||||
 | 
				
			||||
    int index
 | 
				
			||||
        = SomeExcessivelyLongExpression;
 | 
				
			||||
 | 
				
			||||
    fcall(arg1,
 | 
				
			||||
          arg2, (cond13
 | 
				
			||||
                 && cond2));
 | 
				
			||||
 | 
				
			||||
Single blank lines should be used wherever convenient to improve readability.
 | 
				
			||||
 | 
				
			||||
Functions and Control Statements
 | 
				
			||||
--------------------------------
 | 
				
			||||
 | 
				
			||||
For a function definition, the return type, declarator, and opening brace
 | 
				
			||||
should each appear on a line of their own. Arguments are defined in the following
 | 
				
			||||
parenthesis, per ANSI.  There are two general styles.  One with no comments, where
 | 
				
			||||
arguments are added one after another, with a wrap aligning to the first argument
 | 
				
			||||
if there is an overflow.
 | 
				
			||||
 | 
				
			||||
    void
 | 
				
			||||
    foo(int i, char c)
 | 
				
			||||
    {
 | 
				
			||||
        /* function body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
    void
 | 
				
			||||
    long_function_name(int first_arg, struct long_name *second_arg,
 | 
				
			||||
                       int third_arg, int forth_arg)
 | 
				
			||||
    {
 | 
				
			||||
        /* function body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Alternatively, arguments can be one per line if they are commented:
 | 
				
			||||
 | 
				
			||||
    void
 | 
				
			||||
    long_function_name(int first_arg,                /* main operation */
 | 
				
			||||
                       struct long_name *second_arg, /* control details */
 | 
				
			||||
                       int third_arg,                /* local conditions - if
 | 
				
			||||
                                                        they apply */
 | 
				
			||||
                       int forth_arg)                /* remote conditions */
 | 
				
			||||
    {
 | 
				
			||||
        /* function body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
If the function takes no parameters:
 | 
				
			||||
 | 
				
			||||
    int
 | 
				
			||||
    long_function_name(void)
 | 
				
			||||
    {
 | 
				
			||||
        /* function body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Opening braces of control statements appear on the same line as the control
 | 
				
			||||
statement:
 | 
				
			||||
 | 
				
			||||
    if (condition) {
 | 
				
			||||
        /* body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Else statements and the while statements of do-while blocks appear on the same
 | 
				
			||||
line as the closing brace of the if or do statement. Otherwise, closing braces
 | 
				
			||||
always get a line of their own.
 | 
				
			||||
 | 
				
			||||
    if (condition) {
 | 
				
			||||
        /* body */
 | 
				
			||||
    } else if (condition) {
 | 
				
			||||
        do {
 | 
				
			||||
            /* body */
 | 
				
			||||
        } while (condition);
 | 
				
			||||
    } else {
 | 
				
			||||
        /* body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
If a control block has only a single statement, it can appear on a line of its
 | 
				
			||||
own, with an indent. If the statement is a null statement, then it should be
 | 
				
			||||
expressed as an empty set block, not with a semicolon, because many compilers
 | 
				
			||||
will warn if a null statement is used:
 | 
				
			||||
 | 
				
			||||
    if (condition)
 | 
				
			||||
        fcall();
 | 
				
			||||
 | 
				
			||||
    if (condition) {
 | 
				
			||||
    } else
 | 
				
			||||
        fcall();
 | 
				
			||||
 | 
				
			||||
If multiple control blocks are being used in a row, it may be more readable to
 | 
				
			||||
use braces even for single statements, and they should be used if they improve
 | 
				
			||||
readability. The following is an example of poor usage:
 | 
				
			||||
 | 
				
			||||
    if (condition) {
 | 
				
			||||
        /* long body */
 | 
				
			||||
    } else if (condition)
 | 
				
			||||
        statement;
 | 
				
			||||
    else {
 | 
				
			||||
        /* very long body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Switch statements should have the case labels unindented, and the statements
 | 
				
			||||
should be indented normally. The default case should occur last unless there's
 | 
				
			||||
a compelling reason not to, and fallthroughs should be explicitly marked as
 | 
				
			||||
such with a comment, to avoid Yeenoghu getting the touch of death again:
 | 
				
			||||
 | 
				
			||||
    switch (condition) {
 | 
				
			||||
    case FOO:
 | 
				
			||||
    case BAR:
 | 
				
			||||
        fcall();
 | 
				
			||||
        /* fall-through */
 | 
				
			||||
    case BAZ:
 | 
				
			||||
        fcall();
 | 
				
			||||
        break;
 | 
				
			||||
 | 
				
			||||
    default:
 | 
				
			||||
        statement;
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Variables should never be declared in a condition or a for loop
 | 
				
			||||
initialization, and if an assignment is used as a condition, it should be
 | 
				
			||||
wrapped in an additional set of parentheses for clarity:
 | 
				
			||||
 | 
				
			||||
    int *p;
 | 
				
			||||
    if ((p = fcall())) {
 | 
				
			||||
        /* body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
    int i;
 | 
				
			||||
    for (i = 1; i < 10; ++i) {
 | 
				
			||||
        /* body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Variable names to avoid
 | 
				
			||||
-----------------------
 | 
				
			||||
 | 
				
			||||
    near, far    Some compilers and cross-compilers that target old
 | 
				
			||||
                 processors with segmented architectures may treat
 | 
				
			||||
                 those as keywords. It is safest to just avoid them.
 | 
				
			||||
 | 
				
			||||
Spaces in Expressions
 | 
				
			||||
---------------------
 | 
				
			||||
 | 
				
			||||
Spaces should appear around binary operators, after commas, after a C-style
 | 
				
			||||
cast, and after the keyword in a control statement. They should not appear
 | 
				
			||||
between a function name and the opening parenthesis of a function call, nor
 | 
				
			||||
immediately inside a pair of parentheses:
 | 
				
			||||
 | 
				
			||||
    foo(i, j, l);
 | 
				
			||||
    if ((boolean) condition) {
 | 
				
			||||
        /* body */
 | 
				
			||||
    }
 | 
				
			||||
 | 
				
			||||
Casts and sizeof
 | 
				
			||||
----------------
 | 
				
			||||
 | 
				
			||||
Casts should separate the cast operator and its expression with a space:
 | 
				
			||||
    '(char *) str'
 | 
				
			||||
'sizeof (type)' requires the parentheses.  'sizeof expression' does not;
 | 
				
			||||
using them is not wrong but omitting them avoids some visual clutter.
 | 
				
			||||
Using them without the separating space gives the false impression of a
 | 
				
			||||
function call or macro-with-argument(s) expansion; 'sizeof' is an operator
 | 
				
			||||
and the parentheses required for '(type)' are to treat it like a cast.
 | 
				
			||||
 | 
				
			||||
Comments
 | 
				
			||||
--------
 | 
				
			||||
 | 
				
			||||
Some block comments are undecorated, just split into reasonable width lines:
 | 
				
			||||
    /* this is
 | 
				
			||||
       a comment */
 | 
				
			||||
They usually don't include sentence punctuation.
 | 
				
			||||
 | 
				
			||||
Others are more elaborate:
 | 
				
			||||
    /*
 | 
				
			||||
     * This is
 | 
				
			||||
     * another comment.
 | 
				
			||||
     */
 | 
				
			||||
This style is usually used with sentence punctation, particularly if they
 | 
				
			||||
contain more than one sentence.
 | 
				
			||||
 | 
				
			||||
End-of-line comments which need to span lines
 | 
				
			||||
    somecode(); /* this comment
 | 
				
			||||
                 * is ok */
 | 
				
			||||
should start every continuation line with an asterisk, otherwise clang-format
 | 
				
			||||
would convert them into a block comment
 | 
				
			||||
    othercode(); /* this comment
 | 
				
			||||
                    should be avoided */
 | 
				
			||||
because it would be converted into
 | 
				
			||||
    othercode();
 | 
				
			||||
    /* this comment
 | 
				
			||||
       should be avoided */
 | 
				
			||||
if another bulk reformatting ever gets performed.  Similarly, multiple
 | 
				
			||||
comments intended to read as one
 | 
				
			||||
    morecode(); /* start of comment */
 | 
				
			||||
                /* more of comment  */
 | 
				
			||||
                /* end of comment   */
 | 
				
			||||
are deprecated because they will end up losing the indentation of the
 | 
				
			||||
followup lines if reformatted.
 | 
				
			||||
 | 
				
			||||
Many files end with
 | 
				
			||||
    /*filename*/
 | 
				
			||||
usually preceded by a blank line.  This was intended as a workaround for a
 | 
				
			||||
comment--somewhere, possibly in Amiga or Atari code--that stated that some
 | 
				
			||||
compiler or other didn't always process the last line of the file.  If that
 | 
				
			||||
last line is a comment, nothing is lost.  The real issue almost certainly
 | 
				
			||||
was source file(s) that didn't end in newline.  These days we try to force
 | 
				
			||||
the final newline for every file, prior to release if not always maintained
 | 
				
			||||
day-to-day.  The name at the end can still be worthwhile when editing or
 | 
				
			||||
browsing multiple files.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
Vim Configuration
 | 
				
			||||
=================
 | 
				
			||||
 | 
				
			||||
For vim, the following settings are encouraged when editing NetHack code, to
 | 
				
			||||
ensure that indentation is done correctly:
 | 
				
			||||
 | 
				
			||||
    set shiftwidth=4
 | 
				
			||||
    set softtabstop=4
 | 
				
			||||
    set expandtab
 | 
				
			||||
    set tabstop=4
 | 
				
			||||
    set shiftround
 | 
				
			||||
    set textwidth=78
 | 
				
			||||
    set cindent
 | 
				
			||||
    set filetype=c
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
Visual Studio Configuration
 | 
				
			||||
===========================
 | 
				
			||||
 | 
				
			||||
In Visual Studio under Tools->Options->Text Editor->C/C++, you can set the
 | 
				
			||||
following options to obtain desired behavior:
 | 
				
			||||
 | 
				
			||||
[Tabs]
 | 
				
			||||
Indenting: Smart
 | 
				
			||||
Tab size: 4
 | 
				
			||||
Indent size: 4
 | 
				
			||||
Insert Spaces
 | 
				
			||||
 | 
				
			||||
There are a number of other options under [Formatting] that should be
 | 
				
			||||
checked (Indentation, New Lines, Spacing, and Wrapping), but there are so
 | 
				
			||||
many entries that reproducing them here is impractical. Fortunately, the
 | 
				
			||||
options are in plain English, so walking through them with a copy of
 | 
				
			||||
this Guide handy and making changes as required will suffice.
 | 
				
			||||
 | 
				
			||||
Emacs Configuration
 | 
				
			||||
===================
 | 
				
			||||
 | 
				
			||||
There are no doubt umpteen different ways to handle this in Emacs.
 | 
				
			||||
Putting the following in ~/.emacs.el is one
 | 
				
			||||
 | 
				
			||||
(defun hook-c ()
 | 
				
			||||
  (setq c-set-style "k&r")
 | 
				
			||||
  (setq c-basic-offset 4)
 | 
				
			||||
  (setq indent-tabs-mode nil))
 | 
				
			||||
(add-hook 'c-mode-common-hook 'hook-c)
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,206 @@
 | 
				
			||||
# NetHack 3.7  git_recipes.txt       $NHDT-Date: 1596498266 2020/08/03 23:44:26 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.11 $
 | 
				
			||||
# Copyright (c) 2015 by Derek S. Ray
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
Git has a messy learning curve. This file is an attempt to serve as a quick
 | 
				
			||||
reference for basic tasks while you get up to speed.
 | 
				
			||||
 | 
				
			||||
------------------------
 | 
				
			||||
 | 
				
			||||
[*] git checkout [-f] (branch)
 | 
				
			||||
 | 
				
			||||
Switch your local repository to be at the most recent commit of (branch). 
 | 
				
			||||
Including -f will discard changes made in the working directory.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git status [-uall | -uno]
 | 
				
			||||
 | 
				
			||||
Shows all changed files in your local repository and also a list of the ones
 | 
				
			||||
you have staged for commit.
 | 
				
			||||
Including -uall will also show you all untracked files in all subdirectories.
 | 
				
			||||
Including -uno will show you _no_ untracked files.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git log [-NUM]
 | 
				
			||||
[*] git log <commit1> <commit2>
 | 
				
			||||
[*] git log [--pretty=one]
 | 
				
			||||
[*] git log (branch)
 | 
				
			||||
 | 
				
			||||
For a full explanation of all the arguments you can pass to 'log', please see
 | 
				
			||||
the manual; there are a lot and these are just a few of the common ones. For 
 | 
				
			||||
our purposes, git log will show you all the commits according to criteria 
 | 
				
			||||
you specify:
 | 
				
			||||
 | 
				
			||||
-NUM: The last NUM commits in this branch
 | 
				
			||||
<commit1> <commit2>: all commits between commit1 and commit2
 | 
				
			||||
-pretty=one: format output as a single line for each entry
 | 
				
			||||
(branch): show the commits from (branch) instead of the current one
 | 
				
			||||
 | 
				
			||||
[*] git log --pretty=one --decorate --graph --all
 | 
				
			||||
 | 
				
			||||
(This is best explained by executing and looking at the output.)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git add (filename)
 | 
				
			||||
[*] git nhadd (filename)
 | 
				
			||||
 | 
				
			||||
Adds the changes you've made in (filename) to the pre-commit staging area.
 | 
				
			||||
(also referred to as the 'index')
 | 
				
			||||
 OR
 | 
				
			||||
Make a new file be tracked by git.
 | 
				
			||||
 | 
				
			||||
"nhadd" is the preferred syntax and will automatically update the source file
 | 
				
			||||
headers with the latest date, branch, and version.  See Developer.txt for
 | 
				
			||||
details.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git commit [-a] [-m "text"]
 | 
				
			||||
[*] git nhcommit [-a] [-m "text"]
 | 
				
			||||
 | 
				
			||||
Commits all staged changes (in the index) to this branch in your local repo
 | 
				
			||||
from your current position.
 | 
				
			||||
Including -a will 'git add' all eligible files before doing so.
 | 
				
			||||
Including -m will use "text" as the commit message instead of opening an
 | 
				
			||||
editor window for you to create one.
 | 
				
			||||
 | 
				
			||||
"nhcommit" is the preferred syntax and will automatically update the source file
 | 
				
			||||
headers with the latest date, branch, and version.  See Developer.txt for
 | 
				
			||||
details.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git push [--all] [-u origin (branch)]
 | 
				
			||||
 | 
				
			||||
Sends all your commits for the current branch to the centralized repo.
 | 
				
			||||
Including --all will send the commits for _all_ branches.
 | 
				
			||||
Specifying -u is only needed the first time you push (branch) that you
 | 
				
			||||
created; it establishes the connection between local and remote for that
 | 
				
			||||
branch.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git reset [--hard] (filename)
 | 
				
			||||
 | 
				
			||||
Without any parameters, unstages the changes for (filename) from the index;
 | 
				
			||||
does not change the working tree. This is the equivalent of the command 
 | 
				
			||||
git reset --mixed (filename); git reset --soft (filename) has no effect.
 | 
				
			||||
 | 
				
			||||
With --hard, unstages (filename) from the index and reverts (filename) in
 | 
				
			||||
the working tree to the most recent commit.
 | 
				
			||||
 | 
				
			||||
*** WARNING *** --hard _will_ throw away your changes.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[DSR: I'm hesitant about including this command because you can trash stuff
 | 
				
			||||
with it. But at the same time, for people who are adapting to a commit not
 | 
				
			||||
also automatically being a send, it's nice for them to know how to undo one in
 | 
				
			||||
case they do something wrong. thoughts?]
 | 
				
			||||
 | 
				
			||||
[*] git reset [--soft | --mixed | --hard] HEAD~1
 | 
				
			||||
 | 
				
			||||
*** WARNING *** Never, EVER do this to a commit that you have already pushed;
 | 
				
			||||
you will be rewriting history on other people's machines and this will
 | 
				
			||||
generally turn out very poorly.
 | 
				
			||||
 | 
				
			||||
With --soft, undoes the most recent 'git commit' action, but leaves the 
 | 
				
			||||
changes in the index and in the working directory.
 | 
				
			||||
 | 
				
			||||
With --mixed, does everything --soft does but also unstages the changes from
 | 
				
			||||
the index. If you don't specify one of the three, reset will assume this.
 | 
				
			||||
 | 
				
			||||
With --hard, does everything --mixed does but also reverts the working tree to
 | 
				
			||||
the prior commit. 
 | 
				
			||||
 | 
				
			||||
*** WARNING *** --hard will effectively delete a commit and "lose" the changes.
 | 
				
			||||
[/end area-of-concern]
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git fetch [--all]
 | 
				
			||||
 | 
				
			||||
Retrieve commits from the remote repository to your machine.
 | 
				
			||||
Including --all will get commits for all branches.
 | 
				
			||||
Does NOT merge them into your local repository.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git pull
 | 
				
			||||
 | 
				
			||||
Incorporate any fetched commits for the current branch into your repository
 | 
				
			||||
and update your position accordingly. This will create a merge commit (noting
 | 
				
			||||
that you merged a branch into itself).
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git rebase [no-arguments version ONLY]
 | 
				
			||||
 | 
				
			||||
Incorporate fetched commits for the current branch into your repository, and
 | 
				
			||||
replay any local commits and changes afterwards on top.
 | 
				
			||||
 | 
				
			||||
Quality picture-pages ASCII art:
 | 
				
			||||
 | 
				
			||||
                                  E---F---G---H (remote changes)
 | 
				
			||||
                                 /
 | 
				
			||||
                                /
 | 
				
			||||
(branch 'frog')    A---B---C---D---E'---F' (your local changes)
 | 
				
			||||
 | 
				
			||||
After 'git fetch' and 'git rebase', it will look like this:
 | 
				
			||||
 | 
				
			||||
                                               --- (remote HEAD)
 | 
				
			||||
                                               |
 | 
				
			||||
                                               V
 | 
				
			||||
(branch 'frog')    A---B---C---D---E---F---G---H---E'---F'
 | 
				
			||||
                                                   ^    ^
 | 
				
			||||
                                                   |    |
 | 
				
			||||
                                                   -------- (to be pushed)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git branch (branch)
 | 
				
			||||
 | 
				
			||||
Creates a new branch from the current commit you're pointed to.
 | 
				
			||||
Does not automatically checkout (switch to) the branch.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git checkout -b (branch)
 | 
				
			||||
 | 
				
			||||
Creates a new branch from the current commit you're pointed to, and
 | 
				
			||||
automatically checks out that branch.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git branch <pattern> --list | [--all | -a] | [--remotes | -r]
 | 
				
			||||
 | 
				
			||||
Lists all branches matching <pattern>.
 | 
				
			||||
With --all instead, lists all branches (including remotely tracked ones).
 | 
				
			||||
With --remotes instead, lists only remote branches.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git merge (branch) [--no-commit]
 | 
				
			||||
 | 
				
			||||
Merges all the changes from (branch) since it last diverged from a common
 | 
				
			||||
ancestor into your current branch.
 | 
				
			||||
 | 
				
			||||
With --no-commit, does not automatically create a merge entry in the log but
 | 
				
			||||
leaves all the merged files in your working directory; to complete the merge
 | 
				
			||||
you must commit them manually later (likely after you have edited them). This
 | 
				
			||||
more accurately mimics the merge behavior of svn [and cvs?]
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
[*] git stash [save | apply | list] <stashname>
 | 
				
			||||
 | 
				
			||||
save: Takes all changes in your working directory and 'stashes' them in a temporary
 | 
				
			||||
holding area. Convenient if the command you're trying to run won't go unless
 | 
				
			||||
you have a clean working dir; also convenient to move experimental changes
 | 
				
			||||
between branches without needing to commit them.
 | 
				
			||||
 | 
				
			||||
apply: Replays the named stash onto your current working directory as though
 | 
				
			||||
it were a patch. Does not delete the stash from the list.
 | 
				
			||||
 | 
				
			||||
list: Lists all of your stashed code blobs.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
=======================================
 | 
				
			||||
External Links
 | 
				
			||||
=======================================
 | 
				
			||||
http://pcottle.github.io/learnGitBranching
 | 
				
			||||
 | 
				
			||||
=======================================
 | 
				
			||||
Typical workflows for common activities
 | 
				
			||||
=======================================
 | 
				
			||||
 | 
				
			||||
{To be added in near future: DSR 3/15}
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,36 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  getinfo.pl       $NHDT-Date: 1596498266 2020/08/03 23:44:26 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
# Copyright (c) 2018 by Michael Allison
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
 | 
				
			||||
	# special case for this script only: allow
 | 
				
			||||
	# it to run from DEVEL or $TOP
 | 
				
			||||
    if (-f "hooksdir/NHgithook.pm" || -f "DEVEL/hooksdir/NHgithook.pm"){
 | 
				
			||||
	push(@INC, "DEVEL/hooksdir");
 | 
				
			||||
    }
 | 
				
			||||
    chdir("..") if (-f "hooksdir/NHgithook.pm");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
 | 
				
			||||
&NHgithook::nhversioning;
 | 
				
			||||
@ -0,0 +1,22 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  NHadd       $NHDT-Date: 1596498406 2020/08/03 23:46:46 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# wrapper for nhadd and nhcommit aliases
 | 
				
			||||
 | 
				
			||||
%ok = map { $_ => 1 } ('add', 'commit');
 | 
				
			||||
 | 
				
			||||
die "Bad subcommand '$ARGV[0]'" unless $ok{$ARGV[0]};
 | 
				
			||||
 | 
				
			||||
# we won't fail on a failure, so just system()
 | 
				
			||||
$rv = system('.git/hooks/nhsub',"--$ARGV[0]",@ARGV[1..$#ARGV]);
 | 
				
			||||
if($rv){
 | 
				
			||||
        print "warning: nhsub failed: $rv $!\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
if(length $ENV{GIT_PREFIX}){
 | 
				
			||||
        chdir($ENV{GIT_PREFIX}) or die "Can't chdir $ENV{GIT_PREFIX}: $!";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
exec "git", @ARGV or die "Can't exec git: $!";
 | 
				
			||||
@ -0,0 +1,252 @@
 | 
				
			||||
#
 | 
				
			||||
# NetHack 3.7  NHgithook.pm       $NHDT-Date: 1596498406 2020/08/03 23:46:46 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.7 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# NetHack Git Hook Module
 | 
				
			||||
 | 
				
			||||
package NHgithook;
 | 
				
			||||
use Cwd;
 | 
				
			||||
 | 
				
			||||
###
 | 
				
			||||
### CONFIG
 | 
				
			||||
###
 | 
				
			||||
my $trace = 0;
 | 
				
			||||
my $tracefile = "/tmp/nhgitt.$$";
 | 
				
			||||
 | 
				
			||||
# OS hackery
 | 
				
			||||
my $DS = quotemeta('/');
 | 
				
			||||
if ($^O eq "MSWin32")
 | 
				
			||||
{
 | 
				
			||||
    $DS = quotemeta('\\');
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
our %saved_env;
 | 
				
			||||
our @saved_argv;
 | 
				
			||||
our $saved_input;
 | 
				
			||||
 | 
				
			||||
sub saveSTDIN {
 | 
				
			||||
	@saved_input = <STDIN>;
 | 
				
			||||
 | 
				
			||||
	if($trace){
 | 
				
			||||
		print TRACE "STDIN:\n";
 | 
				
			||||
		print TRACE $saved_input;
 | 
				
			||||
		print TRACE "ENDSTDIN\n";
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	tie *STDIN, 'NHIO::STDIN', @saved_input;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# XXX this needs a re-write (don't tie and untie, just set NEXT=0)
 | 
				
			||||
#  (the sensitive thing is @foo = <STDIN> )
 | 
				
			||||
sub resetSTDIN{
 | 
				
			||||
        my $x = tied(*STDIN);
 | 
				
			||||
        my %x = %$x;
 | 
				
			||||
        my $data = @$x{DATA};
 | 
				
			||||
        untie *STDIN;
 | 
				
			||||
        tie *STDIN, 'NHIO::STDIN', $data;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# don't need this now
 | 
				
			||||
#sub restore {
 | 
				
			||||
#	open STDIN, "<", \$saved_input or die "reopen STDIN: $!";
 | 
				
			||||
#	@ARGV = @saved_argv;
 | 
				
			||||
#	%ENV = %saved_env;
 | 
				
			||||
#}
 | 
				
			||||
 | 
				
			||||
sub PRE {
 | 
				
			||||
	&do_hook("PRE");
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub POST {
 | 
				
			||||
	&do_hook("POST");
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
###
 | 
				
			||||
### store githash and gitbranch in dat/gitinfo.txt
 | 
				
			||||
###
 | 
				
			||||
 | 
				
			||||
sub nhversioning {
 | 
				
			||||
    use strict;
 | 
				
			||||
    use warnings;
 | 
				
			||||
 | 
				
			||||
    my $git_sha = `git rev-parse HEAD`;
 | 
				
			||||
    $git_sha =~ s/\s+//g;
 | 
				
			||||
    my $git_branch = `git rev-parse --abbrev-ref HEAD`;
 | 
				
			||||
    $git_branch =~ s/\s+//g;
 | 
				
			||||
    die "git rev-parse failed" unless(length $git_sha and length $git_branch);
 | 
				
			||||
    my $exists = 0;
 | 
				
			||||
 | 
				
			||||
    if (open my $fh, '<', 'dat/gitinfo.txt') {
 | 
				
			||||
        $exists = 1;
 | 
				
			||||
        my $hashok = 0;
 | 
				
			||||
        my $branchok = 0;
 | 
				
			||||
        while (my $line = <$fh>) {
 | 
				
			||||
            if ((index $line, $git_sha) >= 0) {
 | 
				
			||||
                $hashok++;
 | 
				
			||||
            }
 | 
				
			||||
            if ((index $line, $git_branch) >= 0) {
 | 
				
			||||
                $branchok++;
 | 
				
			||||
            }
 | 
				
			||||
        }
 | 
				
			||||
        close $fh;
 | 
				
			||||
        if ($hashok && $branchok) {
 | 
				
			||||
            print "dat/gitinfo.txt unchanged, githash=".$git_sha."\n";
 | 
				
			||||
            return;
 | 
				
			||||
        }
 | 
				
			||||
    } else {
 | 
				
			||||
	print "WARNING: Can't find dat directory\n" unless(-d "dat");
 | 
				
			||||
    }
 | 
				
			||||
    if (open my $fh, '>', 'dat/gitinfo.txt') {
 | 
				
			||||
        my $how = ($exists ? "updated" : "created");
 | 
				
			||||
        print $fh 'githash='.$git_sha."\n";
 | 
				
			||||
        print $fh 'gitbranch='.$git_branch."\n";
 | 
				
			||||
        print "dat/gitinfo.txt ".$how.", githash=".$git_sha."\n";
 | 
				
			||||
    } else {
 | 
				
			||||
	print "WARNING: Unable to open dat/gitinfo.txt: $!\n";
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# PRIVATE
 | 
				
			||||
sub do_hook {
 | 
				
			||||
	my($p) = @_;
 | 
				
			||||
	my $hname = $0;
 | 
				
			||||
	$hname =~ s!^((.*$DS)|())(.*)!$1$p-$4!;
 | 
				
			||||
	if(-x $hname){
 | 
				
			||||
		print TRACE "START $p: $hname\n" if($trace);
 | 
				
			||||
 | 
				
			||||
		open TOHOOK, "|-", $hname or die "open $hname: $!";
 | 
				
			||||
		print TOHOOK <STDIN>;
 | 
				
			||||
		close TOHOOK or die "close $hname: $! $?";
 | 
				
			||||
 | 
				
			||||
		print TRACE "END $p\n" if($trace);
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub trace_start {
 | 
				
			||||
	return unless($trace);
 | 
				
			||||
	my $self = shift;
 | 
				
			||||
	open TRACE, ">>", $tracefile;
 | 
				
			||||
	print TRACE "START CLIENT PID:$$ ARGV:\n";
 | 
				
			||||
	print TRACE "CWD: " . cwd() . "\n";
 | 
				
			||||
	print TRACE "[0] $0\n";
 | 
				
			||||
	my $x1;
 | 
				
			||||
	for(my $x=0;$x<scalar @ARGV;$x++){
 | 
				
			||||
		$x1 = $x+1;
 | 
				
			||||
		print TRACE "[$x1] $ARGV[$x]\n";
 | 
				
			||||
	}
 | 
				
			||||
	print TRACE "ENV:\n";
 | 
				
			||||
	foreach my $k (sort keys %ENV){
 | 
				
			||||
		next unless ($k =~ m/(^GIT_)|(^NH)/);
 | 
				
			||||
		print TRACE " $k => $ENV{$k}\n";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
BEGIN {
 | 
				
			||||
	%saved_env = %ENV;
 | 
				
			||||
	@saved_argv = @ARGV;
 | 
				
			||||
	&trace_start;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
###
 | 
				
			||||
### ugly mess so we can re-read STDIN
 | 
				
			||||
###
 | 
				
			||||
package NHIO::STDIN;
 | 
				
			||||
sub TIEHANDLE {
 | 
				
			||||
        my $class = shift;
 | 
				
			||||
        my %fh;
 | 
				
			||||
                # XXX yuck
 | 
				
			||||
        if(ref @_[0]){
 | 
				
			||||
                $fh{DATA} = @_[0];
 | 
				
			||||
        } else {
 | 
				
			||||
                $fh{DATA} = \@_;
 | 
				
			||||
        }   
 | 
				
			||||
        $fh{NEXT} = 0;
 | 
				
			||||
        return bless \%fh, $class;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub READLINE {
 | 
				
			||||
        my $self = shift;
 | 
				
			||||
        return undef if($self->{EOF});
 | 
				
			||||
        if(wantarray){
 | 
				
			||||
                my $lim = $#{$self->{DATA}};
 | 
				
			||||
                my @ary = @{$self->{DATA}}[$self->{NEXT}..$lim];
 | 
				
			||||
                my @rv = @ary[$self->{NEXT}..$#ary];
 | 
				
			||||
                $self->{EOF} = 1;
 | 
				
			||||
                return @rv;
 | 
				
			||||
        } else{
 | 
				
			||||
                my $rv = $self->{DATA}[$self->{NEXT}];
 | 
				
			||||
                if(length $rv){
 | 
				
			||||
                        $self->{NEXT}++;
 | 
				
			||||
                        return $rv;
 | 
				
			||||
                } else {
 | 
				
			||||
                        $self->{EOF} = 1;
 | 
				
			||||
                        return undef;
 | 
				
			||||
                }   
 | 
				
			||||
        }   
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub EOF {
 | 
				
			||||
        $self = shift;
 | 
				
			||||
        return $self->{EOF};
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
1;
 | 
				
			||||
__END__
 | 
				
			||||
 | 
				
			||||
=head1 NAME
 | 
				
			||||
 | 
				
			||||
NHgithook - common code for NetHack git hooks (and other git bits)
 | 
				
			||||
 | 
				
			||||
=head1 SYNOPSIS
 | 
				
			||||
 | 
				
			||||
  BEGIN {
 | 
				
			||||
        my $DS = quotemeta('/');
 | 
				
			||||
	my $PDS = '/';
 | 
				
			||||
        if ($^O eq "MSWin32")
 | 
				
			||||
        {
 | 
				
			||||
            $DS = quotemeta('\\');
 | 
				
			||||
	    $PDS = '\\';
 | 
				
			||||
        }
 | 
				
			||||
 | 
				
			||||
        push(@INC, $ENV{GIT_DIR}.$PDS."hooks");    # for most hooks
 | 
				
			||||
        push(@INC, ($0 =~ m!^(.*)$DS!)[0]);	  # when the above doesn't work
 | 
				
			||||
 | 
				
			||||
        $gitdir = `git rev-parse --git-dir`;      # and when the above really doesn't work
 | 
				
			||||
        $gitdir =~ s/[\r\n]*$/;
 | 
				
			||||
        push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
  }
 | 
				
			||||
  use NHgithook;
 | 
				
			||||
  
 | 
				
			||||
  &NHgithook::saveSTDIN;
 | 
				
			||||
  &NHgithook::PRE;
 | 
				
			||||
  (core hook code)
 | 
				
			||||
  &NHgithook::POST;
 | 
				
			||||
 | 
				
			||||
=head1 DESCRIPTION
 | 
				
			||||
 | 
				
			||||
Buffers call information so multiple independent actions may be coded for
 | 
				
			||||
Git hooks and similar Git callouts.
 | 
				
			||||
 | 
				
			||||
=head1 SETUP
 | 
				
			||||
 | 
				
			||||
Changing the C<$trace> and C<$tracefile> variables requires editing the
 | 
				
			||||
module source.  Setting C<$trace> enables tracing, logs basic information,
 | 
				
			||||
and leaves the C<TRACE> filehandle open for additional output; output to this
 | 
				
			||||
filehandle must be guarded by C<$NHgithook::trace>.  Setting
 | 
				
			||||
C<$tracefile> specifies the file used for trace output.  Note that C<$$>
 | 
				
			||||
may be useful since multiple processes may be live at the same time.
 | 
				
			||||
 | 
				
			||||
=head1 FUNCTIONS
 | 
				
			||||
 | 
				
			||||
  NHgithook::saveSTDIN  reads STDIN until EOF and saves it
 | 
				
			||||
  NHgithook::PRE 	runs the PRE hook, if it exists
 | 
				
			||||
  NHgithook::POST 	runs the POST hook, if it exists
 | 
				
			||||
 | 
				
			||||
=head1 BUGS
 | 
				
			||||
 | 
				
			||||
Some features not well tested, especially under Windows.
 | 
				
			||||
 | 
				
			||||
=head1 AUTHOR
 | 
				
			||||
 | 
				
			||||
Kenneth Lorber (keni@his.com)
 | 
				
			||||
@ -0,0 +1,398 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  NHsubst       $NHDT-Date: 1596498407 2020/08/03 23:46:47 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# git merge driver for substitutions (like RCS/CVS)
 | 
				
			||||
# driver line:   .... %O %A %B %L
 | 
				
			||||
use strict;
 | 
				
			||||
 | 
				
			||||
my $debug = 0;
 | 
				
			||||
my $rawin = 0;	# feed diff to stdin for testing (do NOT set $debug=1)
 | 
				
			||||
 | 
				
			||||
# We want TRACE open so we don't need to test $debug everywhere, but we skip
 | 
				
			||||
# this first block because it's expensive and dumpfile() hangs with $rawin.
 | 
				
			||||
my $sink = ($^O eq "MSWin32") ? "NUL" : "/dev/null";
 | 
				
			||||
my $dbgfile = ($^O eq "MSWin32") ? "$ENV{TEMP}.$$" : "/tmp/trace.$$";
 | 
				
			||||
open TRACE, ">>", $rawin?"/dev/tty":(($debug==0)? $sink : $dbgfile);
 | 
				
			||||
print TRACE "TEST TRACE\n";
 | 
				
			||||
if($debug){
 | 
				
			||||
	print TRACE "START CLIENT ARGV:\n";
 | 
				
			||||
	print TRACE "[0] $0\n";
 | 
				
			||||
	my $x1;
 | 
				
			||||
	for(my $x=0;$x<scalar @ARGV;$x++){
 | 
				
			||||
		$x1 = $x+1;
 | 
				
			||||
		print TRACE "[$x1] $ARGV[$x]\n";
 | 
				
			||||
	}
 | 
				
			||||
	print TRACE "ENV:\n";
 | 
				
			||||
	foreach my $k (sort keys %ENV){
 | 
				
			||||
		next unless ($k =~ m/^GIT_/);
 | 
				
			||||
		print TRACE " $k => $ENV{$k}\n";
 | 
				
			||||
	}
 | 
				
			||||
	print TRACE "CWD: " . `pwd`;
 | 
				
			||||
	&dumpfile($ARGV[0], "[0O]");
 | 
				
			||||
	&dumpfile($ARGV[1], "[1A]");
 | 
				
			||||
	&dumpfile($ARGV[2], "[2B]");
 | 
				
			||||
	print TRACE "L=$ARGV[3]\n";
 | 
				
			||||
	print TRACE "END\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
my $mark_len = $ARGV[3];
 | 
				
			||||
$mark_len = 3 if($mark_len==0 && $rawin);
 | 
				
			||||
 | 
				
			||||
my $mark_start = '<' x $mark_len;
 | 
				
			||||
my $mark_middle = '=' x $mark_len;
 | 
				
			||||
my $mark_end = '>' x $mark_len;
 | 
				
			||||
 | 
				
			||||
my $PREFIX;
 | 
				
			||||
# pick up the prefix for substitutions in this repo
 | 
				
			||||
if($rawin){
 | 
				
			||||
	$PREFIX = "TEST";
 | 
				
			||||
} else {
 | 
				
			||||
	$PREFIX = `git config --local --get nethack.substprefix`;
 | 
				
			||||
	chomp($PREFIX);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
my @out;
 | 
				
			||||
my $cntout;
 | 
				
			||||
if($rawin){
 | 
				
			||||
	@out = <STDIN>;
 | 
				
			||||
} else {
 | 
				
			||||
	#system "git merge-file -p .... > temp
 | 
				
			||||
	my $tags = "-L CURRENT -L ANCESTOR -L OTHER";	# XXX should "CURRENT" be "MINE"?
 | 
				
			||||
	@out = `git merge-file -p $tags $ARGV[1] $ARGV[0] $ARGV[2]`;
 | 
				
			||||
	#NB: we don't check the exit value because it's useless
 | 
				
			||||
	print TRACE "MERGE-FILE START\n".join("",@out)."MERGE-FILE END\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
($cntout,@out) = &edit_merge(@out);
 | 
				
			||||
 | 
				
			||||
if($rawin){
 | 
				
			||||
	print "COUNT: $cntout\n";
 | 
				
			||||
	print @out;
 | 
				
			||||
} else {
 | 
				
			||||
	# spit @out to $ARGV[1]  (careful: what about EOL character?)
 | 
				
			||||
	open OUT, ">$ARGV[1]" or die "Can't open $ARGV[1]";
 | 
				
			||||
	print OUT @out;
 | 
				
			||||
	close OUT;
 | 
				
			||||
 | 
				
			||||
	print TRACE "WRITING START ($ARGV[1])\n".join("",@out)."WRITING END\n";
 | 
				
			||||
	&dumpfile($ARGV[1], "READBACK");
 | 
				
			||||
}
 | 
				
			||||
print TRACE "COUNT: $cntout\n";
 | 
				
			||||
 | 
				
			||||
exit( ($cntout>0) ? 1 : 0);
 | 
				
			||||
 | 
				
			||||
#git merge-file [-L <current-name> [-L <base-name> [-L <other-name>]]]
 | 
				
			||||
#               [--ours|--theirs|--union] [-p|--stdout] [-q|--quiet] [--marker-size=<n>]
 | 
				
			||||
#               [--[no-]diff3] <current-file> <base-file> <other-file>
 | 
				
			||||
#The `merge.*.driver` variable's value is used to construct a command to run to merge ancestor's
 | 
				
			||||
#           version (%O), current version (%A) and the other branches' version (%B). These three tokens are
 | 
				
			||||
#           replaced with the names of temporary files that hold the contents of these versions when the
 | 
				
			||||
#           command line is built. Additionally, %L will be replaced with the conflict marker size (see
 | 
				
			||||
#           below).
 | 
				
			||||
 | 
				
			||||
# keep failing so we don't need to keep changing the setup while building this script
 | 
				
			||||
 | 
				
			||||
sub dumpfile {
 | 
				
			||||
	my($file, $tag) = @_;
 | 
				
			||||
	print TRACE "FILE $tag START\n";
 | 
				
			||||
	print TRACE `hexdump -C $file`;
 | 
				
			||||
	print TRACE "FILE END\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub edit_merge {
 | 
				
			||||
	my(@input) = @_;
 | 
				
			||||
					# $::count is a bit ugly XXX
 | 
				
			||||
	local $::count = 0;		# we need the number of conflicts for exit()
 | 
				
			||||
	my @out;
 | 
				
			||||
 | 
				
			||||
	local $_;
 | 
				
			||||
	while($_ = shift @input){
 | 
				
			||||
		if(m/^$mark_start /){
 | 
				
			||||
			print TRACE "FOUND A CONFLICT\n";
 | 
				
			||||
			my @conflict;
 | 
				
			||||
			push(@conflict, $_);
 | 
				
			||||
			while($_ = shift @input){
 | 
				
			||||
				push(@conflict, $_);
 | 
				
			||||
				if(m/^$mark_end /){
 | 
				
			||||
					last;
 | 
				
			||||
				}
 | 
				
			||||
			}
 | 
				
			||||
			push(@out, &edit_conflict(@conflict));
 | 
				
			||||
		} else {
 | 
				
			||||
			push(@out, $_);
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
	print TRACE "RETURN count=$::count\n";
 | 
				
			||||
	return($::count, @out);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub edit_conflict {
 | 
				
			||||
	my(@in) = @_;
 | 
				
			||||
 | 
				
			||||
	print TRACE "EDIT START: " . scalar(@in)."\n";
 | 
				
			||||
	if($debug){
 | 
				
			||||
		foreach my $x (@in){ my $xx = $x; chomp($xx); print TRACE "-$xx-\n"; }
 | 
				
			||||
	}
 | 
				
			||||
	print TRACE "EDIT END INPUT\n";
 | 
				
			||||
 | 
				
			||||
		# one-line change - use as base case to develop the code
 | 
				
			||||
		#   ours	ARGV[1]	top-of-diff
 | 
				
			||||
		#   theirs	ARGV[2] bottom-of-diff
 | 
				
			||||
		# simple conflict:
 | 
				
			||||
		# [0] <<<<<<< d1
 | 
				
			||||
		# [1] $$PREFIX-Date: 1 ...
 | 
				
			||||
		# [2] =======
 | 
				
			||||
		# [3] $$PREFIX-Date: 3 ...
 | 
				
			||||
		# [4] >>>>>>> d3
 | 
				
			||||
	if(scalar(@in) == 5 && $in[2] =~ m/^$mark_middle/){
 | 
				
			||||
		my $back = &merge_one_line_maybe($in[1],$in[3]);	# (ours, theirs)
 | 
				
			||||
		if(!defined $back){
 | 
				
			||||
			$::count++;	# leave the conflict
 | 
				
			||||
			return @in;
 | 
				
			||||
		} else {
 | 
				
			||||
			return ($back);
 | 
				
			||||
		}
 | 
				
			||||
		# NOTREACHED
 | 
				
			||||
	} else {
 | 
				
			||||
# XXX LATER
 | 
				
			||||
# Start at the top of both sections and work downwards.  As long as the lines can be merged,
 | 
				
			||||
# push them out and keep going.  If there are lines left, we will still have a conflict but
 | 
				
			||||
# we can try to make it smaller.  Push out the start-conflict marker.  Start at the
 | 
				
			||||
# bottom of both section and work upwards.  As long as the lines can be merged, reverse push out
 | 
				
			||||
# the merged line and keep going.  (We know there will be lines left at some point.)  Push out
 | 
				
			||||
# remaining (middle) lines from OURS.  Push out mark_middle.  Push out remaining middle lines
 | 
				
			||||
# from THEIRS.  Push out end-conflict marker.  $::count++; return (@a,$b,@c,$d,@e,$f,@g)
 | 
				
			||||
# @a
 | 
				
			||||
# $b = <<<
 | 
				
			||||
# @c
 | 
				
			||||
# $d = ===
 | 
				
			||||
# @e
 | 
				
			||||
# $f = >>>
 | 
				
			||||
# @g
 | 
				
			||||
	}
 | 
				
			||||
		# not matched - return the unchanged conflict
 | 
				
			||||
	$::count++;
 | 
				
			||||
	return @in;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# XXX This is expensive.  Add a quick check for "anything that looks like a subst var" and just
 | 
				
			||||
#  declare the lines unmergeable if it fails.
 | 
				
			||||
sub merge_one_line_maybe {
 | 
				
			||||
	my($ours, $theirs) = @_;
 | 
				
			||||
 | 
				
			||||
	my $more = 1;
 | 
				
			||||
	my $fail = 0;
 | 
				
			||||
	my $out = '';
 | 
				
			||||
		# TYPES:
 | 
				
			||||
		# 0 no match
 | 
				
			||||
		# 1 unexpanded var
 | 
				
			||||
		# 2 expanded var
 | 
				
			||||
		# 3 non-var text
 | 
				
			||||
	my($ourstype, $theirtype);
 | 
				
			||||
	my($oursvar, $theirvar);
 | 
				
			||||
	my($oursval, $theirval);
 | 
				
			||||
 | 
				
			||||
	while($more){
 | 
				
			||||
		($ourstype, $theirtype) = (0,0);
 | 
				
			||||
		($oursvar, $theirvar) = (undef, undef);
 | 
				
			||||
		($oursvar, $theirvar) = (undef, undef);
 | 
				
			||||
			# unexpanded var
 | 
				
			||||
		if($ours =~ m/\G\$$PREFIX-([A-Z][a-z]+)\$/gc){
 | 
				
			||||
			$ourstype = 1;
 | 
				
			||||
			$oursvar = $1;
 | 
				
			||||
		}
 | 
				
			||||
		if($theirs =~ m/\G\$$PREFIX-([A-Z][a-z]+)\$/gc){
 | 
				
			||||
			$theirtype = 1;
 | 
				
			||||
			$theirvar = $1;
 | 
				
			||||
		}
 | 
				
			||||
			# expanded var
 | 
				
			||||
		unless($ourstype){
 | 
				
			||||
			if($ours =~ m/\G\$$PREFIX-([A-Za-z]+):\s+(.*?)\s\$/gc){
 | 
				
			||||
				$ourstype = 2;
 | 
				
			||||
				$oursvar = $1;
 | 
				
			||||
				$oursval = $2;
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
		unless($theirtype){
 | 
				
			||||
			if($theirs =~ m/\G\$$PREFIX-([A-Za-z]+):\s+(.*?)\s\$/gc){
 | 
				
			||||
				$theirtype = 2;
 | 
				
			||||
				$theirvar = $1;
 | 
				
			||||
				$theirval = $2;
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
			# non-var text
 | 
				
			||||
		unless($ourstype){
 | 
				
			||||
			if($ours =~ m/\G(\$?[^\x24]*)/gc){
 | 
				
			||||
				$ourstype = 3;
 | 
				
			||||
				$oursval = $1;
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
		unless($theirtype){
 | 
				
			||||
			if($theirs =~ m/\G(\$?[^\x24]*)/gc){
 | 
				
			||||
				$theirtype = 3;
 | 
				
			||||
				$theirval = $1;
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
print TRACE "MID: $ourstype/$oursval $theirtype/$theirval\n";
 | 
				
			||||
		# are we done?
 | 
				
			||||
		if(pos($ours)==length $ours && pos($theirs) == length $theirs){
 | 
				
			||||
			$more = 0;
 | 
				
			||||
		}
 | 
				
			||||
		if($ourstype == 0 && $theirtype == 0){
 | 
				
			||||
			die "NHsubst MERGE FAILED - aborted infinite loop\n";
 | 
				
			||||
		}
 | 
				
			||||
 | 
				
			||||
		# now see if ours and their match or can be resolved
 | 
				
			||||
			# text
 | 
				
			||||
		if($ourstype == 3 && $theirtype == 3){
 | 
				
			||||
#mismatch is \s vs \s\s - where is this coming from?
 | 
				
			||||
			# HACK - hopefully temporary
 | 
				
			||||
			if($oursval =~ m/^\s+$/ && $theirval =~ m/^\s+$/){
 | 
				
			||||
				$out .= $oursval;
 | 
				
			||||
				next;
 | 
				
			||||
			}
 | 
				
			||||
			if($oursval eq $theirval){
 | 
				
			||||
				$out .= $oursval;
 | 
				
			||||
				next;
 | 
				
			||||
			}
 | 
				
			||||
			return undef;
 | 
				
			||||
		}
 | 
				
			||||
		if($ourstype == 3 || $theirtype == 3){
 | 
				
			||||
			return undef;
 | 
				
			||||
		}
 | 
				
			||||
# XXX we could do better: on failure of one field, return 2 lines with the fields we _can_ fix
 | 
				
			||||
#  substituted into those lines, leaving only the fail-to-match bits for the user to
 | 
				
			||||
#  deal with.  Later.
 | 
				
			||||
			# vars (all 4 cases)
 | 
				
			||||
		if($oursvar ne $theirvar){
 | 
				
			||||
			return undef;
 | 
				
			||||
		}
 | 
				
			||||
		my $m = merge_one_var_maybe($oursvar, $oursval, $theirval);
 | 
				
			||||
		if(! defined $m){
 | 
				
			||||
			return undef;
 | 
				
			||||
		}
 | 
				
			||||
		$out .= $m;
 | 
				
			||||
	}
 | 
				
			||||
	return $out;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# return undef if we can't merge the values; $NAME: VALUE $ or $NAME$ (as appropriate) if we can.
 | 
				
			||||
sub merge_one_var_maybe {
 | 
				
			||||
	my($varname, $oursval, $theirval) = @_;
 | 
				
			||||
print TRACE "MVM: -$varname-$oursval-$theirval-\n";
 | 
				
			||||
	my $resolvedas;
 | 
				
			||||
	{
 | 
				
			||||
		no strict;
 | 
				
			||||
		my $fn = "PREFIX::$varname";
 | 
				
			||||
		if(defined &$fn){
 | 
				
			||||
			$resolvedas = &$fn($PREFIX,$varname,$oursval, $theirval);
 | 
				
			||||
		} else {
 | 
				
			||||
			$resolvedas = undef;	# can't resolve
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if(!defined $resolvedas){
 | 
				
			||||
		$::count++;	# we have an externally visible conflict
 | 
				
			||||
		return undef;
 | 
				
			||||
	} else {
 | 
				
			||||
		return $resolvedas;
 | 
				
			||||
	}
 | 
				
			||||
	# NOTREACHED
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
package PREFIX;
 | 
				
			||||
# Resolve the conflict of a single var's 2 values.  Return undef to leave the conflict.
 | 
				
			||||
sub Date {
 | 
				
			||||
	my($PREFIX, $varname, $mine, $theirs) = @_;
 | 
				
			||||
	my $m = ($mine =~ m/(\d+)/)[0];
 | 
				
			||||
	my $t = ($theirs =~ m/(\d+)/)[0];
 | 
				
			||||
	return undef unless ($m>0) && ($t>0);
 | 
				
			||||
 | 
				
			||||
	return "\$$PREFIX-$varname: " . (($m>$t)?$mine:$theirs) .' $';
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#sub Header {
 | 
				
			||||
#sub Author {
 | 
				
			||||
 | 
				
			||||
sub Branch {
 | 
				
			||||
	my($PREFIX, $varname, $mine, $theirs) = @_;
 | 
				
			||||
	$mine =~ s/^\s+//;	$mine =~ s/\s+$//;
 | 
				
			||||
	$theirs =~ s/^\s+//;	$theirs =~ s/\s+$//;
 | 
				
			||||
	return "\$$PREFIX-$varname: $mine \$" if(length $mine);
 | 
				
			||||
	return "\$$PREFIX-$varname: $theirs \$" if(length $theirs);
 | 
				
			||||
	return "\$$PREFIX-$varname\$" if(length $theirs);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub Revision {
 | 
				
			||||
	my($PREFIX, $varname, $mine, $theirs) = @_;
 | 
				
			||||
	my($m) = ($mine =~ m/1.(\d+)/);
 | 
				
			||||
	my($t) = ($theirs =~ m/1.(\d+)/);
 | 
				
			||||
	if($m > 0 && $t > 0){
 | 
				
			||||
		my $q = ($m > $t) ? $m : $t;
 | 
				
			||||
		return "\$$PREFIX-$varname: 1.$q \$";
 | 
				
			||||
	}
 | 
				
			||||
	if($m > 0){
 | 
				
			||||
		return "\$$PREFIX-$varname: 1.$m \$";
 | 
				
			||||
	}
 | 
				
			||||
	if($t > 0){
 | 
				
			||||
		return "\$$PREFIX-$varname: 1.$t \$";
 | 
				
			||||
	}
 | 
				
			||||
	return "\$$PREFIX-$varname\$";
 | 
				
			||||
}
 | 
				
			||||
__END__
 | 
				
			||||
 | 
				
			||||
TEST 1:
 | 
				
			||||
<<< d1
 | 
				
			||||
$TEST-Date: 1 $
 | 
				
			||||
===
 | 
				
			||||
$TEST-Date: 3 $
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 2:
 | 
				
			||||
nothing
 | 
				
			||||
at all
 | 
				
			||||
 | 
				
			||||
TEST 3:
 | 
				
			||||
<<< d1
 | 
				
			||||
a line
 | 
				
			||||
===
 | 
				
			||||
one line
 | 
				
			||||
two lines
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 4:
 | 
				
			||||
<<< d1
 | 
				
			||||
$TEST-Date: 1 $ yes
 | 
				
			||||
===
 | 
				
			||||
$TEST-Date: 1 $ no
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 5:
 | 
				
			||||
<<< d1
 | 
				
			||||
$TEST-Date: 3 $ yes
 | 
				
			||||
===
 | 
				
			||||
$TEST-Date: 1 $ yes
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 6:
 | 
				
			||||
<<< d1
 | 
				
			||||
$TEST-Date: 3 $ yes$TEST-Date: 4 $
 | 
				
			||||
===
 | 
				
			||||
$TEST-Date: 1 $ yes$TEST-Date: 5 $
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 7:
 | 
				
			||||
<<< d1
 | 
				
			||||
$TEST-Branch: mine $
 | 
				
			||||
===
 | 
				
			||||
$TEST-Branch: theirs $
 | 
				
			||||
>>> d3
 | 
				
			||||
 | 
				
			||||
TEST 8:
 | 
				
			||||
<<< d1
 | 
				
			||||
/* NetHack 3.7        objnam.c        $TEST-Date$ $TEST-Branch$:$TEST-Revision$ */
 | 
				
			||||
===
 | 
				
			||||
/* NetHack 3.7        objnam.c        $TEST-Date: 1426977394 2015/03/21 22:36:34 $  $TEST-Branch: master $:$TEST-Revision: 1.108 $ */
 | 
				
			||||
>>> d3
 | 
				
			||||
@ -0,0 +1,161 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  NHtext       $NHDT-Date: 1596498408 2020/08/03 23:46:48 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.9 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# clean/smudge filter for handling substitutions
 | 
				
			||||
use strict;
 | 
				
			||||
 | 
				
			||||
#my $debug = 0;		# save trace to file
 | 
				
			||||
#my $debug2 = 0;		# annotate output when running from command line
 | 
				
			||||
 | 
				
			||||
#my $sink = ($^O eq "MSWin32")? "NUL" :"/dev/null";
 | 
				
			||||
#my $dbgfile = ($^O eq "MSWin32") ? "$ENV{TEMP}.$$" : "/tmp/trace.$$";
 | 
				
			||||
#open TRACE, ">>", ($debug==0)? $sink : $dbgfile;
 | 
				
			||||
 | 
				
			||||
sub git_config {
 | 
				
			||||
	my($section, $var) = @_;
 | 
				
			||||
	local($_);
 | 
				
			||||
		# Sigh.  Without GIT_DIR we have to do it the slow way, and sometimes we don't
 | 
				
			||||
		# have GIT_DIR.
 | 
				
			||||
	if(0 == length($ENV{GIT_DIR})){
 | 
				
			||||
		my $raw = `git config --local --get $section.$var`;
 | 
				
			||||
		chomp($raw);
 | 
				
			||||
		return $raw
 | 
				
			||||
	}
 | 
				
			||||
	open(CONFIG, "<", "$ENV{GIT_DIR}/config") or die "Missing .git/config: $!";
 | 
				
			||||
	while(<CONFIG>){
 | 
				
			||||
		m/^\[$section]/ && do {
 | 
				
			||||
			while(<CONFIG>){
 | 
				
			||||
				m/^\s+$var\s+=\s+(.*)/ && do {
 | 
				
			||||
					return $1;
 | 
				
			||||
				};
 | 
				
			||||
			}
 | 
				
			||||
		};
 | 
				
			||||
	}
 | 
				
			||||
	die "Missing config var: [$section] $var\n";
 | 
				
			||||
}
 | 
				
			||||
# pick up the prefix for substitutions in this repo
 | 
				
			||||
my $PREFIX = &git_config('nethack','substprefix');
 | 
				
			||||
 | 
				
			||||
my $submode = 0;	# ok to make non-cleaning changes to file
 | 
				
			||||
my $mode;
 | 
				
			||||
 | 
				
			||||
if($ARGV[0] eq "--clean"){
 | 
				
			||||
	$mode = "c";
 | 
				
			||||
	if(0 == 0+$ENV{NHMODE}){
 | 
				
			||||
		$submode = 1;		# do NOT add extra changes to the file
 | 
				
			||||
#		print TRACE "SKIPPING\n";
 | 
				
			||||
	}
 | 
				
			||||
} elsif($ARGV[0] eq "--smudge"){
 | 
				
			||||
	$mode = "s";
 | 
				
			||||
} else {
 | 
				
			||||
	warn "Unknown mode '$ARGV[0]'\n";
 | 
				
			||||
	exit 1;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# XXX for now, there isn't any - if we get called, we subst.  No options for now.
 | 
				
			||||
# get relevent config info
 | 
				
			||||
#XXX
 | 
				
			||||
#git check-attr -a $ARGV[1]
 | 
				
			||||
 | 
				
			||||
# Process stdin to stdout.
 | 
				
			||||
# For speed we read in the entire file then do the substitutions.
 | 
				
			||||
 | 
				
			||||
local($_) = '';
 | 
				
			||||
my $len;
 | 
				
			||||
while(1){
 | 
				
			||||
		# On at least some systems we only get 64K.
 | 
				
			||||
	my $len = sysread(STDIN, $_, 999999, length($_));
 | 
				
			||||
	last if($len == 0);
 | 
				
			||||
	die "read failed: $!" unless defined($len);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# $1 - var and value (including trailing space but not $)
 | 
				
			||||
# $2 - var
 | 
				
			||||
# $4 - value or undef
 | 
				
			||||
#	s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\N{DOLLAR SIGN}]+))?)\$/&handlevar($2,$4)/eg;
 | 
				
			||||
s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\x24]+))?)\$/&handlevar($2,$4)/ego;
 | 
				
			||||
 | 
				
			||||
die "write failed: $!" unless defined syswrite(STDOUT, $_);
 | 
				
			||||
exit 0;
 | 
				
			||||
 | 
				
			||||
sub handlevar {
 | 
				
			||||
	my($var, $val) = @_;
 | 
				
			||||
#	print "HIT '$var' '$val'\n" if($debug2);
 | 
				
			||||
 | 
				
			||||
	my $subname = "PREFIX::$var";
 | 
				
			||||
	if(defined &$subname){
 | 
				
			||||
		no strict;
 | 
				
			||||
		$val =~ s/\s+$//;
 | 
				
			||||
		$val = &$subname($val,$mode,$submode);
 | 
				
			||||
	} else {
 | 
				
			||||
		warn "No handler for \$$PREFIX-$var\n";
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if(length $val){
 | 
				
			||||
		return "\$$PREFIX-$var: $val \$";
 | 
				
			||||
	} else {
 | 
				
			||||
		return "\$$PREFIX-$var\$";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
package PREFIX;
 | 
				
			||||
use POSIX qw(strftime);
 | 
				
			||||
 | 
				
			||||
# On push, put in the current date because we changed the file.
 | 
				
			||||
# On pull, keep the current value so we can see the last change date.
 | 
				
			||||
sub Date {
 | 
				
			||||
	my($val, $mode, $submode) = @_;
 | 
				
			||||
	if($mode eq "c"){
 | 
				
			||||
		if($submode==0){
 | 
				
			||||
			# we add this to make merge easier for now XXX
 | 
				
			||||
			my $now = time; # not %s below - may not be portable
 | 
				
			||||
			# YYYY/MM/DD HH:MM:SS
 | 
				
			||||
			$val = "$now " . strftime("%Y/%m/%d %H:%M:%S", gmtime($now));
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
#	if($mode eq "s"){
 | 
				
			||||
#	}
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#sub Header {
 | 
				
			||||
#}
 | 
				
			||||
#sub Author {
 | 
				
			||||
#}
 | 
				
			||||
 | 
				
			||||
# NB: the standard-ish Revision line isn't enough - you need Branch:Revision -
 | 
				
			||||
#     but we split it into 2 so we can use the standard processing code on Revision
 | 
				
			||||
#     and just slip Branch in.
 | 
				
			||||
sub Branch {
 | 
				
			||||
	my($val, $mode, $submode) = @_;
 | 
				
			||||
	if($mode eq "c"){
 | 
				
			||||
		if($submode==0){
 | 
				
			||||
			$val = `git symbolic-ref -q --short HEAD`;
 | 
				
			||||
			$val =~ s/[\n\r]*$//;
 | 
				
			||||
			$val =~ s/^\*\s*//;
 | 
				
			||||
			$val = "(unknown)" unless($val =~ m/^[[:print:]]+$/);
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
#	if($mode eq "s"){
 | 
				
			||||
#	}
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub Revision {
 | 
				
			||||
	my($val, $mode, $submode) = @_;
 | 
				
			||||
	if($mode eq "c"){
 | 
				
			||||
		if($submode==0){
 | 
				
			||||
			my $file = $ARGV[1];
 | 
				
			||||
			my @val = `git log --follow --oneline $file`;
 | 
				
			||||
			my $ver = 0+$#val;
 | 
				
			||||
			$ver = 0 if($ver < 0);
 | 
				
			||||
			$val = "1.$ver";
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
#	if($mode eq "s"){
 | 
				
			||||
#	}
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1 @@
 | 
				
			||||
.git/hooks
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  applypatch-msg       $NHDT-Date: 1596498405 2020/08/03 23:46:45 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  commit-msg       $NHDT-Date: 1596498405 2020/08/03 23:46:45 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,521 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# $NHDT-Date: 1524689646 2018/04/25 20:54:06 $ Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.7 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# Note: was originally called nhdate; the rename is not reflected in the code.
 | 
				
			||||
 | 
				
			||||
use strict;
 | 
				
			||||
our %opt;	#cmd v n f F m (other single char, but we don't care)
 | 
				
			||||
my $mode;	# a c d f (add, commit, date, date -f)
 | 
				
			||||
 | 
				
			||||
if(length $ENV{GIT_PREFIX}){
 | 
				
			||||
        chdir($ENV{GIT_PREFIX}) or die "Can't chdir $ENV{GIT_PREFIX}: $!";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#SO how do we know if a file has changed?
 | 
				
			||||
#(git status: git status --porcelain --ignored -- FILES.
 | 
				
			||||
#maybe + -z but it's a question of rename operations - probably doesn't
 | 
				
			||||
# matter, but need to experiment.
 | 
				
			||||
 | 
				
			||||
# key:  [dacf] first character of opt{cmd} (f if nhsub -f or add -f)
 | 
				
			||||
#	first 2 chars of "git status --porcelain --ignored"
 | 
				
			||||
# (see "git help status" for table)
 | 
				
			||||
# No default.  Undef means something unexpected happened.
 | 
				
			||||
my %codes = (
 | 
				
			||||
	'f M'=>1, 'f D'=>1,		#           [MD]   not updated
 | 
				
			||||
	'a M'=>0, 'a D'=>0,
 | 
				
			||||
	'd M'=>0, 'd D'=>0,
 | 
				
			||||
	'c M'=>0, 'c D'=>0,
 | 
				
			||||
 | 
				
			||||
	'dM '=>0, 'dMM'=>1, 'dMD'=>0,
 | 
				
			||||
	'aM '=>0, 'aMM'=>1, 'aMD'=>0,
 | 
				
			||||
	'cM '=>0, 'cMM'=>1, 'cMD'=>0,
 | 
				
			||||
	'fM '=>0, 'fMM'=>1, 'fMD'=>0,
 | 
				
			||||
				#           M        [ MD]   updated in index
 | 
				
			||||
 | 
				
			||||
	'dA '=>1, 'dAM'=>1, 'dAD'=>1,
 | 
				
			||||
	'aA '=>1, 'aAM'=>1, 'aAD'=>1,
 | 
				
			||||
	'cA '=>1, 'cAM'=>1, 'cAD'=>1,
 | 
				
			||||
	'fA '=>1, 'fAM'=>1, 'fAD'=>1,
 | 
				
			||||
				   # A        [ MD]   added to index
 | 
				
			||||
 | 
				
			||||
	'dD '=>0, 'dDM'=>0,
 | 
				
			||||
	'aD '=>1, 'aDM'=>1,
 | 
				
			||||
	'cD '=>0, 'cDM'=>0,
 | 
				
			||||
	'fD '=>1, 'fDM'=>1,
 | 
				
			||||
				   # D         [ M]   deleted from index
 | 
				
			||||
 | 
				
			||||
	'dR '=>0, 'dRM'=>1, 'dRD'=>0,
 | 
				
			||||
	'aR '=>0, 'aRM'=>1, 'aRD'=>0,
 | 
				
			||||
	'cR '=>0, 'cRM'=>1, 'cRD'=>0,
 | 
				
			||||
	'fR '=>0, 'fRM'=>1, 'fRD'=>0,
 | 
				
			||||
				#           R        [ MD]   renamed in index
 | 
				
			||||
 | 
				
			||||
	'dC '=>0, 'dCM'=>1, 'dCD'=>0,
 | 
				
			||||
	'aC '=>0, 'aCM'=>1, 'aCD'=>0,
 | 
				
			||||
	'cC '=>0, 'cCM'=>1, 'cCD'=>0,
 | 
				
			||||
	'fC '=>0, 'fCM'=>1, 'fCD'=>0,
 | 
				
			||||
				#           C        [ MD]   copied in index
 | 
				
			||||
 | 
				
			||||
	'aM '=>1, 'aA '=>1, 'aR '=>1, 'aC '=>1,
 | 
				
			||||
	'fM '=>1, 'fA '=>1, 'fR '=>1, 'fC '=>1,
 | 
				
			||||
				   # [MARC]          index and work tree matches
 | 
				
			||||
 | 
				
			||||
	'd M'=>1, 'dMM'=>1, 'dAM'=>1, 'dRM'=>1, 'dCM'=>1,
 | 
				
			||||
	'a M'=>1, 'aMM'=>1, 'aAM'=>1, 'aRM'=>1, 'aCM'=>1,
 | 
				
			||||
	'c M'=>1, 'cMM'=>1, 'cAM'=>1, 'cRM'=>1, 'cCM'=>1,
 | 
				
			||||
	'f M'=>1, 'fMM'=>1, 'fAM'=>1, 'fRM'=>1, 'fCM'=>1,
 | 
				
			||||
				   # [ MARC]     M work tree changed since index
 | 
				
			||||
 | 
				
			||||
	'd D'=>0, 'dMD'=>0, 'dAD'=>0, 'dRD'=>0, 'dCD'=>0,
 | 
				
			||||
	'a D'=>0, 'aMD'=>0, 'aAD'=>0, 'aRD'=>0, 'aCD'=>0,
 | 
				
			||||
	'c D'=>0, 'cMD'=>0, 'cAD'=>0, 'cRD'=>0, 'cCD'=>0,
 | 
				
			||||
	'f D'=>0, 'fMD'=>0, 'fAD'=>0, 'fRD'=>0, 'fCD'=>0,
 | 
				
			||||
				   # [ MARC]     D    deleted in work tree
 | 
				
			||||
 | 
				
			||||
           # -------------------------------------------------
 | 
				
			||||
           # DD    unmerged, both deleted
 | 
				
			||||
           # AU    unmerged, added by us
 | 
				
			||||
           # UD    unmerged, deleted by them
 | 
				
			||||
           # UA    unmerged, added by them
 | 
				
			||||
           # DU    unmerged, deleted by us
 | 
				
			||||
           # AA    unmerged, both added
 | 
				
			||||
           # UU    unmerged, both modified
 | 
				
			||||
           # -------------------------------------------------
 | 
				
			||||
        'a??'=>1, 'f??'=>1,		# ??    untracked
 | 
				
			||||
	'd??'=>0, 'c??'=>0,
 | 
				
			||||
 | 
				
			||||
	'f!!'=>1,			# !!    ignored
 | 
				
			||||
	'a!!'=>0, 'd!!'=>0, 'c!!'=>0,
 | 
				
			||||
 | 
				
			||||
	'f@@'=>1,			# @@    internal ignored
 | 
				
			||||
	'a@@'=>0, 'd@@'=>0, 'c@@'=>0
 | 
				
			||||
);
 | 
				
			||||
 | 
				
			||||
# OS hackery
 | 
				
			||||
my $PDS = '/';
 | 
				
			||||
if ($^O eq "MSWin32")
 | 
				
			||||
{
 | 
				
			||||
    $PDS = '\\';
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# various command line options to consider and what the code actually does:
 | 
				
			||||
#DONE nhcommit with no files should exit(0)
 | 
				
			||||
#DONE nhadd with no files should exit(0)
 | 
				
			||||
#DONE commit -a?
 | 
				
			||||
#	add root dir
 | 
				
			||||
#DONE commit -a + files -> exit(0)
 | 
				
			||||
#nothing: commit --interactive/--patch
 | 
				
			||||
#nothing: add -i/--interactive --patch/-p?
 | 
				
			||||
#nothing: add -u/--update?????? -A/--all/--no-ignore-removal???
 | 
				
			||||
#nothing (not quite right): add --no-all --ignore-removal???
 | 
				
			||||
#DONE add --refresh
 | 
				
			||||
#nothing: add -N/--intent-to-add
 | 
				
			||||
#DONE add -n - exit(0)
 | 
				
			||||
#DONE add --dry-run - exit 0
 | 
				
			||||
#DONE commit --dry-run - exit 0
 | 
				
			||||
#DONE?: add foo/\*/x (letting git expand the filenames)
 | 
				
			||||
 | 
				
			||||
my @rawlist0 = &cmdparse(@ARGV);
 | 
				
			||||
 | 
				
			||||
# Use git ls-files to expand command line filepaths with wildcards.
 | 
				
			||||
# Let's try this for all commands.
 | 
				
			||||
my @rawlist;
 | 
				
			||||
foreach my $e (@rawlist0){
 | 
				
			||||
	if($e =~ m/[?*[\\]/){
 | 
				
			||||
		my @rv = &lsfiles(undef, $e);
 | 
				
			||||
		push(@rawlist, @rv) if(@rv);
 | 
				
			||||
		if($opt{f}){
 | 
				
			||||
			my @rv = &lsfiles('-i', $e);
 | 
				
			||||
			push(@rawlist, @rv) if(@rv);
 | 
				
			||||
		}
 | 
				
			||||
	} else {
 | 
				
			||||
		push(@rawlist, $e);
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
push(@rawlist,'.') if($#rawlist == -1);
 | 
				
			||||
 | 
				
			||||
# pick up the prefix for substitutions in this repo
 | 
				
			||||
#TEST my $PREFIX = &git_config('nethack','substprefix');
 | 
				
			||||
my $PREFIX = "NHDT";
 | 
				
			||||
print "PREFIX: '$PREFIX'\n" if($opt{v});
 | 
				
			||||
 | 
				
			||||
while(@rawlist){
 | 
				
			||||
	my $raw = shift @rawlist;
 | 
				
			||||
	if(-f $raw){
 | 
				
			||||
		&schedule_work($raw);
 | 
				
			||||
		next;
 | 
				
			||||
	}
 | 
				
			||||
	if(-d $raw){
 | 
				
			||||
		if($raw =~ m!$PDS.git$!o){
 | 
				
			||||
			print "SKIP $raw\n" if($opt{v}>=2);
 | 
				
			||||
			next;
 | 
				
			||||
		}
 | 
				
			||||
		opendir RDIR,$raw or die "Can't opendir: $raw";
 | 
				
			||||
		local($_);	# needed until perl 5.11.2
 | 
				
			||||
		while($_ = readdir RDIR){
 | 
				
			||||
			next if(m/^\.\.?$/);
 | 
				
			||||
			if(m/^\./ && $opt{f}){
 | 
				
			||||
				print "       IGNORE-f: $raw$PDS$_\n" if($opt{v}>=2);
 | 
				
			||||
				next;
 | 
				
			||||
			}
 | 
				
			||||
			push(@rawlist, $raw.$PDS.$_);
 | 
				
			||||
		}
 | 
				
			||||
		closedir RDIR;
 | 
				
			||||
	}
 | 
				
			||||
	# ignore other file types
 | 
				
			||||
	if(! -e $raw){
 | 
				
			||||
		print "warning: missing file $raw\n";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# XXX could batch things up - later
 | 
				
			||||
 | 
				
			||||
sub schedule_work {
 | 
				
			||||
	my($file) = @_;
 | 
				
			||||
	print "CHECK: '$file'\n" if($opt{v}>=2);
 | 
				
			||||
	local($_) = `git status --porcelain --ignored -- $file`;
 | 
				
			||||
	my $key = $mode . join('',(m/^(.)(.)/));
 | 
				
			||||
	if(length $key == 1){
 | 
				
			||||
		# Hack.  An unmodified, tracked file produces no output from
 | 
				
			||||
		# git status.  Treat as another version of 'ignored'.
 | 
				
			||||
		$key .= '@@';
 | 
				
			||||
	}
 | 
				
			||||
	$key =~ s/-/ /g;	# for Keni's locally mod'ed git
 | 
				
			||||
	if(!exists $codes{$key}){
 | 
				
			||||
		die "I'm lost.\nK='$key' F=$file\nST=$_";
 | 
				
			||||
	}
 | 
				
			||||
	if($codes{$key}==0){
 | 
				
			||||
		if($opt{v}>=2){
 | 
				
			||||
			print "       IGNORE: $_" if(length);
 | 
				
			||||
			print "       IGNORE: !! $file\n" if(!length);
 | 
				
			||||
		}
 | 
				
			||||
		return;
 | 
				
			||||
	}
 | 
				
			||||
	if($opt{F}){
 | 
				
			||||
		my $ign = `git check-ignore $file`;
 | 
				
			||||
		if($ign !~ m/^\s*$/){
 | 
				
			||||
			print "       IGNORE-F: $ign" if($opt{v}>=2);
 | 
				
			||||
			return;
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
# FALLTHROUGH and continue
 | 
				
			||||
#print     "ACCEPT TEST\n";	# XXXXXXXXXX TEST
 | 
				
			||||
#return;
 | 
				
			||||
 | 
				
			||||
	my $attr = `git check-attr NHSUBST -- $file`;
 | 
				
			||||
	if($attr =~ m/NHSUBST:\s+(.*)/){
 | 
				
			||||
# XXX this is a bug in git.  What if the value of an attribute is the
 | 
				
			||||
# string "unset"?  Sigh.
 | 
				
			||||
		if(! $opt{F}){
 | 
				
			||||
			if($1 eq "unset" || $1 eq "unspecified"){
 | 
				
			||||
				print "       NOATTR: $attr" if($opt{v}>=2);
 | 
				
			||||
				return;
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
		&process_file($file);
 | 
				
			||||
		return;
 | 
				
			||||
	}
 | 
				
			||||
	die "Can't parse check-attr return: $attr\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub process_file {
 | 
				
			||||
	my($file) = @_;
 | 
				
			||||
	print "DOFIL: $file\n" if($opt{v}>=1);
 | 
				
			||||
 | 
				
			||||
	# For speed we read in the entire file then do the substitutions.
 | 
				
			||||
	local($_) = '';
 | 
				
			||||
	my $len;
 | 
				
			||||
	open INFILE, "<", $file or die "Can't open $file: $!";
 | 
				
			||||
	while(1){
 | 
				
			||||
			# On at least some systems we only get 64K.
 | 
				
			||||
		my $len = sysread(INFILE, $_, 999999, length($_));
 | 
				
			||||
		last if($len == 0);
 | 
				
			||||
		die "read failed: $!" unless defined($len);
 | 
				
			||||
	}
 | 
				
			||||
	close INFILE;
 | 
				
			||||
 | 
				
			||||
	local $::current_file = $file;	# used under handlevar
 | 
				
			||||
	# $1 - var and value (including trailing space but not $)
 | 
				
			||||
	# $2 - var
 | 
				
			||||
	# $4 - value or undef
 | 
				
			||||
#s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\N{DOLLAR SIGN}]+))?)\$/&handlevar($2,$4)/eg;
 | 
				
			||||
my $count = s/\$$PREFIX-(([A-Za-z][A-Za-z0-9_]*)(: ([^\x24]+))?)\$/&handlevar($2,$4)/eg;
 | 
				
			||||
# XXX had o modifier, why?
 | 
				
			||||
	return unless($count>0);
 | 
				
			||||
	return if($opt{n});
 | 
				
			||||
	my $mode = 0777 & (stat($file))[2];
 | 
				
			||||
 | 
				
			||||
	my $ofile = $file . ".nht";
 | 
				
			||||
	open(TOUT, ">", $ofile) or die "Can't open $ofile";
 | 
				
			||||
 | 
				
			||||
#	die "write failed: $!" unless defined syswrite(TOUT, $_);
 | 
				
			||||
	my $offset = 0;
 | 
				
			||||
	my $sent;
 | 
				
			||||
#print STDERR "L=",length,"\n";
 | 
				
			||||
	while($offset < length){
 | 
				
			||||
		$sent = syswrite(TOUT, $_, (length($_) - $offset), $offset);
 | 
				
			||||
		die "write failed: $!" unless defined($sent);
 | 
				
			||||
#print STDERR "rv=$sent\n";
 | 
				
			||||
		last if($sent == (length($_) - $offset));
 | 
				
			||||
		$offset += $sent;
 | 
				
			||||
#print STDERR "loop: O=$offset\n";
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	close TOUT or die "Can't close $ofile";
 | 
				
			||||
		# Do the right thing for *nix and hope for the best elsewhere:
 | 
				
			||||
	chmod($mode, $ofile)==1 or warn "Can't set filemode on $ofile";
 | 
				
			||||
	rename $ofile, $file or die "Can't rename $ofile to $file";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# XXX docs for --fixup and --squash are wrong in git's synopsis. --file missing
 | 
				
			||||
#   --message --template -t
 | 
				
			||||
sub cmdparse {
 | 
				
			||||
	my(@in) = @_;
 | 
				
			||||
 | 
				
			||||
		# What are we doing?
 | 
				
			||||
	$opt{cmd} = 'date';	# really nhsub
 | 
				
			||||
	if($in[0] eq '--add'){
 | 
				
			||||
		$opt{cmd} = 'add';
 | 
				
			||||
		shift @in;
 | 
				
			||||
	}
 | 
				
			||||
	if($in[0] eq '--commit'){
 | 
				
			||||
		$opt{cmd} = 'commit';
 | 
				
			||||
		shift @in;
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
# add: -n -v
 | 
				
			||||
# commit: --dry-run -v
 | 
				
			||||
# nhsub: -n -v
 | 
				
			||||
	while($in[0] =~ m/^-/){
 | 
				
			||||
		local($_) = $in[0];
 | 
				
			||||
		if($_ eq '--'){
 | 
				
			||||
			shift @in;
 | 
				
			||||
			last;
 | 
				
			||||
		}
 | 
				
			||||
		if(m/^--/){
 | 
				
			||||
			if($opt{cmd} eq 'add' && $_ eq '--dry-run'){
 | 
				
			||||
				exit 0;
 | 
				
			||||
			}
 | 
				
			||||
			if($opt{cmd} eq 'commit' && $_ eq '--dry-run'){
 | 
				
			||||
				exit 0;
 | 
				
			||||
			}
 | 
				
			||||
			if($opt{cmd} eq 'add' && $_ eq '--refresh'){
 | 
				
			||||
				exit 0;
 | 
				
			||||
			}
 | 
				
			||||
			shift @in;
 | 
				
			||||
			next;
 | 
				
			||||
		}
 | 
				
			||||
# XXX this is messy - time for a rewrite?
 | 
				
			||||
		if(m/^-(.*)/){
 | 
				
			||||
			foreach my $single ( split(//,$1) ){
 | 
				
			||||
					# don't do -v here from add/commit
 | 
				
			||||
				if($single ne 'v'){
 | 
				
			||||
					# don't use -m from add/commit
 | 
				
			||||
					if($opt{cmd} eq 'date' || $single ne 'm'){
 | 
				
			||||
						$opt{$single}++;
 | 
				
			||||
					}
 | 
				
			||||
				} elsif($opt{cmd} eq 'date'){
 | 
				
			||||
					$opt{$single}++;
 | 
				
			||||
				}
 | 
				
			||||
 | 
				
			||||
				if($opt{cmd} eq 'add' && $single eq 'n'){
 | 
				
			||||
					exit 0;
 | 
				
			||||
				}
 | 
				
			||||
#need to deal with options that eat a following element (-m, -F etc etc)
 | 
				
			||||
#add: nothing?
 | 
				
			||||
#commit: -c -C  -F -m 
 | 
				
			||||
#   -u<mode> mode is optional
 | 
				
			||||
# -S<keyid>  keyid is optional
 | 
				
			||||
				if($opt{cmd} eq 'commit'){
 | 
				
			||||
					if($single =~ m/[uS]/){
 | 
				
			||||
						last;
 | 
				
			||||
					}
 | 
				
			||||
					if($single =~ m/[cCFm]/){
 | 
				
			||||
#XXX this will be a mess if the argument is wrong, but can we tell?  No.
 | 
				
			||||
						shift @in;
 | 
				
			||||
						last;
 | 
				
			||||
					}
 | 
				
			||||
				}
 | 
				
			||||
			}
 | 
				
			||||
		}
 | 
				
			||||
		shift @in;
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	($mode) = ($opt{cmd} =~ m/^(.)/);
 | 
				
			||||
	$mode = 'f' if($opt{cmd} eq 'date' && ($opt{f}||$opt{F}));
 | 
				
			||||
	$mode = 'f' if($opt{cmd} eq 'add' && $opt{f});
 | 
				
			||||
 | 
				
			||||
	if($opt{cmd} eq 'add' && $#in == -1){
 | 
				
			||||
		exit 0;
 | 
				
			||||
	}
 | 
				
			||||
	if($opt{cmd} eq 'commit' && $#in == -1){
 | 
				
			||||
		exit 0;
 | 
				
			||||
	}
 | 
				
			||||
	if($opt{cmd} eq 'add' && $opt{a} && $#in != -1){
 | 
				
			||||
		exit 0;
 | 
				
			||||
	}
 | 
				
			||||
	if($opt{cmd} eq 'add' && $opt{a}){
 | 
				
			||||
		my $x = `git rev-parse --show-toplevel`;
 | 
				
			||||
		$x =~ s/[\n\r]+$//;
 | 
				
			||||
		push(@in, $x);
 | 
				
			||||
	}
 | 
				
			||||
	return @in;	# this is our file list
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub git_config {
 | 
				
			||||
	my($section, $var) = @_;
 | 
				
			||||
	my $raw = `git config --local --get $section.$var`;
 | 
				
			||||
	$raw =~ s/[\r\n]*$//g;
 | 
				
			||||
	return $raw if(length $raw);
 | 
				
			||||
	die "Missing config var: [$section] $var\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub handlevar {
 | 
				
			||||
	my($var, $val) = @_;
 | 
				
			||||
#	print "HIT '$var' '$val'\n" if($debug2);
 | 
				
			||||
 | 
				
			||||
	my $subname = "PREFIX::$var";
 | 
				
			||||
	if(defined &$subname){
 | 
				
			||||
		no strict;
 | 
				
			||||
		print "   SUBIN: $var '$val'\n" if($opt{v}>=3);
 | 
				
			||||
		$val =~ s/\s+$//;
 | 
				
			||||
		$val = &$subname($val);
 | 
				
			||||
		print "   SUBOT: $var '$val'\n" if($opt{v}>=3);
 | 
				
			||||
	} else {
 | 
				
			||||
		warn "No handler for \$$PREFIX-$var\n";
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	if(length $val){
 | 
				
			||||
		return "\$$PREFIX-$var: $val \$";
 | 
				
			||||
	} else {
 | 
				
			||||
		return "\$$PREFIX-$var\$";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub lsfiles {
 | 
				
			||||
	my ($flags, $ps) = @_;
 | 
				
			||||
	open RV, "-|", "git ls-files $flags '$ps'" or die "Can't ls-files";
 | 
				
			||||
	my @rv = <RV>;
 | 
				
			||||
	map { s/[\r\n]+$// } @rv;
 | 
				
			||||
	if(!close RV){
 | 
				
			||||
		return undef if($! == 0);
 | 
				
			||||
		die "close ls-files failed: $!";
 | 
				
			||||
	}
 | 
				
			||||
	return undef if($#rv == -1);
 | 
				
			||||
	return @rv;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
package PREFIX;
 | 
				
			||||
use POSIX qw(strftime);
 | 
				
			||||
 | 
				
			||||
# On push, put in the current date because we changed the file.
 | 
				
			||||
# On pull, keep the current value so we can see the last change date.
 | 
				
			||||
sub Date {
 | 
				
			||||
	my($val) = @_;
 | 
				
			||||
	my $now;
 | 
				
			||||
	if($opt{m}){
 | 
				
			||||
		my $hash = `git log -1 '--format=format:%H' $::current_file`;
 | 
				
			||||
			#author keni <keni@his.com> 1429884677 -0400
 | 
				
			||||
		chomp($now = `git cat-file -p $hash | awk '/author/{print \$4}'`);
 | 
				
			||||
	} else {
 | 
				
			||||
		$now = time;
 | 
				
			||||
	}
 | 
				
			||||
	# YYYY/MM/DD HH:MM:SS
 | 
				
			||||
	$val = "$now " . strftime("%Y/%m/%d %H:%M:%S", gmtime($now));
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#sub Header {
 | 
				
			||||
#}
 | 
				
			||||
#sub Author {
 | 
				
			||||
#}
 | 
				
			||||
 | 
				
			||||
# NB: the standard-ish Revision line isn't enough - you need Branch:Revision -
 | 
				
			||||
#     but we split it into 2 so we can use the standard processing code on Revision
 | 
				
			||||
#     and just slip Branch in.
 | 
				
			||||
sub Branch {
 | 
				
			||||
	my($val) = @_;
 | 
				
			||||
	$val = `git symbolic-ref -q --short HEAD`;
 | 
				
			||||
	$val =~ s/[\n\r]*$//;
 | 
				
			||||
	$val =~ s/^\*\s*//;
 | 
				
			||||
	$val = "(unknown)" unless($val =~ m/^[[:print:]]+$/);
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub Revision {
 | 
				
			||||
	my($val) = @_;
 | 
				
			||||
	my @val = `git log --follow --oneline $::current_file`;
 | 
				
			||||
	my $ver = 0+$#val;
 | 
				
			||||
	$ver = 0 if($ver < 0);
 | 
				
			||||
	$val = "1.$ver";
 | 
				
			||||
	return $val;
 | 
				
			||||
}
 | 
				
			||||
__END__
 | 
				
			||||
 | 
				
			||||
=head1 NAME
 | 
				
			||||
 | 
				
			||||
C<nhsub> - NetHack git command for substitution variables
 | 
				
			||||
 | 
				
			||||
=head1 SYNOPSIS
 | 
				
			||||
 | 
				
			||||
C<git nhsub [-v[v[v]] [-n] [-f|-F] [-m] [--] [file...]>
 | 
				
			||||
 | 
				
			||||
=head1 DESCRIPTION
 | 
				
			||||
 | 
				
			||||
C<nhsub> rewrites the specified files by doing variable substitution for
 | 
				
			||||
variables starting with the prefix specified in the repository's
 | 
				
			||||
C<nethack.substprefix> configuration variable.  C<nhsub> is also invoked
 | 
				
			||||
internally from the implementation of the C<nhadd> and C<nhcommit>
 | 
				
			||||
commands.
 | 
				
			||||
 | 
				
			||||
The program re-writes those files listed on the command line; if the file
 | 
				
			||||
is actually a directory, the program recurses into that directory tree.
 | 
				
			||||
Not all files found are re-written; some are ignored and those with no
 | 
				
			||||
substitution variables are not re-written.  Unless changed by the options,
 | 
				
			||||
files that have not changed are not affected.
 | 
				
			||||
 | 
				
			||||
If no files are listed on the command line, the current directory is
 | 
				
			||||
checked as if specified as C<.>.
 | 
				
			||||
Files listed directly on the command line are always checked.
 | 
				
			||||
The C<.git> directory is never processed.
 | 
				
			||||
 | 
				
			||||
The following command line options are available:
 | 
				
			||||
 | 
				
			||||
=over
 | 
				
			||||
 | 
				
			||||
=item C<-v[v[v]]>
 | 
				
			||||
 | 
				
			||||
Verbose output; may be (usefully) specified up to 3 times.  Not available
 | 
				
			||||
when invoked as part of C<nhadd> or C<nhcommit>.
 | 
				
			||||
 | 
				
			||||
=item C<-n>
 | 
				
			||||
 | 
				
			||||
Do not write any files.
 | 
				
			||||
 | 
				
			||||
=item C<-f>
 | 
				
			||||
 | 
				
			||||
Force, version 1:  
 | 
				
			||||
Perform substitution even if the file has not changed,
 | 
				
			||||
except no dot files are processed unless listed directly on the command line.
 | 
				
			||||
This prevents accidents with editor temporary files while recursing.  Note
 | 
				
			||||
that this overloads the C<-f> option of C<git add> and C<git commit>.
 | 
				
			||||
 | 
				
			||||
=item C<-F>
 | 
				
			||||
 | 
				
			||||
Force, version 2:
 | 
				
			||||
Perform substitution even if the file has not changed,
 | 
				
			||||
even if the NHSUBST attribute is not set for the
 | 
				
			||||
file, and only if the file is not ignored by git.  Not available
 | 
				
			||||
when invoked as part of C<nhadd> or C<nhcommit>.
 | 
				
			||||
 | 
				
			||||
=item C<-m>
 | 
				
			||||
 | 
				
			||||
Use metadata (C<git log> and C<git cat-file>) to find the last change date to
 | 
				
			||||
substitute.  Often used with C<-f>.  This is useful for cleaning up dates in files that were not
 | 
				
			||||
updated when last changed. (Do not use C<git nhadd>/C<git nhcommit> after C<nhsub -m>
 | 
				
			||||
or the changes will be overwritten with the current date.)
 | 
				
			||||
 | 
				
			||||
=back
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# $NHDT-Date: 1524689631 2018/04/25 20:53:51 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,33 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  post-checkout       $NHDT-Date: 1596498409 2020/08/03 23:46:49 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::nhversioning;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,33 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  post-commit       $NHDT-Date: 1596498409 2020/08/03 23:46:49 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::nhversioning;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,34 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  post-merge       $NHDT-Date: 1596498410 2020/08/03 23:46:50 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::nhversioning;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,34 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  post-rewrite       $NHDT-Date: 1596498411 2020/08/03 23:46:51 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::saveSTDIN;
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::resetSTDIN;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  pre-applypatch       $NHDT-Date: 1596498411 2020/08/03 23:46:51 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  pre-auto-gc       $NHDT-Date: 1596498412 2020/08/03 23:46:52 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  pre-commit       $NHDT-Date: 1596498413 2020/08/03 23:46:53 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,34 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  pre-push       $NHDT-Date: 1596498413 2020/08/03 23:46:53 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::saveSTDIN;
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::resetSTDIN;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7  pre-rebase       $NHDT-Date: 1596498414 2020/08/03 23:46:54 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# $NHDT-Date: 1524689633 2018/04/25 20:53:53 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
#STARTUP-START
 | 
				
			||||
BEGIN {
 | 
				
			||||
    # OS hackery has to be duplicated in each of the hooks :/
 | 
				
			||||
    # first the directory separator
 | 
				
			||||
    my $DS = quotemeta('/');
 | 
				
			||||
    my $PDS = '/';
 | 
				
			||||
    # msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
    # temporarily removed because inconsistent behavior
 | 
				
			||||
    # if ($^O eq "msys")
 | 
				
			||||
    # {
 | 
				
			||||
    #   $/ = "\r\n";
 | 
				
			||||
    #   $\ = "\r\n";
 | 
				
			||||
    # }
 | 
				
			||||
    if($^O eq "MSWin32"){
 | 
				
			||||
        $DS = quotemeta('\\');
 | 
				
			||||
	$PDS = '\\';
 | 
				
			||||
    }
 | 
				
			||||
    $gitdir = `git rev-parse --git-dir`;
 | 
				
			||||
    chomp $gitdir;
 | 
				
			||||
    push(@INC, $gitdir.$PDS."hooks");
 | 
				
			||||
}
 | 
				
			||||
use NHgithook;
 | 
				
			||||
#STARTUP-END
 | 
				
			||||
 | 
				
			||||
&NHgithook::PRE;
 | 
				
			||||
&NHgithook::POST;
 | 
				
			||||
exit 0;
 | 
				
			||||
@ -0,0 +1,341 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# $NHDT-Date: 1693357449 2023/08/30 01:04:09 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
# Copyright (c) 2015 by Kenneth Lorber, Kensington, Maryland
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# value of nethack.setupversion we will end up with when this is done
 | 
				
			||||
# version 1 is reserved for repos checked out before versioning was added
 | 
				
			||||
my $version_new = 3;
 | 
				
			||||
my $version_old = 0;	# current version, if any (0 is no entry ergo new repo)
 | 
				
			||||
 | 
				
			||||
use Cwd;
 | 
				
			||||
use Getopt::Std;
 | 
				
			||||
 | 
				
			||||
# Activestate Perl doesn't include File::Spec.  Grr.
 | 
				
			||||
BEGIN {
 | 
				
			||||
        eval "require File::Spec::Functions";
 | 
				
			||||
        if($@){
 | 
				
			||||
                die <<E_O_M;
 | 
				
			||||
File::Spec not found.  (If you are running ActiveState Perl please run:
 | 
				
			||||
                cpan File::Spec
 | 
				
			||||
and re-run this program.
 | 
				
			||||
E_O_M
 | 
				
			||||
        }
 | 
				
			||||
        File::Spec::Functions->import;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
exit 1 unless(getopts('nvf'));	# TODO: this can probably have better output
 | 
				
			||||
 | 
				
			||||
# OS hackery
 | 
				
			||||
my $DS = quotemeta('/');		# Directory Separator (for regex)
 | 
				
			||||
my $DSP = '/';				# ... for printing
 | 
				
			||||
#   Temporarily disabled; there's something weird about msys
 | 
				
			||||
#	msys: POSIXish over a Windows filesystem (so / not \ but \r\n not \n).
 | 
				
			||||
#if($^O eq "msys"){
 | 
				
			||||
#	$/ = "\r\n";
 | 
				
			||||
#	$\ = "\r\n";
 | 
				
			||||
#	# NB: We don't need to do anything about File::Spec.  It doesn't know
 | 
				
			||||
#	#     about msys but it defaults to Unix, so we'll be ok.
 | 
				
			||||
#}
 | 
				
			||||
if($^O eq "MSWin32"){
 | 
				
			||||
	$DS = quotemeta('\\');
 | 
				
			||||
	$DSP = '\\';
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
# make sure we're at the top level of a repo
 | 
				
			||||
if(! -d ".git"){
 | 
				
			||||
	die "This is not the top level of a git repository.\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
my $vtemp = `git config --local --get nethack.setupversion`;
 | 
				
			||||
chomp($vtemp);
 | 
				
			||||
if($vtemp > 0){
 | 
				
			||||
	$version_old = 0+$vtemp;
 | 
				
			||||
	if($version_old != $version_new){
 | 
				
			||||
		print STDERR "Migrating from setup version $version_old to $version_new\n" if($opt_v);
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
# legacy check:
 | 
				
			||||
if(length $vtemp == 0){
 | 
				
			||||
	if(`git config --get merge.NHsubst.name` =~ m/^Net/){
 | 
				
			||||
		$version_old = 1;
 | 
				
			||||
		print STDERR "Migrating to setup version 1\n" if($opt_v);
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
my $gitadddir = `git config --get nethack.gitadddir`;
 | 
				
			||||
chomp($gitadddir);
 | 
				
			||||
if(length $gitadddir){
 | 
				
			||||
	if(! -d $gitadddir){
 | 
				
			||||
		die "nethack.gitadddir has invalid value '$gitadddir'\n";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
print STDERR "nethack.gitadddir=$gitadddir\n" if($opt_v);
 | 
				
			||||
 | 
				
			||||
# This is (relatively) safe because we know we're at R in R/DEVEL/nhgitset.pl
 | 
				
			||||
my $srcdir = ($0 =~ m!^(.*)$DS!)[0];
 | 
				
			||||
 | 
				
			||||
if(! -f catfile($srcdir, 'nhgitset.pl')){
 | 
				
			||||
	die "I can't find myself in '$srcdir'\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
print STDERR "Copying from: $srcdir\n" if($opt_v);
 | 
				
			||||
 | 
				
			||||
if($opt_f || $version_old==0){
 | 
				
			||||
	print STDERR "Configuring line endings\n" if($opt_v);
 | 
				
			||||
	unlink catfile('.git','index') unless($opt_n);
 | 
				
			||||
	system("git reset") unless($opt_n);
 | 
				
			||||
	system("git config --local core.safecrlf true") unless($opt_n);
 | 
				
			||||
	system("git config --local core.autocrlf false") unless($opt_n);
 | 
				
			||||
} elsif($version_old <2){
 | 
				
			||||
	my $xx = `git config --get --local core.safecrlf`;
 | 
				
			||||
	if($xx !~ m/true/){
 | 
				
			||||
		print STDERR "\nNeed to 'rm .git${DSP}index;git reset'.\n";
 | 
				
			||||
		print STDERR " When ready to proceed, re-run with -f flag.\n";
 | 
				
			||||
		exit 2;
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
print STDERR "Installing aliases\n" if($opt_v);
 | 
				
			||||
$addpath = catfile(curdir(),'.git','hooks','NHadd');
 | 
				
			||||
&add_alias('nhadd', "!$addpath add");
 | 
				
			||||
&add_alias('nhcommit', "!$addpath commit");
 | 
				
			||||
my $nhsub = catfile(curdir(),'.git','hooks','nhsub');
 | 
				
			||||
&add_alias('nhsub', "!$nhsub");
 | 
				
			||||
 | 
				
			||||
print STDERR "Installing filter/merge\n" if($opt_v);
 | 
				
			||||
 | 
				
			||||
# XXXX need it in NHadd to find nhsub???
 | 
				
			||||
# removed at version 3
 | 
				
			||||
#if($^O eq "MSWin32"){
 | 
				
			||||
#	$cmd = '.git\\\\hooks\\\\NHtext';
 | 
				
			||||
#} else {
 | 
				
			||||
#	$cmd = catfile(curdir(),'.git','hooks','NHtext');
 | 
				
			||||
#}
 | 
				
			||||
#&add_config('filter.NHtext.clean', "$cmd --clean %f");
 | 
				
			||||
#&add_config('filter.NHtext.smudge', "$cmd --smudge %f");
 | 
				
			||||
if($version_old == 1 or $version_old == 2){
 | 
				
			||||
	print STDERR "Removing filter.NHtext\n" if($opt_v);
 | 
				
			||||
	system('git','config','--unset','filter.NHtext.clean') unless($opt_n);
 | 
				
			||||
	system('git','config','--unset','filter.NHtext.smudge') unless($opt_n);
 | 
				
			||||
	system('git','config','--remove-section','filter.NHtext') unless($opt_n);
 | 
				
			||||
 | 
				
			||||
	print STDERR "Removing NHtext\n" if($opt_v);
 | 
				
			||||
	unlink catfile(curdir(),'.git','hooks','NHtext') unless($opt_n);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
$cmd = catfile(curdir(),'.git','hooks','NHsubst');
 | 
				
			||||
&add_config('merge.NHsubst.name', 'NetHack Keyword Substitution');
 | 
				
			||||
&add_config('merge.NHsubst.driver', "$cmd %O %A %B %L");
 | 
				
			||||
 | 
				
			||||
print STDERR "Running directories\n" if($opt_v);
 | 
				
			||||
 | 
				
			||||
foreach my $dir ( glob("$srcdir$DS*") ){
 | 
				
			||||
	next unless(-d $dir);
 | 
				
			||||
 | 
				
			||||
	my $target = catfile($dir, 'TARGET');
 | 
				
			||||
	next unless(-f $target);
 | 
				
			||||
 | 
				
			||||
	open TARGET, '<', $target or die "$target: $!";
 | 
				
			||||
	my $targetpath = <TARGET>;
 | 
				
			||||
		# still have to eat all these line endings under msys, so instead of chomp use this:
 | 
				
			||||
	$targetpath =~ s![\r\n]!!g;
 | 
				
			||||
	close TARGET;
 | 
				
			||||
	print STDERR "Directory $dir -> $targetpath\n" if($opt_v);
 | 
				
			||||
 | 
				
			||||
	my $enddir = $dir;
 | 
				
			||||
	$enddir =~ s!.*$DS!!;
 | 
				
			||||
	if(! &process_override($enddir, "INSTEAD")){
 | 
				
			||||
		&process_override($enddir, "PRE");
 | 
				
			||||
		my $fnname = "do_dir_$enddir";
 | 
				
			||||
		if(defined &$fnname){
 | 
				
			||||
			&$fnname($dir, $targetpath);
 | 
				
			||||
		}
 | 
				
			||||
		&process_override($enddir, "POST");
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
&check_prefix;	# for variable substitution
 | 
				
			||||
 | 
				
			||||
if($version_old != $version_new){
 | 
				
			||||
	print STDERR "Setting version to $version_new\n" if($opt_v);
 | 
				
			||||
	if(! $opt_n){
 | 
				
			||||
		system("git config nethack.setupversion $version_new");
 | 
				
			||||
		if($?){
 | 
				
			||||
			die "Can't set nethack.setupversion $version_new: $?,$!\n";
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
exit 0;
 | 
				
			||||
 | 
				
			||||
sub process_override {
 | 
				
			||||
	my($srcdir, $plname) = @_;
 | 
				
			||||
	return 0 unless(length $gitadddir);
 | 
				
			||||
 | 
				
			||||
	my $plpath = catfile($gitadddir, $srcdir, $plname);
 | 
				
			||||
#print STDERR "   ",catfile($srcdir, $plname),"\n"; # save this for updating docs - list of overrides
 | 
				
			||||
	return 0 unless(-x $plpath);
 | 
				
			||||
 | 
				
			||||
	print STDERR "Running $plpath\n" if($opt_v);
 | 
				
			||||
	# current directory is top of target repo
 | 
				
			||||
 | 
				
			||||
	unless($opt_n){
 | 
				
			||||
		system("$plpath $opt_v") and die "Callout $plpath failed: $?\n";
 | 
				
			||||
	}
 | 
				
			||||
	return 1;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub add_alias {
 | 
				
			||||
	my($name, $def) = @_;
 | 
				
			||||
	&add_config("alias.$name",$def);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub add_config {
 | 
				
			||||
	my($name, $val) = @_;
 | 
				
			||||
	system('git', 'config', '--local', $name, $val) unless($opt_n);
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub check_prefix {
 | 
				
			||||
	my $lcl = `git config --local --get nethack.substprefix`;
 | 
				
			||||
	chomp($lcl);
 | 
				
			||||
	if(0==length $lcl){
 | 
				
			||||
		my $other = `git config --get nethack.substprefix`;
 | 
				
			||||
		chomp($other);
 | 
				
			||||
		if(0==length $other){
 | 
				
			||||
			print STDERR "ERROR: nethack.substprefix is not set anywhere.  Set it and re-run.\n";
 | 
				
			||||
			exit 2;
 | 
				
			||||
		} else {
 | 
				
			||||
			&add_config('nethack.substprefix', $other);
 | 
				
			||||
			print STDERR "Copying prefix '$other' to local repository.\n" if($opt_v);
 | 
				
			||||
		}
 | 
				
			||||
		$lcl = $other;	# for display below
 | 
				
			||||
	}
 | 
				
			||||
	print "\n\nUsing prefix '$lcl' - PLEASE MAKE SURE THIS IS CORRECT\n\n";
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub do_dir_DOTGIT {
 | 
				
			||||
if(1){
 | 
				
			||||
	# We are NOT going to mess with config now.
 | 
				
			||||
	return;
 | 
				
			||||
} else {
 | 
				
			||||
	my($srcdir, $targetdir) = @_;
 | 
				
			||||
#warn "do_dir_DOTGIT($srcdir, $targetdir)\n";
 | 
				
			||||
	my $cname = "$srcdir/config";
 | 
				
			||||
	if(-e $cname){
 | 
				
			||||
		print STDERR "Appending to .git/config\n" if($opt_v);
 | 
				
			||||
		open CONFIG, ">>.git/config" or die "open .git/config: $!";
 | 
				
			||||
		open IN, "<", $cname or die "open $cname: $!";
 | 
				
			||||
		my @data = <IN>;
 | 
				
			||||
		print CONFIG @data;
 | 
				
			||||
		close IN;
 | 
				
			||||
		close CONFIG;
 | 
				
			||||
	} else {
 | 
				
			||||
		print STDERR " Nothing to add to .git/config\n" if($opt_v);
 | 
				
			||||
	}
 | 
				
			||||
# XXX are there other files in .git that we might want to handle?
 | 
				
			||||
# So just in case:
 | 
				
			||||
	for my $file ( glob("$srcdir/*") ){
 | 
				
			||||
		next if( $file =~ m!.*/TARGET$! );
 | 
				
			||||
		next if( $file =~ m!.*/config$! );
 | 
				
			||||
		die "ERROR: no handler for $file\n";
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
sub do_dir_hooksdir {
 | 
				
			||||
	my($srcdir, $targetdir) = @_;
 | 
				
			||||
 | 
				
			||||
	unless (-d $targetdir){
 | 
				
			||||
		# Older versions of git, when cloning a repo and
 | 
				
			||||
		# the expected source templates directory does not
 | 
				
			||||
		# exist, does not create .git/hooks.  So do it here.
 | 
				
			||||
	    mkdir $targetdir;
 | 
				
			||||
	    print STDERR "WARNING: .git/hooks had to be created.\n";
 | 
				
			||||
	    print STDERR "  You may want to update git.\n";
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	for my $path ( glob("$srcdir$DS*") ){
 | 
				
			||||
 | 
				
			||||
		next if( $path =~ m!.*${DS}TARGET$! );
 | 
				
			||||
 | 
				
			||||
		my $file = $path;
 | 
				
			||||
 | 
				
			||||
		$file =~ s!.*$DS!!;
 | 
				
			||||
 | 
				
			||||
		$file = catfile($targetdir, $file);
 | 
				
			||||
 | 
				
			||||
		next if($opt_n);
 | 
				
			||||
 | 
				
			||||
		open IN, "<", $path or die "Can't open $path: $!";
 | 
				
			||||
		open OUT, ">", "$file" or die "Can't open $file: $!";
 | 
				
			||||
		while(<IN>){
 | 
				
			||||
			print OUT;
 | 
				
			||||
		}
 | 
				
			||||
		close OUT;
 | 
				
			||||
		close IN;
 | 
				
			||||
 | 
				
			||||
		if(! -x $file){
 | 
				
			||||
			chmod 0755 ,$file;
 | 
				
			||||
		}
 | 
				
			||||
	}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
__END__
 | 
				
			||||
(can we change the .gitattributes syntax to include a comment character?)
 | 
				
			||||
maybe [comment]  attr.c:parse_attr_line
 | 
				
			||||
grr - looks like # is the comment character
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
=head1 NAME
 | 
				
			||||
 | 
				
			||||
nhgitset.pl - Setup program for NetHack git repositories
 | 
				
			||||
 | 
				
			||||
=head1 SYNOPSIS
 | 
				
			||||
 | 
				
			||||
 cd THE_REPO
 | 
				
			||||
 [git config nethack.gitadddir GITADDDIR]
 | 
				
			||||
 perl SOME_PATH/DEVEL/nhgitset.pl [-v][-n][-f]
 | 
				
			||||
 | 
				
			||||
=head1 DESCRIPTION
 | 
				
			||||
 | 
				
			||||
nhgitset.pl installs NetHack-specific setup after a C<git clone> (or after
 | 
				
			||||
changes to the desired configuration, which are installed by re-running
 | 
				
			||||
nhgitset.pl).
 | 
				
			||||
 | 
				
			||||
The follwing options are available:
 | 
				
			||||
 | 
				
			||||
B<-f>	Force.  Do not use this unless the program requests it.
 | 
				
			||||
 | 
				
			||||
B<-n>	Make no changes.
 | 
				
			||||
 | 
				
			||||
B<-v>	Verbose output.
 | 
				
			||||
 | 
				
			||||
=head1 CONFIG
 | 
				
			||||
 | 
				
			||||
nhgitset.pl uses the following non-standard C<git config> variables:
 | 
				
			||||
 | 
				
			||||
nethack.gitadddir
 | 
				
			||||
 | 
				
			||||
   DOTGIT/INSTEAD
 | 
				
			||||
   DOTGIT/PRE
 | 
				
			||||
   DOTGIT/POST
 | 
				
			||||
   hooksdir/INSTEAD
 | 
				
			||||
   hooksdir/PRE
 | 
				
			||||
   hooksdir/POST
 | 
				
			||||
 | 
				
			||||
nethack.setupversion
 | 
				
			||||
 | 
				
			||||
nethack.substprefix
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
=head1 EXIT STATUS
 | 
				
			||||
 | 
				
			||||
0	Success.
 | 
				
			||||
 | 
				
			||||
1	Fail.
 | 
				
			||||
 | 
				
			||||
2	Intervention required.
 | 
				
			||||
@ -0,0 +1,677 @@
 | 
				
			||||
This is a listing of all files in a full NetHack 3.7 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.
 | 
				
			||||
 | 
				
			||||
(Note: we ignore various dot files related to git.)
 | 
				
			||||
 | 
				
			||||
.:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
.clang-format        Cross-compiling      Files
 | 
				
			||||
Porting              README               azure-pipelines.yml
 | 
				
			||||
 | 
				
			||||
DEVEL:
 | 
				
			||||
(files for people developing changes to NetHack)
 | 
				
			||||
Developer.txt      code_features.txt  code_style.txt     git_recipes.txt
 | 
				
			||||
gitinfo.pl         nhgitset.pl
 | 
				
			||||
 | 
				
			||||
DEVEL/DOTGIT:
 | 
				
			||||
(file for people developing changes to NetHack)
 | 
				
			||||
TARGET
 | 
				
			||||
 | 
				
			||||
DEVEL/hooksdir:
 | 
				
			||||
(files for people developing changes to NetHack)
 | 
				
			||||
NHadd               NHgithook.pm        NHsubst
 | 
				
			||||
NHtext              TARGET              applypatch-msg
 | 
				
			||||
commit-msg          nhsub               post-applypatch
 | 
				
			||||
post-checkout       post-commit         post-merge
 | 
				
			||||
post-rewrite        pre-applypatch      pre-auto-gc
 | 
				
			||||
pre-commit          pre-push            pre-rebase
 | 
				
			||||
prepare-commit-msg
 | 
				
			||||
 | 
				
			||||
dat:
 | 
				
			||||
(files for all versions)
 | 
				
			||||
Arc-fila.lua  Arc-filb.lua  Arc-goal.lua  Arc-loca.lua  Arc-strt.lua
 | 
				
			||||
Bar-fila.lua  Bar-filb.lua  Bar-goal.lua  Bar-loca.lua  Bar-strt.lua
 | 
				
			||||
Cav-fila.lua  Cav-filb.lua  Cav-goal.lua  Cav-loca.lua  Cav-strt.lua
 | 
				
			||||
GENFILES      Hea-fila.lua  Hea-filb.lua  Hea-goal.lua  Hea-loca.lua
 | 
				
			||||
Hea-strt.lua  Kni-fila.lua  Kni-filb.lua  Kni-goal.lua  Kni-loca.lua
 | 
				
			||||
Kni-strt.lua  Mon-fila.lua  Mon-filb.lua  Mon-goal.lua  Mon-loca.lua
 | 
				
			||||
Mon-strt.lua  Pri-fila.lua  Pri-filb.lua  Pri-goal.lua  Pri-loca.lua
 | 
				
			||||
Pri-strt.lua  Ran-fila.lua  Ran-filb.lua  Ran-goal.lua  Ran-loca.lua
 | 
				
			||||
Ran-strt.lua  Rog-fila.lua  Rog-filb.lua  Rog-goal.lua  Rog-loca.lua
 | 
				
			||||
Rog-strt.lua  Sam-fila.lua  Sam-filb.lua  Sam-goal.lua  Sam-loca.lua
 | 
				
			||||
Sam-strt.lua  Tou-fila.lua  Tou-filb.lua  Tou-goal.lua  Tou-loca.lua
 | 
				
			||||
Tou-strt.lua  Val-fila.lua  Val-filb.lua  Val-goal.lua  Val-loca.lua
 | 
				
			||||
Val-strt.lua  Wiz-fila.lua  Wiz-filb.lua  Wiz-goal.lua  Wiz-loca.lua
 | 
				
			||||
Wiz-strt.lua  air.lua       asmodeus.lua  astral.lua    baalz.lua
 | 
				
			||||
bigrm-1.lua   bigrm-2.lua   bigrm-3.lua   bigrm-4.lua   bigrm-5.lua
 | 
				
			||||
bigrm-6.lua   bigrm-7.lua   bigrm-8.lua   bigrm-9.lua   bigrm-10.lua
 | 
				
			||||
bigrm-11.lua  bogusmon.txt  castle.lua    cmdhelp       data.base
 | 
				
			||||
dungeon.lua   earth.lua     engrave.txt   epitaph.txt   fakewiz1.lua
 | 
				
			||||
fakewiz2.lua  fire.lua      hellfill.lua  help          hh
 | 
				
			||||
history       juiblex.lua   keyhelp       knox.lua      license
 | 
				
			||||
medusa-1.lua  medusa-2.lua  medusa-3.lua  medusa-4.lua  minefill.lua
 | 
				
			||||
minend-1.lua  minend-2.lua  minend-3.lua  minetn-1.lua  minetn-2.lua
 | 
				
			||||
minetn-3.lua  minetn-4.lua  minetn-5.lua  minetn-6.lua  minetn-7.lua
 | 
				
			||||
nhcore.lua    nhlib.lua     opthelp       optmenu       oracle.lua
 | 
				
			||||
oracles.txt   orcus.lua     quest.lua     rumors.fal    rumors.tru
 | 
				
			||||
sanctum.lua   soko1-1.lua   soko1-2.lua   soko2-1.lua   soko2-2.lua
 | 
				
			||||
soko3-1.lua   soko3-2.lua   soko4-1.lua   soko4-2.lua   symbols
 | 
				
			||||
themerms.lua  tower1.lua    tower2.lua    tower3.lua    tribute
 | 
				
			||||
usagehlp      valley.lua    water.lua     wizard1.lua   wizard2.lua
 | 
				
			||||
wizard3.lua   wizhelp
 | 
				
			||||
 | 
				
			||||
doc:
 | 
				
			||||
(files for all versions)
 | 
				
			||||
Gbk-1pg-pfx.mn     Gbk-1pg-sfx.mn     Guidebook.mn       Guidebook.tex
 | 
				
			||||
Guidebook.txt      config.nh          dlb.6              dlb.txt
 | 
				
			||||
fixes1-0.txt       fixes1-4-f.txt     fixes2-2.txt       fixes2-3-e.txt
 | 
				
			||||
fixes3-0.txt       fixes3-0-pl01.txt  fixes3-0-pl02.txt  fixes3-0-pl03.txt
 | 
				
			||||
fixes3-0-pl04.txt  fixes3-0-pl05.txt  fixes3-0-pl06.txt  fixes3-0-pl07.txt
 | 
				
			||||
fixes3-0-pl08.txt  fixes3-0-pl09.txt  fixes3-0-pl10.txt  fixes3-1-1.txt
 | 
				
			||||
fixes3-1-2.txt     fixes3-1-3.txt     fixes3-2-0.txt     fixes3-2-1.txt
 | 
				
			||||
fixes3-2-2.txt     fixes3-2-3.txt     fixes3-3-0.txt     fixes3-3-1.txt
 | 
				
			||||
fixes3-4-0.txt     fixes3-4-1.txt     fixes3-4-2.txt     fixes3-4-3.txt
 | 
				
			||||
fixes3-5-0.txt     fixes3-6-0.txt     fixes3-6-1.txt     fixes3-6-2.txt
 | 
				
			||||
fixes3-6-3.txt     fixes3-6-4.txt     fixes3-6-5.txt     fixes3-6-6.txt
 | 
				
			||||
fixes3-6-7.txt     fixes3-7-0.txt     fixesX-X-X.txt     lua.adoc
 | 
				
			||||
makedefs.6         makedefs.txt       mn.7               mn.txt
 | 
				
			||||
mnh.7              mnh.txt            nethack.6          nethack.txt
 | 
				
			||||
options.txt        recover.6          recover.txt        sound.txt
 | 
				
			||||
tmac.n             tmac.nh            window.txt
 | 
				
			||||
 | 
				
			||||
include:
 | 
				
			||||
(files for X versions)
 | 
				
			||||
tile2x11.h  winX.h      xwindow.h   xwindowp.h
 | 
				
			||||
 | 
				
			||||
(files for all versions)
 | 
				
			||||
align.h       artifact.h    artilist.h    attrib.h      botl.h
 | 
				
			||||
color.h       config.h      config1.h     context.h     coord.h
 | 
				
			||||
cstd.h        decl.h        defsym.h      dgn_file.h    display.h
 | 
				
			||||
dlb.h         dungeon.h     engrave.h     extern.h      flag.h
 | 
				
			||||
fnamesiz.h    func_tab.h    global.h      hack.h        integer.h
 | 
				
			||||
isaac64.h     lint.h        mail.h        mextra.h      mfndpos.h
 | 
				
			||||
micro.h       mkroom.h      monattk.h     mondata.h     monflag.h
 | 
				
			||||
monst.h       monsters.h    obj.h         objclass.h    objects.h
 | 
				
			||||
optlist.h     patchlevel.h  pcconf.h      permonst.h    prop.h
 | 
				
			||||
quest.h       rect.h        region.h      rm.h          seffects.h
 | 
				
			||||
skills.h      sndprocs.h    sp_lev.h      spell.h       sym.h
 | 
				
			||||
sys.h         tcap.h        tileset.h     timeout.h     tradstdc.h
 | 
				
			||||
trap.h        unixconf.h    vision.h      vmsconf.h     warnings.h
 | 
				
			||||
winami.h      wincurs.h     windconf.h    winprocs.h    wintype.h
 | 
				
			||||
you.h         youprop.h
 | 
				
			||||
 | 
				
			||||
(file for tty versions)
 | 
				
			||||
wintty.h
 | 
				
			||||
 | 
				
			||||
outdated:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
.travis.yml
 | 
				
			||||
 | 
				
			||||
outdated/dat:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
symbols
 | 
				
			||||
 | 
				
			||||
outdated/include:
 | 
				
			||||
(files for GEM versions)
 | 
				
			||||
bitmfile.h  gem_rsc.h   load_img.h  wingem.h
 | 
				
			||||
 | 
				
			||||
(file for GNOME versions)
 | 
				
			||||
winGnome.h
 | 
				
			||||
 | 
				
			||||
(files for all versions)
 | 
				
			||||
amiconf.h   beconf.h    def_os2.h   os2conf.h   system.h    tosconf.h
 | 
				
			||||
trampoli.h  wceconf.h
 | 
				
			||||
 | 
				
			||||
(files for various Macintosh versions)
 | 
				
			||||
mac-carbon.h  mac-qt.h      mac-term.h    macconf.h     macpopup.h
 | 
				
			||||
mactty.h      macwin.h      mttypriv.h
 | 
				
			||||
 | 
				
			||||
outdated/sys/amiga:
 | 
				
			||||
(files for Amiga versions - untested for 3.7)
 | 
				
			||||
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      amistack.c    amitty.c
 | 
				
			||||
amiwind.c     amiwind.p     clipwin.c     colorwin.c    grave16.xpm
 | 
				
			||||
ifchange      mkdmake       txt2iff.c     winamenu.c    winami.c
 | 
				
			||||
winami.p      winchar.c     windefs.h     winext.h      winfuncs.c
 | 
				
			||||
winkey.c      winproto.h    winreq.c      winstr.c      xpm2iff.c
 | 
				
			||||
 | 
				
			||||
outdated/sys/atari:
 | 
				
			||||
(files for Atari version - untested for 3.7)
 | 
				
			||||
Install.tos   atarifnt.uue  nethack.mnu   setup.g       tos.c
 | 
				
			||||
unx2atar.sed
 | 
				
			||||
 | 
				
			||||
outdated/sys/be:
 | 
				
			||||
(files for BeOS version - untested for 3.7)
 | 
				
			||||
README    bemain.c
 | 
				
			||||
 | 
				
			||||
outdated/sys/mac:
 | 
				
			||||
(files for 68K Macintosh versions)
 | 
				
			||||
Files.r       Install.mw    MacHelp       NHDeflts      NHrsrc.hqx
 | 
				
			||||
NHsound.hqx   News          README        carbon.plist  dprintf.c
 | 
				
			||||
maccurs.c     macerrs.c     macfile.c     machelp.hqx   macmain.c
 | 
				
			||||
macmenu.c     mactopl.c     mactty.c      macunix.c     macwin.c
 | 
				
			||||
mgetline.c    mmodal.c      mrecover.c    mrecover.hqx  mttymain.c
 | 
				
			||||
 | 
				
			||||
outdated/sys/msdos:
 | 
				
			||||
(files for deprecated real mode msdos version)
 | 
				
			||||
Makefile.BC   Makefile.MSC  SCHEMA35.MSC  moveinit.pat  ovlinit.c
 | 
				
			||||
schema1.BC    schema2.BC    schema3.MSC
 | 
				
			||||
 | 
				
			||||
outdated/sys/os2:
 | 
				
			||||
(files for OS/2 version - untested for 3.7)
 | 
				
			||||
Install.os2   Makefile.os2  nhpmico.uu    os2.c
 | 
				
			||||
 | 
				
			||||
outdated/sys/unix:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
README.linux    cross-amiga.sh
 | 
				
			||||
 | 
				
			||||
outdated/sys/unix/hints:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
cross-amiga     linux           linux-chroot    linux-qt4
 | 
				
			||||
linux-qt5       linux-x11       macosx          macosx10.5
 | 
				
			||||
macosx10.7      macosx10.8      macosx10.10     macosx10.10-qt
 | 
				
			||||
macosx10.14
 | 
				
			||||
 | 
				
			||||
outdated/sys/unix/hints/include:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
cross-amiga-post  cross-amiga-pre
 | 
				
			||||
 | 
				
			||||
outdated/sys/vms:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
lev_lex.h
 | 
				
			||||
 | 
				
			||||
outdated/sys/wince:
 | 
				
			||||
(files for Windows CE and PocketPC - untested for 3.7)
 | 
				
			||||
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
 | 
				
			||||
mhdlg.h       mhfont.c      mhfont.h      mhinput.c     mhinput.h
 | 
				
			||||
mhmain.c      mhmain.h      mhmap.c       mhmap.h       mhmenu.c
 | 
				
			||||
mhmenu.h      mhmsg.h       mhmsgwnd.c    mhmsgwnd.h    mhrip.c
 | 
				
			||||
mhrip.h       mhstatus.c    mhstatus.h    mhtext.c      mhtext.h
 | 
				
			||||
mhtxtbuf.c    mhtxtbuf.h    mswproc.c     newres.h      nhico.uu
 | 
				
			||||
resource.h    winMS.h       winhack.c     winhack.rc    winhcksp.rc
 | 
				
			||||
winmain.c
 | 
				
			||||
 | 
				
			||||
outdated/sys/wince/ceinc:
 | 
				
			||||
(header files for Windows CE and PocketPC - untested for 3.7)
 | 
				
			||||
assert.h  errno.h   fcntl.h
 | 
				
			||||
 | 
				
			||||
outdated/sys/wince/ceinc/sys:
 | 
				
			||||
(sys/stat.h for Windows CE and PocketPC - untested for 3.6.2)
 | 
				
			||||
stat.h
 | 
				
			||||
 | 
				
			||||
outdated/sys/windows:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
travis-gcc.sh
 | 
				
			||||
 | 
				
			||||
outdated/sys/windows/vs:
 | 
				
			||||
(files that are no longer maintained for current game code)
 | 
				
			||||
travisci.sh
 | 
				
			||||
 | 
				
			||||
outdated/win/Qt3:
 | 
				
			||||
(files for the Qt 3 widget library - X11, Windows, Mac OS X, or Qtopia)
 | 
				
			||||
Info.plist           Install.Qt           knethack.lnk
 | 
				
			||||
knh-mini.xpm         knh.xpm              qpe-nethack.control
 | 
				
			||||
qt3_clust.cpp        qt3_clust.h          qt3_kde0.h
 | 
				
			||||
qt3_win.cpp          qt3_win.h            qt3_xpms.h
 | 
				
			||||
qt3tableview.cpp     qt3tableview.h       tileedit.cpp
 | 
				
			||||
tileedit.h
 | 
				
			||||
 | 
				
			||||
outdated/win/gem:
 | 
				
			||||
(files for GEM versions - untested for 3.7)
 | 
				
			||||
Install.gem  bitmfile.c   gem_rsc.uu   gem_rso.uu   gr_rect.c    gr_rect.h
 | 
				
			||||
load_img.c   tile2img.c   title.uu     wingem.c     wingem1.c    xpm2img.c
 | 
				
			||||
 | 
				
			||||
outdated/win/gnome:
 | 
				
			||||
(files for GNOME versions - untested for 3.7)
 | 
				
			||||
README      gn_xpms.h   gnaskstr.c  gnaskstr.h  gnbind.c    gnbind.h
 | 
				
			||||
gnglyph.c   gnglyph.h   gnmain.c    gnmain.h    gnmap.c     gnmap.h
 | 
				
			||||
gnmenu.c    gnmenu.h    gnmesg.c    gnmesg.h    gnomeprv.h  gnopts.c
 | 
				
			||||
gnopts.h    gnplayer.c  gnplayer.h  gnsignal.c  gnsignal.h  gnstatus.c
 | 
				
			||||
gnstatus.h  gntext.c    gntext.h    gnworn.c    gnworn.h    gnyesno.c
 | 
				
			||||
gnyesno.h   mapbg.xpm
 | 
				
			||||
 | 
				
			||||
sound/fmod:
 | 
				
			||||
(file in top directory)
 | 
				
			||||
fmod.c
 | 
				
			||||
 | 
				
			||||
sound/macsound:
 | 
				
			||||
(file in top directory)
 | 
				
			||||
macsound.m
 | 
				
			||||
 | 
				
			||||
sound/qtsound:
 | 
				
			||||
(file in top directory)
 | 
				
			||||
README.md
 | 
				
			||||
 | 
				
			||||
sound/wav:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
README                       attributions.txt
 | 
				
			||||
sa2_xpleveldown.uu           sa2_xplevelup.uu
 | 
				
			||||
se_squeak_A.uu               se_squeak_B.uu
 | 
				
			||||
se_squeak_B_flat.uu          se_squeak_C.uu
 | 
				
			||||
se_squeak_D.uu               se_squeak_D_flat.uu
 | 
				
			||||
se_squeak_E.uu               se_squeak_E_flat.uu
 | 
				
			||||
se_squeak_F.uu               se_squeak_F_sharp.uu
 | 
				
			||||
se_squeak_G.uu               se_squeak_G_sharp.uu
 | 
				
			||||
sound_Bell.uu                sound_Bugle_A.uu
 | 
				
			||||
sound_Bugle_B.uu             sound_Bugle_C.uu
 | 
				
			||||
sound_Bugle_D.uu             sound_Bugle_E.uu
 | 
				
			||||
sound_Bugle_F.uu             sound_Bugle_G.uu
 | 
				
			||||
sound_Drum_Of_Earthquake.uu  sound_Fire_Horn.uu
 | 
				
			||||
sound_Frost_Horn.uu          sound_Leather_Drum.uu
 | 
				
			||||
sound_Magic_Flute_A.uu       sound_Magic_Flute_B.uu
 | 
				
			||||
sound_Magic_Flute_C.uu       sound_Magic_Flute_D.uu
 | 
				
			||||
sound_Magic_Flute_E.uu       sound_Magic_Flute_F.uu
 | 
				
			||||
sound_Magic_Flute_G.uu       sound_Magic_Harp_A.uu
 | 
				
			||||
sound_Magic_Harp_B.uu        sound_Magic_Harp_C.uu
 | 
				
			||||
sound_Magic_Harp_D.uu        sound_Magic_Harp_E.uu
 | 
				
			||||
sound_Magic_Harp_F.uu        sound_Magic_Harp_G.uu
 | 
				
			||||
sound_Tooled_Horn_A.uu       sound_Tooled_Horn_B.uu
 | 
				
			||||
sound_Tooled_Horn_C.uu       sound_Tooled_Horn_D.uu
 | 
				
			||||
sound_Tooled_Horn_E.uu       sound_Tooled_Horn_F.uu
 | 
				
			||||
sound_Tooled_Horn_G.uu       sound_Wooden_Flute_A.uu
 | 
				
			||||
sound_Wooden_Flute_B.uu      sound_Wooden_Flute_C.uu
 | 
				
			||||
sound_Wooden_Flute_D.uu      sound_Wooden_Flute_E.uu
 | 
				
			||||
sound_Wooden_Flute_F.uu      sound_Wooden_Flute_G.uu
 | 
				
			||||
sound_Wooden_Harp_A.uu       sound_Wooden_Harp_B.uu
 | 
				
			||||
sound_Wooden_Harp_C.uu       sound_Wooden_Harp_D.uu
 | 
				
			||||
sound_Wooden_Harp_E.uu       sound_Wooden_Harp_F.uu
 | 
				
			||||
sound_Wooden_Harp_G.uu       uu2wav.cmd
 | 
				
			||||
uu2wav.sh
 | 
				
			||||
 | 
				
			||||
sound/windsound:
 | 
				
			||||
(file in top directory)
 | 
				
			||||
windsound.c
 | 
				
			||||
 | 
				
			||||
src:
 | 
				
			||||
(files for all versions)
 | 
				
			||||
allmain.c   alloc.c     apply.c     artifact.c  attrib.c    ball.c
 | 
				
			||||
bones.c     botl.c      cmd.c       date.c      dbridge.c   decl.c
 | 
				
			||||
detect.c    dig.c       display.c   dlb.c       do.c        do_name.c
 | 
				
			||||
do_wear.c   dog.c       dogmove.c   dokick.c    dothrow.c   drawing.c
 | 
				
			||||
dungeon.c   eat.c       end.c       engrave.c   exper.c     explode.c
 | 
				
			||||
extralev.c  files.c     fountain.c  hack.c      hacklib.c   insight.c
 | 
				
			||||
invent.c    isaac64.c   light.c     lock.c      mail.c      makemon.c
 | 
				
			||||
mcastu.c    mdlib.c     mhitm.c     mhitu.c     minion.c    mklev.c
 | 
				
			||||
mkmap.c     mkmaze.c    mkobj.c     mkroom.c    mon.c       mondata.c
 | 
				
			||||
monmove.c   monst.c     mplayer.c   mthrowu.c   muse.c      music.c
 | 
				
			||||
nhlobj.c    nhlsel.c    nhlua.c     o_init.c    objects.c   objnam.c
 | 
				
			||||
options.c   pager.c     pickup.c    pline.c     polyself.c  potion.c
 | 
				
			||||
pray.c      priest.c    quest.c     questpgr.c  read.c      rect.c
 | 
				
			||||
region.c    restore.c   rip.c       rnd.c       role.c      rumors.c
 | 
				
			||||
save.c      sfstruct.c  shk.c       shknam.c    sit.c       sounds.c
 | 
				
			||||
sp_lev.c    spell.c     steal.c     steed.c     symbols.c   sys.c
 | 
				
			||||
teleport.c  timeout.c   topten.c    track.c     trap.c      u_init.c
 | 
				
			||||
uhitm.c     utf8map.c   vault.c     version.c   vision.c    weapon.c
 | 
				
			||||
were.c      wield.c     windows.c   wizard.c    worm.c      worn.c
 | 
				
			||||
write.c     zap.c
 | 
				
			||||
 | 
				
			||||
submodules:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
lua          pdcurses     pdcursesmod
 | 
				
			||||
 | 
				
			||||
sys/libnh:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
README.md    libnhmain.c  sysconf
 | 
				
			||||
 | 
				
			||||
sys/libnh/test:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
README.md  libtest.c  run.sh
 | 
				
			||||
 | 
				
			||||
sys/msdos:
 | 
				
			||||
(files for MSDOS version)
 | 
				
			||||
Install.dos              Makefile.GCC             exceptn.S.patch
 | 
				
			||||
fetch-cross-compiler.sh  font.c                   font.h
 | 
				
			||||
msdos.c                  msdoshlp.txt             nhlua.h
 | 
				
			||||
pckeys.c                 pctiles.c                pctiles.h
 | 
				
			||||
pcvideo.h                portio.h                 setup.bat
 | 
				
			||||
sysconf                  tile2bin.c               vesa.h
 | 
				
			||||
video.c                  vidtxt.c                 vidvesa.c
 | 
				
			||||
vidvga.c
 | 
				
			||||
 | 
				
			||||
(files for running MSDOS binary under Windows)
 | 
				
			||||
nhico.uu  nhpif.uu
 | 
				
			||||
 | 
				
			||||
sys/msdos/fonts:
 | 
				
			||||
(files for MSDOS version)
 | 
				
			||||
README.txt    makefont.lua  nh-u16b.bdf   nh-u16v.bdf   nh-u18b.bdf
 | 
				
			||||
nh-u20b.bdf   nh-u22b.bdf   nh-u24b.bdf   nh-u28b.bdf   nh-u32b.bdf
 | 
				
			||||
 | 
				
			||||
sys/share:
 | 
				
			||||
(Berkeley random number file, which may be included in any version)
 | 
				
			||||
random.c
 | 
				
			||||
 | 
				
			||||
(Berkeley uudecode file, which may be used in build process of any version)
 | 
				
			||||
uudecode.c
 | 
				
			||||
 | 
				
			||||
(file for MSDOS, OS/2, Amiga, and Atari versions - only MSDOS tested for 3.7)
 | 
				
			||||
pcmain.c
 | 
				
			||||
 | 
				
			||||
(file for MSDOS, OS/2, and Atari versions - only MSDOS tested for 3.7)
 | 
				
			||||
NetHack.cnf  pctty.c
 | 
				
			||||
 | 
				
			||||
(file for MSDOS, OS/2, and VMS versions)
 | 
				
			||||
termcap
 | 
				
			||||
 | 
				
			||||
(file for VMS version)
 | 
				
			||||
tclib.c
 | 
				
			||||
 | 
				
			||||
(files for MSDOS, OS/2 and Atari versions - only MSDOS tested for 3.7)
 | 
				
			||||
pcsys.c   pcunix.c
 | 
				
			||||
 | 
				
			||||
(files for OS/2 version - untested for 3.7)
 | 
				
			||||
Makefile.lib  termcap.uu
 | 
				
			||||
 | 
				
			||||
(files for UNIX and Be versions)
 | 
				
			||||
ioctl.c    unixtty.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
 | 
				
			||||
 | 
				
			||||
(pmatch regex for other versions)
 | 
				
			||||
pmatchregex.c
 | 
				
			||||
 | 
				
			||||
sys/unix:
 | 
				
			||||
(files for UNIX versions)
 | 
				
			||||
Install.unx     Makefile.dat    Makefile.doc    Makefile.src
 | 
				
			||||
Makefile.top    Makefile.utl    NewInstall.unx  README.xcode
 | 
				
			||||
XCode.xcconfig  depend.awk      gitinfo.sh      mkmkfile.sh
 | 
				
			||||
nethack.sh      setup.sh        sysconf         unixmain.c
 | 
				
			||||
unixres.c       unixunix.c
 | 
				
			||||
 | 
				
			||||
sys/unix/NetHack.xcodeproj:
 | 
				
			||||
(file for macOS Xcode)
 | 
				
			||||
project.pbxproj
 | 
				
			||||
 | 
				
			||||
sys/unix/NetHack.xcodeproj/project.xcworkspace:
 | 
				
			||||
(file for macOS Xcode)
 | 
				
			||||
contents.xcworkspacedata
 | 
				
			||||
 | 
				
			||||
sys/unix/NetHack.xcodeproj/project.xcworkspace/xcshareddata:
 | 
				
			||||
(files for macOS Xcode)
 | 
				
			||||
IDEWorkspaceChecks.plist      WorkspaceSettings.xcsettings
 | 
				
			||||
 | 
				
			||||
sys/unix/NetHack.xcodeproj/xcshareddata/xcschemes:
 | 
				
			||||
(files for macOS Xcode)
 | 
				
			||||
NetHack.xcscheme   makedefs.xcscheme  recover.xcscheme
 | 
				
			||||
 | 
				
			||||
sys/unix/hints:
 | 
				
			||||
(files for configuring UNIX NetHack versions)
 | 
				
			||||
linux-minimal       linux.370           macOS.370
 | 
				
			||||
macosx.sh           solaris             solaris-playground
 | 
				
			||||
unix
 | 
				
			||||
 | 
				
			||||
sys/unix/hints/include:
 | 
				
			||||
(files for configuring UNIX NetHack versions)
 | 
				
			||||
compiler.370       cross-post.370     cross-pre.370      gbdates-post.370
 | 
				
			||||
gbdates-pre.370    multisnd-post.370  multisnd1-pre.370  multisnd2-pre.370
 | 
				
			||||
multiw-1.370       multiw-2.370       multiw-3.370
 | 
				
			||||
 | 
				
			||||
sys/vms:
 | 
				
			||||
(files for VMS version)
 | 
				
			||||
Install.vms   Makefile.dat  Makefile.doc  Makefile.src  Makefile.top
 | 
				
			||||
Makefile.utl  install.com   nethack.com   oldcrtl.c     spec_lev.com
 | 
				
			||||
sysconf       vmsbuild.com  vmsfiles.c    vmsmail.c     vmsmain.c
 | 
				
			||||
vmsmisc.c     vmstty.c      vmsunix.c
 | 
				
			||||
 | 
				
			||||
sys/windows:
 | 
				
			||||
(files for Windows 7/8.x/10/11 version)
 | 
				
			||||
.nethackrc.template      Install.windows          Makefile.mingw32
 | 
				
			||||
Makefile.mingw32.depend  Makefile.nmake           console.rc
 | 
				
			||||
consoletty.c             guitty.c                 nethack.def
 | 
				
			||||
nhico.uu                 nhsetup.bat              porthelp
 | 
				
			||||
sysconf.template         win10.c                  win10.h
 | 
				
			||||
win32api.h               windmain.c               windsys.c
 | 
				
			||||
winos.h
 | 
				
			||||
 | 
				
			||||
sys/windows/vs:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
NetHack.sln                   NetHackPackage.appxmanifest
 | 
				
			||||
NetHackPackage.wapproj        NetHackProperties.props
 | 
				
			||||
Package.StoreAssociation.xml  ScreenShot.PNG
 | 
				
			||||
build.bat                     common.props
 | 
				
			||||
config.props                  console.props
 | 
				
			||||
cpp.hint                      default.props
 | 
				
			||||
default_dll.props             default_lib.props
 | 
				
			||||
dirs.props                    dll.props
 | 
				
			||||
files.props
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/Images:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
BadgeLogo.scale-100.png
 | 
				
			||||
BadgeLogo.scale-125.png
 | 
				
			||||
BadgeLogo.scale-150.png
 | 
				
			||||
BadgeLogo.scale-200.png
 | 
				
			||||
BadgeLogo.scale-400.png
 | 
				
			||||
LargeTile.scale-100.png
 | 
				
			||||
LargeTile.scale-125.png
 | 
				
			||||
LargeTile.scale-150.png
 | 
				
			||||
LargeTile.scale-200.png
 | 
				
			||||
LargeTile.scale-400.png
 | 
				
			||||
LockScreenLogo.scale-200.png
 | 
				
			||||
SmallTile.scale-100.png
 | 
				
			||||
SmallTile.scale-125.png
 | 
				
			||||
SmallTile.scale-150.png
 | 
				
			||||
SmallTile.scale-200.png
 | 
				
			||||
SmallTile.scale-400.png
 | 
				
			||||
SplashScreen.scale-100.png
 | 
				
			||||
SplashScreen.scale-125.png
 | 
				
			||||
SplashScreen.scale-150.png
 | 
				
			||||
SplashScreen.scale-200.png
 | 
				
			||||
SplashScreen.scale-400.png
 | 
				
			||||
Square150x150Logo.scale-100.png
 | 
				
			||||
Square150x150Logo.scale-125.png
 | 
				
			||||
Square150x150Logo.scale-150.png
 | 
				
			||||
Square150x150Logo.scale-200.png
 | 
				
			||||
Square150x150Logo.scale-400.png
 | 
				
			||||
Square44x44Logo.altform-unplated_targetsize-16.png
 | 
				
			||||
Square44x44Logo.altform-unplated_targetsize-256.png
 | 
				
			||||
Square44x44Logo.altform-unplated_targetsize-32.png
 | 
				
			||||
Square44x44Logo.altform-unplated_targetsize-48.png
 | 
				
			||||
Square44x44Logo.scale-100.png
 | 
				
			||||
Square44x44Logo.scale-125.png
 | 
				
			||||
Square44x44Logo.scale-150.png
 | 
				
			||||
Square44x44Logo.scale-200.png
 | 
				
			||||
Square44x44Logo.scale-400.png
 | 
				
			||||
Square44x44Logo.targetsize-16.png
 | 
				
			||||
Square44x44Logo.targetsize-24.png
 | 
				
			||||
Square44x44Logo.targetsize-24_altform-unplated.png
 | 
				
			||||
Square44x44Logo.targetsize-256.png
 | 
				
			||||
Square44x44Logo.targetsize-32.png
 | 
				
			||||
Square44x44Logo.targetsize-48.png
 | 
				
			||||
StoreLogo.backup.png
 | 
				
			||||
StoreLogo.scale-100.png
 | 
				
			||||
StoreLogo.scale-125.png
 | 
				
			||||
StoreLogo.scale-150.png
 | 
				
			||||
StoreLogo.scale-200.png
 | 
				
			||||
StoreLogo.scale-400.png
 | 
				
			||||
Wide310x150Logo.scale-100.png
 | 
				
			||||
Wide310x150Logo.scale-125.png
 | 
				
			||||
Wide310x150Logo.scale-150.png
 | 
				
			||||
Wide310x150Logo.scale-200.png
 | 
				
			||||
Wide310x150Logo.scale-400.png
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/NetHack:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
NetHack.vcxproj    afternethack.proj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/NetHackW:
 | 
				
			||||
(file for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
NetHackW.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/PDCurses:
 | 
				
			||||
(file for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
PDCurses.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/PDCursesGui:
 | 
				
			||||
(file for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
pdcursesgui.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/dlb:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
afterdlb.proj  dlb.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/makedefs:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
aftermakedefs.proj  makedefs.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/recover:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
afterrecover.proj  recover.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/tile2bmp:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
aftertile2bmp.proj  tile2bmp.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/tilemap:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
aftertilemap.proj  tilemap.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/tiles:
 | 
				
			||||
(file for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
tiles.vcxproj
 | 
				
			||||
 | 
				
			||||
sys/windows/vs/uudecode:
 | 
				
			||||
(files for Visual Studio 2017 or 2019 or 2022 Community Edition builds)
 | 
				
			||||
afteruudecode.proj  uudecode.vcxproj
 | 
				
			||||
 | 
				
			||||
test:
 | 
				
			||||
(files for testing)
 | 
				
			||||
test_cnf.lua  test_des.lua  test_lev.lua  test_obj.lua  test_sel.lua
 | 
				
			||||
test_shk.lua  test_src.lua  testmove.lua  testwish.lua
 | 
				
			||||
 | 
				
			||||
util:
 | 
				
			||||
(files for all versions)
 | 
				
			||||
dlb_main.c  makedefs.c  mdgrep.h    mdgrep.pl   panic.c     recover.c
 | 
				
			||||
 | 
				
			||||
win/Qt:
 | 
				
			||||
(files for the Qt 4 or 5 widget library - X11, Windows, Mac OS X)
 | 
				
			||||
Qt-issues.txt  qt_bind.cpp    qt_bind.h      qt_click.cpp   qt_click.h
 | 
				
			||||
qt_clust.cpp   qt_clust.h     qt_delay.cpp   qt_delay.h     qt_glyph.cpp
 | 
				
			||||
qt_glyph.h     qt_icon.cpp    qt_icon.h      qt_inv.cpp     qt_inv.h
 | 
				
			||||
qt_kde0.h      qt_key.cpp     qt_key.h       qt_line.cpp    qt_line.h
 | 
				
			||||
qt_main.cpp    qt_main.h      qt_map.cpp     qt_map.h       qt_menu.cpp
 | 
				
			||||
qt_menu.h      qt_msg.cpp     qt_msg.h       qt_plsel.cpp   qt_plsel.h
 | 
				
			||||
qt_post.h      qt_pre.h       qt_rip.cpp     qt_rip.h       qt_set.cpp
 | 
				
			||||
qt_set.h       qt_stat.cpp    qt_stat.h      qt_str.cpp     qt_str.h
 | 
				
			||||
qt_streq.cpp   qt_streq.h     qt_svsel.cpp   qt_svsel.h     qt_win.cpp
 | 
				
			||||
qt_win.h       qt_xcmd.cpp    qt_xcmd.h      qt_xpms.h      qt_yndlg.cpp
 | 
				
			||||
qt_yndlg.h
 | 
				
			||||
 | 
				
			||||
win/X11:
 | 
				
			||||
(files for X versions)
 | 
				
			||||
Install.X11     NetHack.ad      Window.c        X11-issues.txt
 | 
				
			||||
dialogs.c       ibm.bdf         nethack.rc      nh10.bdf
 | 
				
			||||
nh32icon        nh56icon        nh72icon        nh_icon.xpm
 | 
				
			||||
pet_mark.xbm    pilemark.xbm    rip.xpm         tile2x11.c
 | 
				
			||||
winX.c          winmap.c        winmenu.c       winmesg.c
 | 
				
			||||
winmisc.c       winstat.c       wintext.c       winval.c
 | 
				
			||||
 | 
				
			||||
win/chain:
 | 
				
			||||
(files for stacking window systems)
 | 
				
			||||
wc_chainin.c   wc_chainout.c  wc_trace.c
 | 
				
			||||
 | 
				
			||||
win/curses:
 | 
				
			||||
(files in top directory)
 | 
				
			||||
Bugs.txt    Readme.txt  Todo.txt    cursdial.c  cursdial.h  cursinit.c
 | 
				
			||||
cursinit.h  cursinvt.c  cursinvt.h  cursmain.c  cursmesg.c  cursmesg.h
 | 
				
			||||
cursmisc.c  cursmisc.h  cursstat.c  cursstat.h  curswins.c  curswins.h
 | 
				
			||||
 | 
				
			||||
win/macosx:
 | 
				
			||||
(files for macosx versions)
 | 
				
			||||
NetHackGuidebook.applescript  NetHackRecover.applescript
 | 
				
			||||
NetHackTerm.applescript       recover.pl
 | 
				
			||||
 | 
				
			||||
win/share:
 | 
				
			||||
(files for versions using optional tiles)
 | 
				
			||||
bmptiles.c     gifread.c      giftiles.c     monsters.txt   nhicns.uu
 | 
				
			||||
nhsplash.xpm   objects.txt    other.txt      ppmwrite.c     renumtiles.pl
 | 
				
			||||
safeproc.c     thintile.c     tile.doc       tile.h         tile2bmp.c
 | 
				
			||||
tilemap.c      tileset.c      tiletext.c     tiletxt.c
 | 
				
			||||
 | 
				
			||||
win/shim:
 | 
				
			||||
(file in top directory)
 | 
				
			||||
winshim.c
 | 
				
			||||
 | 
				
			||||
win/tty:
 | 
				
			||||
(files for tty versions)
 | 
				
			||||
getline.c  termcap.c  topl.c     wintty.c
 | 
				
			||||
 | 
				
			||||
win/win32:
 | 
				
			||||
(files for Windows versions - tested up to Windows 11)
 | 
				
			||||
NetHackW.c             NetHackW.exe.manifest  NetHackW.rc
 | 
				
			||||
mhaskyn.c              mhaskyn.h              mhdlg.c
 | 
				
			||||
mhdlg.h                mhfont.c               mhfont.h
 | 
				
			||||
mhinput.c              mhinput.h              mhmain.c
 | 
				
			||||
mhmain.h               mhmap.c                mhmap.h
 | 
				
			||||
mhmenu.c               mhmenu.h               mhmsg.h
 | 
				
			||||
mhmsgwnd.c             mhmsgwnd.h             mhrip.c
 | 
				
			||||
mhrip.h                mhsplash.c             mhsplash.h
 | 
				
			||||
mhstatus.c             mhstatus.h             mhtext.c
 | 
				
			||||
mhtext.h               mnsel.uu               mnselcnt.uu
 | 
				
			||||
mnunsel.uu             mswproc.c              nethack.rc
 | 
				
			||||
nhresource.h           petmark.uu             pilemark.uu
 | 
				
			||||
record.uu              resource.h             rip.uu
 | 
				
			||||
splash.uu              tiles-mingw32.mak      tiles.mak
 | 
				
			||||
winMS.h
 | 
				
			||||
 | 
				
			||||
This is a list of files produced by auxiliary programs.  They can all be
 | 
				
			||||
regenerated from the files in the distribution.
 | 
				
			||||
 | 
				
			||||
dat:
 | 
				
			||||
(files generated by makedefs at playground creation time)
 | 
				
			||||
data     options  oracles  rumors
 | 
				
			||||
 | 
				
			||||
(files generated for Qt interface on macOS)
 | 
				
			||||
Info.plist    nethack.icns
 | 
				
			||||
 | 
				
			||||
(files generated for windows at compile time)
 | 
				
			||||
dlb.lst   porthelp
 | 
				
			||||
 | 
				
			||||
(files generated for windows gui at compile time)
 | 
				
			||||
guioptions
 | 
				
			||||
 | 
				
			||||
(files generated for windows tty at compile time)
 | 
				
			||||
ttyoptions
 | 
				
			||||
 | 
				
			||||
(tile files optionally generated for X ports at playground creation time)
 | 
				
			||||
pet_mark.xbm  rip.xpm       x11tiles
 | 
				
			||||
 | 
				
			||||
src:
 | 
				
			||||
(files for win32 that are moved into src at compile time)
 | 
				
			||||
Makefile          Makefile.mingw32
 | 
				
			||||
 | 
				
			||||
(files generated by 'moc' for Qt interface at compile time)
 | 
				
			||||
qt_kde0.moc   qt_main.moc   qt_map.moc    qt_menu.moc   qt_msg.moc
 | 
				
			||||
qt_plsel.moc  qt_set.moc    qt_stat.moc   qt_xcmd.moc   qt_yndlg.moc
 | 
				
			||||
 | 
				
			||||
(file generated by makedefs -m but unused in 3.7)
 | 
				
			||||
monstr.c
 | 
				
			||||
 | 
				
			||||
(file optionally generated by tilemap at compile time)
 | 
				
			||||
tile.c
 | 
				
			||||
 | 
				
			||||
sys/windows:
 | 
				
			||||
(file generated by uudecode at compile time)
 | 
				
			||||
nethack.ico
 | 
				
			||||
 | 
				
			||||
util:
 | 
				
			||||
(file generated for unix at compile time if various tiles utilities are built)
 | 
				
			||||
tiletxt.c
 | 
				
			||||
 | 
				
			||||
(file generated for windows at compile time)
 | 
				
			||||
uudecode.exe
 | 
				
			||||
 | 
				
			||||
NOTE: If your binaries were compiled with the data librarian (DLB) option,
 | 
				
			||||
      your playground will not contain all of the files listed here.  All
 | 
				
			||||
      of the files listed as being required for the playground must still
 | 
				
			||||
      have been built by your compiler, but the DLB code will roll them up
 | 
				
			||||
      into another file (or files).
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,265 @@
 | 
				
			||||
  NetHack Porting Guidelines		v 3.7			2023-04-23
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
     1.0	Introduction
 | 
				
			||||
 | 
				
			||||
	This document goes through the steps required to port NetHack to a
 | 
				
			||||
new machine, with the intention of compiling natively on that machine. If
 | 
				
			||||
you are cross-compiling for one platform on another, it is suggested that
 | 
				
			||||
you read Cross-compiling.
 | 
				
			||||
 | 
				
			||||
The basic steps in porting the program using a native compiler are:
 | 
				
			||||
 | 
				
			||||
	1.  Get the code onto your build machine.  The parts of the current
 | 
				
			||||
	    directory setup you definitely need include src (NetHack code
 | 
				
			||||
	    shared by all systems), include (include files), util (code
 | 
				
			||||
	    for utility programs), and dat (various data files).  The
 | 
				
			||||
	    documentation in doc is strongly recommended.  You already
 | 
				
			||||
	    have the files in the top directory since you're reading this
 | 
				
			||||
	    one. :-)
 | 
				
			||||
 | 
				
			||||
	    If you will be cross-compiling for your target platform on
 | 
				
			||||
            a different platform, you may want to read Cross-compiling
 | 
				
			||||
            in the Top folder as well.
 | 
				
			||||
 | 
				
			||||
	    A full list of the distribution files and their associated
 | 
				
			||||
	    OSes may be found in the top-level file "Files".
 | 
				
			||||
 | 
				
			||||
	    If your machine uses an OS already supported, you need the sys
 | 
				
			||||
	    subdirectory for that OS and possibly sys/share.  Otherwise,
 | 
				
			||||
	    get the closest match (say sys/msdos for single-tasking OSes
 | 
				
			||||
	    and sys/unix for multi-user OSes, along with sys/share, if
 | 
				
			||||
	    nothing else comes to mind).  You may want others for
 | 
				
			||||
	    comparison.
 | 
				
			||||
 | 
				
			||||
	    If your machine uses a windowing system already supported,
 | 
				
			||||
	    you need the win subdirectory for that system (or the
 | 
				
			||||
	    appropriate sys subdirectory if the windowing system was
 | 
				
			||||
	    previously considered restricted to one OS) and possibly
 | 
				
			||||
	    win/share.
 | 
				
			||||
 | 
				
			||||
	2.  Modify the appropriate include files to customize NetHack to
 | 
				
			||||
	    your system.  You may need to add a new OS-specific "*conf.h"
 | 
				
			||||
	    file (see unixconf.h, windconf.h, pcconf.h, etc. as examples).
 | 
				
			||||
 | 
				
			||||
	3.  If your machine uses a new OS instead of a variant of existing
 | 
				
			||||
	    OSes, add a new sys subdirectory.  Add, if required, a OS-
 | 
				
			||||
	    specific copy of "main.c", "tty.c" and "unix.c".  Possibly
 | 
				
			||||
	    add an OS-specific library (see "msdos.c" and "tos.c" as
 | 
				
			||||
	    examples) to provide functions NetHack wants and your OS lacks.
 | 
				
			||||
 | 
				
			||||
	4.  If your machine uses a new windowing system, follow doc/window.txt
 | 
				
			||||
	    carefully.  Put files implementing these routines in a win or
 | 
				
			||||
	    sys subdirectory as appropriate.
 | 
				
			||||
 | 
				
			||||
	5.  If your compilation environment isn't close to one already
 | 
				
			||||
	    supported, try starting from the UNIX makefiles.  Modify the
 | 
				
			||||
	    top level makefile and the src makefile as required.  Then run
 | 
				
			||||
	    an initial compile.  You are bound to get some errors.  You
 | 
				
			||||
	    should be able to fix them in a fairly simple fashion.  If
 | 
				
			||||
	    things seem to be getting too complex, take a step back, and
 | 
				
			||||
	    possibly send us some mail.  We might be able to help.
 | 
				
			||||
 | 
				
			||||
	6.  Mail all of your fixes to us in a contextual form so that we can
 | 
				
			||||
	    easily integrate them into the code, or fork the NetHack
 | 
				
			||||
            repository on GitHub and issue a pull-request for your changes.
 | 
				
			||||
 | 
				
			||||
	One general rule of thumb exists.  Always add code.  Don't delete
 | 
				
			||||
somebody else's code for yours -- it won't work on their machine if you do.
 | 
				
			||||
Always add your OS specific code inside #ifdef / #else / #endif constructs
 | 
				
			||||
so that it will be able to be folded back into the original code easily.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
     2.0	Include Files
 | 
				
			||||
 | 
				
			||||
     2.1	config.h
 | 
				
			||||
 | 
				
			||||
	The file "config.h" is a master configuration file that determines
 | 
				
			||||
the basic features of the game, as well as many of the security options.
 | 
				
			||||
It is intended that end users configure the game by editing "config.h" and
 | 
				
			||||
an appropriate "*conf.h" file, so any #defines for individual preferences
 | 
				
			||||
should be added to those files.  OS-specific #defines that are not intended
 | 
				
			||||
to be changed should also go in "*conf.h"; try to find the most appropriate
 | 
				
			||||
place for other #defines.
 | 
				
			||||
 | 
				
			||||
	The following sections may require modification:
 | 
				
			||||
 | 
				
			||||
     -	Section 1:	OS and window system selection.
 | 
				
			||||
			You may have to put a #define for your OS here.
 | 
				
			||||
			If your OS is yet another UNIX variant, put the
 | 
				
			||||
			#define in unixconf.h instead.
 | 
				
			||||
			An unfortunately large amount of stuff shares
 | 
				
			||||
			this section because the #definitions have to
 | 
				
			||||
			be seen before *conf.h is reached.  Don't add
 | 
				
			||||
			to this unless necessary.
 | 
				
			||||
 | 
				
			||||
     -	Section 2:	Global parameters and filenames.
 | 
				
			||||
			These will have to be customized to your system.
 | 
				
			||||
 | 
				
			||||
     -	Section 3:	Type definitions and other compiler behavior.
 | 
				
			||||
			These will have to be matched to your compiler.
 | 
				
			||||
 | 
				
			||||
     2.2	global.h
 | 
				
			||||
 | 
				
			||||
	This file defines things specific to NetHack that should not
 | 
				
			||||
require modification by an end user.  For a new port, you may have to add
 | 
				
			||||
automatic inclusion of another auxiliary config file (*conf.h) which you
 | 
				
			||||
wrote for your system.
 | 
				
			||||
 | 
				
			||||
     2.3	extern.h
 | 
				
			||||
 | 
				
			||||
	If you create any new source modules or new functions in old modules,
 | 
				
			||||
you must enter the names of the new external references (the functions defined
 | 
				
			||||
there for external use) in this file.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
     3.0	Source files
 | 
				
			||||
 | 
				
			||||
	The first step in getting the game up is to get the "makedefs"
 | 
				
			||||
program running.  This program is used to create configuration-specific
 | 
				
			||||
files for the game.
 | 
				
			||||
 | 
				
			||||
	Once "makedefs" has been built, the rest of the game can be compiled.
 | 
				
			||||
You may have to create an OS-specific module to handle things you want to
 | 
				
			||||
use, like a mouse or a ram-disk.
 | 
				
			||||
 | 
				
			||||
     3.1	Makefiles
 | 
				
			||||
 | 
				
			||||
	This distribution provides makefiles for several kinds of systems.
 | 
				
			||||
There are joint makefiles for the various varieties of UNIX, makefiles for
 | 
				
			||||
MSDOS, a makefile for NT, and so on.  You may have to create a new
 | 
				
			||||
makefile for your specific machine.  You may even have to translate some
 | 
				
			||||
makefiles into a form more congenial to your system.  If possible, however,
 | 
				
			||||
add to one of those provided.
 | 
				
			||||
 | 
				
			||||
     3.2	termcap.c
 | 
				
			||||
 | 
				
			||||
	If your system wants to use tty windowing and it doesn't run off
 | 
				
			||||
of a termcap or terminfo database, you may have to put the appropriate
 | 
				
			||||
terminal control strings into termcap.c. You can also consider using the
 | 
				
			||||
termcap code from sys/share/tclib.c or sys/share/termcap.uu, especially if
 | 
				
			||||
your system supports multiple kinds of terminals. Alternatively, you can
 | 
				
			||||
define NO_TERMS and provide alternative screen handling in a 
 | 
				
			||||
platform-specific module. That has already been done for MSDOS and for
 | 
				
			||||
the Windows console, and those mods can be used as an example.
 | 
				
			||||
 | 
				
			||||
     3.4	tty.c
 | 
				
			||||
 | 
				
			||||
	You may need to create a new "tty.c" module.  If you do, call it
 | 
				
			||||
[OS]tty.c where the [OS] is replaced with the name of the OS you are porting
 | 
				
			||||
to.  This file contains the routines that configure the terminal/console
 | 
				
			||||
for raw I/O, etc.
 | 
				
			||||
 | 
				
			||||
     3.5	unix.c
 | 
				
			||||
 | 
				
			||||
	You may need to create a new "unix.c" module.  If you do, call it
 | 
				
			||||
[OS]unix.c where the [OS] is replaced with the name of the OS you are porting
 | 
				
			||||
to.  This file contains some OS dependencies concerning time and filename
 | 
				
			||||
creation.
 | 
				
			||||
 | 
				
			||||
	An object of the NetHack development project is to get the game
 | 
				
			||||
working on as many different types of hardware and under as many different
 | 
				
			||||
operating systems as is practical.  Any assistance will be appreciated.
 | 
				
			||||
 | 
				
			||||
Cross-compiling may allow porting of NetHack to a machine where there may
 | 
				
			||||
be challenges building on the platform directly, and may help maintain a
 | 
				
			||||
working version of NetHack on that platform. See the file Cross-compiling
 | 
				
			||||
for more information.
 | 
				
			||||
 | 
				
			||||
     4.0	Build Process
 | 
				
			||||
 | 
				
			||||
NetHack requires the following steps to be carried out:
 | 
				
			||||
 | 
				
			||||
     4.1. makedefs
 | 
				
			||||
 | 
				
			||||
Compile and link util/makedefs. Run makedefs repeatedly with different command
 | 
				
			||||
line options to produce several output files that are required for:
 | 
				
			||||
          (a) creation of files, containing information required by,
 | 
				
			||||
              or about the game during its execution, that are stored in a
 | 
				
			||||
              portable, platform-independent way, that need to be inserted
 | 
				
			||||
              into the final game package.
 | 
				
			||||
 | 
				
			||||
          Required for complete packaging of the game, but not the C source
 | 
				
			||||
          game compile:
 | 
				
			||||
              util/makedefs -d
 | 
				
			||||
              util/makedefs -r
 | 
				
			||||
              util/makedefs -h
 | 
				
			||||
              util/makedefs -s
 | 
				
			||||
 | 
				
			||||
          For reference purposes, but no longer a required prerequisite for the
 | 
				
			||||
          game compile process:
 | 
				
			||||
              util/makedefs -v
 | 
				
			||||
              util/makedefs -o
 | 
				
			||||
              util/makedefs -p
 | 
				
			||||
 | 
				
			||||
     4.2. Other utilities
 | 
				
			||||
 | 
				
			||||
	Compile and link other utilities such as uudecode, tile-generation
 | 
				
			||||
utilities, and so forth. Those produce output files for use during the game and
 | 
				
			||||
need to be included in the packaging of the game.
 | 
				
			||||
 | 
				
			||||
     4.3. Lua
 | 
				
			||||
 | 
				
			||||
	Compile and link into a library, or obtain a prebuilt Lua library for
 | 
				
			||||
your platform. Place the Lua source into lib/lua-5.4.6 (or other folder
 | 
				
			||||
representing an appropriate Lua version); place the compiled Lua library into
 | 
				
			||||
lib.
 | 
				
			||||
 | 
				
			||||
     4.4  Compile NetHack sources
 | 
				
			||||
 | 
				
			||||
	Compile the source code of the game, including a suitable
 | 
				
			||||
regular-expression choice from several options available in sys/share. Pick one
 | 
				
			||||
that is supported by your OS or that you have obtained a 3rd party library for.
 | 
				
			||||
 | 
				
			||||
     4.5  Compile optional window port components into a library
 | 
				
			||||
 | 
				
			||||
	If your platform requires 3rd party sources in order to support the
 | 
				
			||||
window port options that you have chosen, such as curses sources for the curses
 | 
				
			||||
window port, you may store the sources for that library in a subfolder under
 | 
				
			||||
lib.
 | 
				
			||||
 | 
				
			||||
     4.6. Link the game
 | 
				
			||||
 | 
				
			||||
	Link the game to the Lua library, and to any window port support
 | 
				
			||||
libraries.
 | 
				
			||||
 | 
				
			||||
     4.7  Package the game
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
     5.0	Design Updates
 | 
				
			||||
 | 
				
			||||
The following design updates were introduced in NetHack 3.7.
 | 
				
			||||
 | 
				
			||||
     5.1  Quest text files
 | 
				
			||||
 | 
				
			||||
	The quest text files that were formerly converted from their source
 | 
				
			||||
text by makedefs during the build process, have been replaced by Lua versions
 | 
				
			||||
and are inserted into the game package for processing by the embedded Lua
 | 
				
			||||
interpreter during game execution.
 | 
				
			||||
 | 
				
			||||
     5.2  Level Compiler
 | 
				
			||||
 | 
				
			||||
	There is no longer a build-time level compiler. Instead, the level
 | 
				
			||||
descriptions have been converted to Lua and are inserted into the game package
 | 
				
			||||
for processing by the embeded Lua interpreter during game execution.
 | 
				
			||||
 | 
				
			||||
     5.3  Dungeon Compiler
 | 
				
			||||
 | 
				
			||||
	There is no longer a build-time dungeon compiler. Instead, the dungeon
 | 
				
			||||
description has been converted to Lua and is inserted into the game package for
 | 
				
			||||
processing by the embeded Lua interpreter during game execution.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
     5.4  Run-time Options
 | 
				
			||||
 | 
				
			||||
	Some of the build and option information that was formerly produced at
 | 
				
			||||
build-time by makedefs, and contained information about the game platform and
 | 
				
			||||
options selected during the build of the game, can now be produced at run-time
 | 
				
			||||
by code within the game itself. That was done to facilitate cross-compiling of
 | 
				
			||||
NetHack on one platform for game execution on another.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# NetHack 3.7  Porting       $NHDT-Date: 1643491454 2022/01/29 21:24:14 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.17 $
 | 
				
			||||
# Copyright (c) 2005 by Michael Allison
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
@ -0,0 +1,216 @@
 | 
				
			||||
         NetHack 3.7.0 work-in-progress -- General information
 | 
				
			||||
 | 
				
			||||
NetHack 3.7 is an enhancement to the dungeon exploration game NetHack,
 | 
				
			||||
which is a distant descendent of Rogue and Hack, and a direct descendent of
 | 
				
			||||
NetHack 3.6.
 | 
				
			||||
 | 
				
			||||
NetHack 3.7.0 work-in-progress is not a release of NetHack. As a .0 version,
 | 
				
			||||
and still very early in its development cycle, there has already been changes
 | 
				
			||||
made, and there will continue to be many more prior to an eventual release.
 | 
				
			||||
The file doc/fixes3-7-0.txt in the source distribution will be updated with
 | 
				
			||||
a list of fixes as they are committed.
 | 
				
			||||
 | 
				
			||||
In short -- there are likely to be bugs. Don't treat NetHack-3.7 branch as
 | 
				
			||||
released code, and if stability is paramount, then the most recent
 | 
				
			||||
NetHack 3.6.7 release is safest for you.
 | 
				
			||||
 | 
				
			||||
We're making the .0 work-in-progress available so that you can observe, test
 | 
				
			||||
out, and contribute to its development. Constructive suggestions, GitHub pull
 | 
				
			||||
requests, and bug reports are all welcome and encouraged.
 | 
				
			||||
 | 
				
			||||
The file doc/fixes3-7-0.txt in the source distribution has a full list of
 | 
				
			||||
bug-fixes included so far, as well as brief mentions of some of the other code
 | 
				
			||||
changes. The text in there was written for the development team's own use and is
 | 
				
			||||
provided  "as is", so please do not ask us to further explain the entries in
 | 
				
			||||
that file. Some entries might be considered "spoilers", particularly in the
 | 
				
			||||
"new features" section.
 | 
				
			||||
 | 
				
			||||
Along with the game improvements and bug fixes, NetHack 3.7 strives to make
 | 
				
			||||
some general architectural improvements to the game or to its building
 | 
				
			||||
process. Among them:
 | 
				
			||||
 | 
				
			||||
 *  Remove barriers to building NetHack on one platform and operating system,
 | 
				
			||||
    for later execution on another (possibly quite different) platform and/or
 | 
				
			||||
    operating system. That capability is generally known as "cross-compiling."
 | 
				
			||||
    See the file "Cross-compiling" in the top-level folder for more information
 | 
				
			||||
    on that.
 | 
				
			||||
 | 
				
			||||
 *  Replace the build-time "yacc and lex"-based level compiler, the "yacc and
 | 
				
			||||
    lex"-based dungeon compiler, and the quest text file processing done
 | 
				
			||||
    by NetHack's "makedefs" utility, with Lua text alternatives that are
 | 
				
			||||
    loaded and processed by the game during play.
 | 
				
			||||
 | 
				
			||||
 *  Write game savefiles and bonesfiles in a more portable and consistent way
 | 
				
			||||
    to open up the possibility of utilizing them between different platforms,
 | 
				
			||||
    such as between your desktop computer and your hand-held device.
 | 
				
			||||
 | 
				
			||||
 *  Add support to make the game restartable without exit (a.k.a. "play again"
 | 
				
			||||
    support). Toward that end, many previously scattered and separate variables
 | 
				
			||||
    have been gathered into central 'ga' through 'gz' structures in
 | 
				
			||||
    decl.h/decl.c. That central ability to reinitialize the variables will
 | 
				
			||||
    benefit the porting effort to some platforms that are under consideration
 | 
				
			||||
    where "play again" is typical.
 | 
				
			||||
 | 
				
			||||
Here are some other general notes on the changes in NetHack 3.7 that were not
 | 
				
			||||
considered spoilers:
 | 
				
			||||
 -  automatic annotation "gateway to Moloch's Sanctum" for vibrating square
 | 
				
			||||
        level once that square's location becomes known (found or magic
 | 
				
			||||
        mapped); goes away once sanctum temple is found (entered or high altar
 | 
				
			||||
        mapped)
 | 
				
			||||
 -  savefile: add support to deconstruct internal data structures down into
 | 
				
			||||
        their individual fields and save those fields instead of the entire
 | 
				
			||||
        struct
 | 
				
			||||
 -  savefile: use little-endian format for fields where that makes a difference
 | 
				
			||||
 | 
				
			||||
                        - - - - - - - - - - -
 | 
				
			||||
 | 
				
			||||
Please read items (1), (2) and (3) BEFORE doing anything with your new code.
 | 
				
			||||
 | 
				
			||||
1.  Unpack the code in a dedicated new directory.  We will refer to that
 | 
				
			||||
    directory as the 'Top' directory.  It makes no difference what you
 | 
				
			||||
    call it.
 | 
				
			||||
 | 
				
			||||
2.  Having unpacked, you should have a file called 'Files' in your Top
 | 
				
			||||
    directory.
 | 
				
			||||
 | 
				
			||||
    This file contains the list of all the files you now SHOULD
 | 
				
			||||
    have in each directory.  Please check the files in each directory
 | 
				
			||||
    against this list to make sure that you have a complete set.
 | 
				
			||||
 | 
				
			||||
    This file also contains a list of what files are created during
 | 
				
			||||
    the build process.
 | 
				
			||||
 | 
				
			||||
    The names of the directories listed should not be changed unless you
 | 
				
			||||
    are ready to go through the makefiles and the makedefs program and change
 | 
				
			||||
    all the directory references in them.
 | 
				
			||||
 | 
				
			||||
3.  Before you do anything else, please read carefully the file called
 | 
				
			||||
    "license" in the 'dat' subdirectory.  It is expected that you comply
 | 
				
			||||
    with the terms of that license, and we are very serious about it.
 | 
				
			||||
 | 
				
			||||
4.  If you are attempting to build NetHack on one platform/processor, to
 | 
				
			||||
    produce a game on a different platform/processor it may behoove you to
 | 
				
			||||
    read the file "Cross-compiling" in your Top directory.
 | 
				
			||||
 | 
				
			||||
5.  If everything is in order, you can now turn to trying to get the program
 | 
				
			||||
    to compile and run on your particular system.  It is worth mentioning
 | 
				
			||||
    that the default configuration is SysV/Sun/Solaris2.x (simply because
 | 
				
			||||
    the code was housed on such a system).
 | 
				
			||||
 | 
				
			||||
    The files sys/*/Install.* were written to guide you in configuring the
 | 
				
			||||
    program for your operating system.  The files win/*/Install.* are
 | 
				
			||||
    available, where necessary, to help you in configuring the program
 | 
				
			||||
    for particular windowing environments.  Reading them, and the man pages,
 | 
				
			||||
    should answer most of your questions.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    At the time of the most recent official release, NetHack 3.6, it had
 | 
				
			||||
    been tested to run/compile on:
 | 
				
			||||
 | 
				
			||||
        Intel Pentium or better running Linux, BSDI
 | 
				
			||||
        Intel Pentium or better running Windows 10 or 11
 | 
				
			||||
        Intel-based, or Apple M1 or M2 Macs running macOS 10.11 (El Capitan) to
 | 
				
			||||
            13 (Ventura) (follow the instructions in sys/unix/NewInstall.unx)
 | 
				
			||||
        Intel 80386 or greater running MS-DOS with DPMI
 | 
				
			||||
            built via djgpp compiler (native or Linux-hosted cross-compiler)
 | 
				
			||||
        OpenVMS (aka VMS) V8.4 on Alpha and on Integrity/Itanium/IA64
 | 
				
			||||
 | 
				
			||||
    Previous versions of NetHack were tested and known to run on the
 | 
				
			||||
    following systems, but it is unknown if they can still build and
 | 
				
			||||
    execute NetHack 3.6 or NetHack 3.7:
 | 
				
			||||
 | 
				
			||||
        Apple Macintosh running MacOS 7.5 or higher, LinuxPPC, BeOS 4.0
 | 
				
			||||
        Atari ST/TT/Falcon running TOS (or MultiTOS) with GCC
 | 
				
			||||
        AT&T 3B1 running System V (3.51)
 | 
				
			||||
        AT&T 3B2/600 & 3B2/622 running System V R3.2.1
 | 
				
			||||
        AT&T 3B2/1000 Model 80 running System V R3.2.2
 | 
				
			||||
        AT&T 3B4000 running System V
 | 
				
			||||
        AT&T 6386 running System V R3.2
 | 
				
			||||
        Commodore Amiga running AmigaDOS 3.0 or higher with SAS/C 6.x
 | 
				
			||||
                (but see Makefile.ami about DICE and Manx)
 | 
				
			||||
        Data General AViiON systems running DG/UX
 | 
				
			||||
        DEC Alpha/VMS (aka OpenVMS AXP), running V1.x through V7.1
 | 
				
			||||
        DEC VAX/VMS, running V4.6 through V7.1
 | 
				
			||||
        DEC vaxen running BSD, Ultrix
 | 
				
			||||
        Decstations running Ultrix 3.1, 4.x
 | 
				
			||||
        Encore Multimax running UMAX 4.2
 | 
				
			||||
        Gould NP1 running UTX 3/2
 | 
				
			||||
        HP 9000s300 running HP-UX
 | 
				
			||||
        HP 9000s700 running HP-UX 9.x, 10.x, 11.x
 | 
				
			||||
        H/PC Pro devices running Windows CE 2.11 and higher.
 | 
				
			||||
        IBM PC/RT and RS/6000 running AIX 3.x
 | 
				
			||||
        IBM PS/2 and AT compatibles running OS/2 - 2.0 and up with GCC emx
 | 
				
			||||
        IBM PS/2 and AT compatibles running OS/2 1.1 - 2.0 (and probably
 | 
				
			||||
           Warp) with Microsoft 6.0, and OS/2 2.0 and up with IBM CSet++ 2.0.
 | 
				
			||||
        Intel 80386 or greater (or clone) running 386BSD
 | 
				
			||||
        Intel x86 running a version of Windows 7 or 8 or prior to XP.
 | 
				
			||||
        Mips M2000 running RiscOS 4.1
 | 
				
			||||
        NeXT running Mach (using BSD configuration)
 | 
				
			||||
        Palm Size PC 1.1 devices running Windows CE 2.11
 | 
				
			||||
        Pocket PC devices running Windows CE 3.0 and higher
 | 
				
			||||
        Pyramid 9820x running OSx 4.4c
 | 
				
			||||
        SGI Iris running IRIX
 | 
				
			||||
        Stardent Vistra 800 running SysV R4.0
 | 
				
			||||
        Stride 460 running UniStride 2.1
 | 
				
			||||
        Sun-3s, -4s, and -386is running SunOS 3.x
 | 
				
			||||
        Sun-3s and -386is running SunOS 4.x
 | 
				
			||||
        "Sun SPARC"-based machine running SunOS 4.x, Solaris 2.x, or Solaris 7
 | 
				
			||||
        Valid Logic Systems SCALD-System
 | 
				
			||||
 | 
				
			||||
    Previous versions, using a cross-compiler hosted on another platform,
 | 
				
			||||
    such as  win32, could also build the following from source:
 | 
				
			||||
        Pocket PC devices running Windows CE 3.0 and higher
 | 
				
			||||
        H/PC Pro devices running Windows CE 2.11 and higher
 | 
				
			||||
        Palm Size PC 1.1 devices running Windows CE 2.11
 | 
				
			||||
 | 
				
			||||
    Unless otherwise mentioned, the compiler used was the OS-vendor's
 | 
				
			||||
    C compiler.
 | 
				
			||||
 | 
				
			||||
                        - - - - - - - - - - -
 | 
				
			||||
 | 
				
			||||
If you have problems building the game, or you find bugs in it, we recommend
 | 
				
			||||
filing a bug report from our "Contact Us" web page at:
 | 
				
			||||
    https://www.nethack.org/common/contact.html
 | 
				
			||||
Please include the version information from #version or the command line
 | 
				
			||||
option --version in the appropriate field.
 | 
				
			||||
 | 
				
			||||
A public repository of the latest NetHack code that we've made
 | 
				
			||||
available can be obtained via git here:
 | 
				
			||||
    https://github.com/NetHack/NetHack
 | 
				
			||||
      or
 | 
				
			||||
    https://sourceforge.net/p/nethack/NetHack/
 | 
				
			||||
 | 
				
			||||
When sending correspondence, please observe the following:
 | 
				
			||||
o Please be sure to include your machine type, OS, and patchlevel.
 | 
				
			||||
o Please avoid sending us binary files (e.g. save files or bones files).
 | 
				
			||||
  If you have found a bug and think that your save file would aid in solving
 | 
				
			||||
  the problem, send us a description in words of the problem, your machine
 | 
				
			||||
  type, your operating system, and the version of NetHack.  Tell us that you
 | 
				
			||||
  have a save file, but do not actually send it.
 | 
				
			||||
  You may then be contacted by a member of the development team with the
 | 
				
			||||
  address of a specific person to send the save file to.
 | 
				
			||||
o Though we make an effort to reply to each bug report, it may take some
 | 
				
			||||
  time before you receive feedback.  This is especially true during the
 | 
				
			||||
  period immediately after a new release, when we get the most bug reports.
 | 
				
			||||
o We don't give hints for playing the game.
 | 
				
			||||
o Don't bother to ask when the next version will be out or you can expect
 | 
				
			||||
  to receive a stock answer.
 | 
				
			||||
 | 
				
			||||
If you want to submit a patch for the NetHack source code via email directly,
 | 
				
			||||
you can direct it to this address:
 | 
				
			||||
    nethack-bugs (at) nethack.org
 | 
				
			||||
 | 
				
			||||
If a feature is not accepted you are free, of course, to post the patches
 | 
				
			||||
to the net yourself and let the marketplace decide their worth.
 | 
				
			||||
 | 
				
			||||
All of this amounts to the following:  If you decide to apply a free-lanced
 | 
				
			||||
patch to your 3.6 code, you are welcome to do so, of course, but we won't
 | 
				
			||||
be able to provide support or receive bug reports for it.
 | 
				
			||||
 | 
				
			||||
In our own patches, we will assume that your code is synchronized with ours.
 | 
				
			||||
 | 
				
			||||
                  -- Good luck, and happy Hacking --
 | 
				
			||||
 | 
				
			||||
# $NHDT-Date: 1652133501 2022/05/09 21:58:21 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.97 $
 | 
				
			||||
# Copyright (c) 2012 by Michael Allison
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
@ -0,0 +1,254 @@
 | 
				
			||||
strategy:
 | 
				
			||||
  matrix:
 | 
				
			||||
    linux_latest_gcc9_minimal:
 | 
				
			||||
      imageName: 'ubuntu-latest'
 | 
				
			||||
      toolchainName: gcc9
 | 
				
			||||
      buildTargetName: minimal
 | 
				
			||||
    linux_jammy_clang_all:
 | 
				
			||||
      imageName: 'ubuntu-22.04'
 | 
				
			||||
      toolchainName: clang
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    linux_jammy_gcc9_all:
 | 
				
			||||
      imageName: 'ubuntu-22.04'
 | 
				
			||||
      toolchainName: gcc9
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    linux_jammy_gcc12_all:
 | 
				
			||||
      imageName: 'ubuntu-22.04'
 | 
				
			||||
      toolchainName: gcc12
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    macOS_latest_clang_all:
 | 
				
			||||
      imageName: 'macOS-latest'
 | 
				
			||||
      toolchainName: clang
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    macOS_Ventura_clang13_all:
 | 
				
			||||
      imageName: 'macOS-13'
 | 
				
			||||
      toolchainName: clang
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    windows-visualstudio:
 | 
				
			||||
      imageName: 'windows-latest'
 | 
				
			||||
      toolchainName: vs
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    windows-mingw:
 | 
				
			||||
      imageName: 'windows-2019'
 | 
				
			||||
      toolchainName: mingw
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
    linux_focal_cross_msdos:
 | 
				
			||||
      imageName: 'ubuntu-20.04'
 | 
				
			||||
      toolchainName: cross
 | 
				
			||||
      buildTargetName: msdos
 | 
				
			||||
    linux_jammy_docs:
 | 
				
			||||
      imageName: 'ubuntu-22.04'
 | 
				
			||||
      toolchainName: docs
 | 
				
			||||
      buildTargetName: all
 | 
				
			||||
      continueOnError: true
 | 
				
			||||
 | 
				
			||||
pool:
 | 
				
			||||
  vmImage: $(imageName)
 | 
				
			||||
 | 
				
			||||
# resources:
 | 
				
			||||
#  repositories:
 | 
				
			||||
#  - repository: pdcursesrepo
 | 
				
			||||
#    type: github
 | 
				
			||||
#    name: wmcbrine/PDCurses
 | 
				
			||||
#    ref: refs/heads/master
 | 
				
			||||
#    endpoint: github.com_barthouse
 | 
				
			||||
 | 
				
			||||
variables:
 | 
				
			||||
  toolchain: $(toolchainName)
 | 
				
			||||
  buildTarget: $(buildTargetName)
 | 
				
			||||
  netHackPath: s/NetHack
 | 
				
			||||
 | 
				
			||||
steps:
 | 
				
			||||
- bash: |
 | 
				
			||||
    if [ "$(toolchain)" == "gcc7" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-7"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-7"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "gcc9" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-9"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-9"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "gcc10" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-10"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-10"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "gcc11" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-11"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-11"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "gcc12" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-12"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-12"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "clang" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]clang"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]clang++"
 | 
				
			||||
    fi
 | 
				
			||||
    if [ "$(toolchain)" == "cross" ]
 | 
				
			||||
    then
 | 
				
			||||
      echo "##vso[task.setvariable variable=CC]gcc-9"
 | 
				
			||||
      echo "##vso[task.setvariable variable=CXX]g++-9"
 | 
				
			||||
    fi
 | 
				
			||||
  displayName: 'Setting variables'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    echo "toolchain: $(toolchain)"
 | 
				
			||||
    echo "buildTarget: $(buildTarget)"
 | 
				
			||||
    echo "netHackPath: $NETHACKPATH"
 | 
				
			||||
    echo "CC: $CC"
 | 
				
			||||
    echo "CXX: $CXX"
 | 
				
			||||
  displayName: 'Echoing variables'
 | 
				
			||||
 | 
				
			||||
- checkout: git://NetHack/NetHack@NetHack-3.7
 | 
				
			||||
  submodules: true
 | 
				
			||||
  path: $(netHackPath) # $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
 | 
				
			||||
- task: DownloadSecureFile@1
 | 
				
			||||
  name: storeKey
 | 
				
			||||
  inputs:
 | 
				
			||||
    secureFile: 'NetHackPackage_StoreKey.pfx'
 | 
				
			||||
  condition: eq( variables.toolchain, 'vs' )
 | 
				
			||||
  displayName: 'Store Key Download'
 | 
				
			||||
 | 
				
			||||
- task: CopyFiles@2
 | 
				
			||||
  inputs:
 | 
				
			||||
    contents: NetHackPackage_StoreKey.pfx
 | 
				
			||||
    SourceFolder: $(Agent.TempDirectory)
 | 
				
			||||
    TargetFolder: $(Agent.BuildDirectory)/$(netHackPath)/sys/windows/vs
 | 
				
			||||
  condition: eq( variables.toolchain, 'vs' )
 | 
				
			||||
  displayName: 'Copying store key'
 | 
				
			||||
 | 
				
			||||
- task: MSBuild@1
 | 
				
			||||
  inputs:
 | 
				
			||||
    solution: $(Agent.BuildDirectory)/$(netHackPath)/sys/windows/vs/NetHack.sln
 | 
				
			||||
    platform: Win32
 | 
				
			||||
    configuration: Debug
 | 
				
			||||
  condition: eq( variables.toolchain, 'vs' )
 | 
				
			||||
  displayName: 'Visual Studio Build'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    export ADD_LUA=Y
 | 
				
			||||
    export WANT_LUAC=N
 | 
				
			||||
    export LUATOP=../submodules/lua
 | 
				
			||||
    export LUASRC=../submodules/lua
 | 
				
			||||
    export ADD_CURSES=Y
 | 
				
			||||
    export PDCURSES_TOP=../submodules/pdcursesmod
 | 
				
			||||
    export LUA_VERSION=5.4.6
 | 
				
			||||
    #
 | 
				
			||||
    # 64-bit
 | 
				
			||||
    #export CURLSRC=https://github.com/brechtsanders/winlibs_mingw/releases/download/11.2.0-9.0.0-ucrt-r5/winlibs-x86_64-posix-seh-gcc-11.2.0-mingw-w64ucrt-9.0.0-r5.zip
 | 
				
			||||
    #export CURLDST=mingw-x64.zip
 | 
				
			||||
    #export MINGWBIN=mingw64
 | 
				
			||||
    #export MSYSTEM=MINGW64
 | 
				
			||||
    #
 | 
				
			||||
    # 32-bit
 | 
				
			||||
    export CURLSRC=https://github.com/brechtsanders/winlibs_mingw/releases/download/11.2.0-9.0.0-ucrt-r5/winlibs-i686-posix-dwarf-gcc-11.2.0-mingw-w64ucrt-9.0.0-r5.zip
 | 
				
			||||
    export CURLDST=mingw-x86.zip
 | 
				
			||||
    export MINGWBIN=mingw32
 | 
				
			||||
    export MSYSTEM=MINGW32
 | 
				
			||||
    # all
 | 
				
			||||
    mkdir -p ../lib
 | 
				
			||||
    cd ../lib
 | 
				
			||||
    mkdir -p mingw
 | 
				
			||||
    curl -L $CURLSRC -o $CURLDST
 | 
				
			||||
    #tar -C mingw -xvf $CURLDST
 | 
				
			||||
    #/c/Windows/System32/tar -C mingw -xvf $CURLDST
 | 
				
			||||
    powershell -command "Expand-Archive -Force $CURLDST mingw"
 | 
				
			||||
    export PATH=../lib/mingw/$MINGWBIN/bin:$PATH
 | 
				
			||||
    export
 | 
				
			||||
    cd ../src
 | 
				
			||||
    pwd
 | 
				
			||||
    cp ../sys/windows/Makefile.mingw32* .
 | 
				
			||||
    mingw32-make -f Makefile.mingw32 CI_COMPILER=1 GIT=1 MSYSTEM=$MSYSTEM LUA_VERSION=$LUA_VERSION clean
 | 
				
			||||
    mingw32-make -f Makefile.mingw32 CI_COMPILER=1 GIT=1 MSYSTEM=$MSYSTEM LUA_VERSION=$LUA_VERSION depend
 | 
				
			||||
    mingw32-make -f Makefile.mingw32 CI_COMPILER=1 GIT=1 MSYSTEM=$MSYSTEM LUA_VERSION=$LUA_VERSION
 | 
				
			||||
  condition: eq( variables.toolchain, 'mingw' )
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)/src
 | 
				
			||||
  displayName: 'MinGW Build'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    sudo apt-get -qq -y update
 | 
				
			||||
    sudo apt-get -qq -y install libncurses5-dev
 | 
				
			||||
    sudo apt-get -qq -y install libx11-dev libxaw7-dev xfonts-utils qtbase5-dev qtmultimedia5-dev qtbase5-dev-tools
 | 
				
			||||
  condition: eq( variables['Agent.OS'], 'Linux' )
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
  displayName: 'Getting linux build dependencies'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    cd sys/unix
 | 
				
			||||
    sh setup.sh hints/linux.370
 | 
				
			||||
    cd ../..
 | 
				
			||||
    make fetch-lua
 | 
				
			||||
    make WANT_WIN_ALL=1 QT_SELECT=5 MOC=moc all
 | 
				
			||||
  condition: and(eq( variables['Agent.OS'], 'Linux' ), eq( variables.buildTarget, 'all'))
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
  displayName: 'Building linux full build'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    cd sys/unix
 | 
				
			||||
    sh setup.sh hints/linux-minimal
 | 
				
			||||
    cd ../..
 | 
				
			||||
    sed -i '/^#define CLIPPING/d'       include/config.h
 | 
				
			||||
    sed -i '/^#define COMPRESS/d'       include/config.h
 | 
				
			||||
    #sed -i '/^#define DOAGAIN/d'        include/config.h
 | 
				
			||||
    sed -i '/^#define DUMPLOG/d'        include/config.h
 | 
				
			||||
    #sed -i '/^#define GDBPATH/d'        include/config.h
 | 
				
			||||
    #sed -i '/^#define GREPPATH/d'       include/config.h
 | 
				
			||||
    sed -i '/^#define INSURANCE/d'      include/config.h
 | 
				
			||||
    sed -i '/^#define ENHANCED_SYMBOLS/d' include/config.h
 | 
				
			||||
    sed -i '/^#define LOGFILE/d'        include/config.h
 | 
				
			||||
    sed -i '/^#define NEWS/d'           include/config.h
 | 
				
			||||
    sed -i '/^#define PANICLOG/d'       include/config.h
 | 
				
			||||
    #sed -i '/^#define STATUS_HILITES/d' include/config.h
 | 
				
			||||
    sed -i '/^#define SYSCF/d'          include/config.h
 | 
				
			||||
    sed -i '/^#define USER_SOUNDS/d'    include/config.h
 | 
				
			||||
    sed -i '/^#define XLOGFILE/d'       include/config.h
 | 
				
			||||
    sed -i '/^#define HANGUPHANDLING/d' include/global.h
 | 
				
			||||
    sed -i '/^#define MAIL/d'           include/unixconf.h
 | 
				
			||||
    sed -i '/^#define SHELL/d'          include/unixconf.h
 | 
				
			||||
    sed -i '/^#define SUSPEND/d'        include/unixconf.h
 | 
				
			||||
    sed -i 's/^#define TEXTCOLOR//'     include/unixconf.h
 | 
				
			||||
    make fetch-lua
 | 
				
			||||
    make WANT_WIN_ALL=1 all
 | 
				
			||||
  condition: and(eq( variables['Agent.OS'], 'Linux' ), eq( variables.buildTarget, 'minimal'))
 | 
				
			||||
  displayName: 'Building linux minimal build'
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    cd sys/unix
 | 
				
			||||
    sh setup.sh hints/macos.370
 | 
				
			||||
    cd ../..
 | 
				
			||||
    make fetch-lua
 | 
				
			||||
    make WANT_MACSOUND=1 all
 | 
				
			||||
  condition: eq( variables['Agent.OS'], 'Darwin' )
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
  displayName: 'Building mac full build'
 | 
				
			||||
 | 
				
			||||
- bash: |
 | 
				
			||||
    export GCCVER=gcc1220
 | 
				
			||||
    cd sys/unix
 | 
				
			||||
    sh setup.sh hints/linux.370
 | 
				
			||||
    cd ../..
 | 
				
			||||
    make fetch-lua
 | 
				
			||||
    sh sys/msdos/fetch-cross-compiler.sh
 | 
				
			||||
    retVal=$?
 | 
				
			||||
    if [ $retVal -eq 0 ]; then
 | 
				
			||||
        make LUA_VERSION=5.4.6 WANT_WIN_TTY=1 WANT_WIN_CURSES=1 CROSS_TO_MSDOS=1 package
 | 
				
			||||
    fi
 | 
				
			||||
  condition: and(eq( variables['Agent.OS'], 'Linux' ), eq( variables.toolchain, 'cross'))
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
  displayName: 'Building MSDOS build'
 | 
				
			||||
- bash: |
 | 
				
			||||
    sudo apt-get install texlive
 | 
				
			||||
    make Guidebook
 | 
				
			||||
    make Guidebook.txt
 | 
				
			||||
    make Guidebook.pdf
 | 
				
			||||
  condition: and(eq( variables['Agent.OS'], 'Linux' ), eq( variables.toolchain, 'docs'))
 | 
				
			||||
  workingDirectory: $(Agent.BuildDirectory)/$(netHackPath)
 | 
				
			||||
  displayName: 'Building NetHack documentation'
 | 
				
			||||
@ -0,0 +1,10 @@
 | 
				
			||||
*.def	NHSUBST
 | 
				
			||||
*.des	NHSUBST
 | 
				
			||||
*.txt	NHSUBST
 | 
				
			||||
*.lua	NHSUBST
 | 
				
			||||
data.base NHSUBST
 | 
				
			||||
symbols NHSUBST
 | 
				
			||||
tribute NHSUBST
 | 
				
			||||
GENFILES NHSUBST
 | 
				
			||||
* NH_filestag=(file%s_for_all_versions)
 | 
				
			||||
..files NH_filegenprog
 | 
				
			||||
@ -0,0 +1,27 @@
 | 
				
			||||
options
 | 
				
			||||
oracles
 | 
				
			||||
data
 | 
				
			||||
rip.xpm
 | 
				
			||||
pet_mark.xbm
 | 
				
			||||
pilemark.xbm
 | 
				
			||||
quest.dat
 | 
				
			||||
rumors
 | 
				
			||||
bogusmon
 | 
				
			||||
engrave
 | 
				
			||||
epitaph
 | 
				
			||||
x11tiles
 | 
				
			||||
nhtiles.bmp
 | 
				
			||||
*.lev
 | 
				
			||||
spec_levs
 | 
				
			||||
quest_levs
 | 
				
			||||
dungeon.pdf
 | 
				
			||||
dungeon
 | 
				
			||||
nethack.png
 | 
				
			||||
nhsplash.xpm
 | 
				
			||||
nhdat
 | 
				
			||||
dlb.lst
 | 
				
			||||
guioptions
 | 
				
			||||
porthelp
 | 
				
			||||
NetHack.ad
 | 
				
			||||
gitinfo.txt
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
-- NetHack Archeologist Arc-fila.lua	$NHDT-Date: 1652195998 2022/05/10 15:19:58 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
});
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
         contents = function()
 | 
				
			||||
            des.object()
 | 
				
			||||
            des.object()
 | 
				
			||||
            des.monster("S")
 | 
				
			||||
         end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
              des.monster("human mummy")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
-- NetHack Archeologist Arc-filb.lua	$NHDT-Date: 1652195998 2022/05/10 15:19:58 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("M")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("M")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("M")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
              des.monster("human mummy")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("S")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,115 @@
 | 
				
			||||
-- NetHack Archeologist Arc-goal.lua	$NHDT-Date: 1652195998 2022/05/10 15:19:58 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
                                  ---------                                 
 | 
				
			||||
                                  |..|.|..|                                 
 | 
				
			||||
                       -----------|..S.S..|-----------                      
 | 
				
			||||
                       |.|........|+-|.|-+|........|.|                      
 | 
				
			||||
                       |.S........S..|.|..S........S.|                      
 | 
				
			||||
                       |.|........|..|.|..|........|.|                      
 | 
				
			||||
                    ------------------+------------------                   
 | 
				
			||||
                    |..|..........|.......|..........|..|                   
 | 
				
			||||
                    |..|..........+.......|..........S..|                   
 | 
				
			||||
                    |..S..........|.......+..........|..|                   
 | 
				
			||||
                    |..|..........|.......|..........|..|                   
 | 
				
			||||
                    ------------------+------------------                   
 | 
				
			||||
                       |.|........|..|.|..|........|.|                      
 | 
				
			||||
                       |.S........S..|.|..S........S.|                      
 | 
				
			||||
                       |.|........|+-|.|-+|........|.|                      
 | 
				
			||||
                       -----------|..S.S..|-----------                      
 | 
				
			||||
                                  |..|.|..|                                 
 | 
				
			||||
                                  ---------                                 
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region(selection.area(35,02,36,03), "unlit")
 | 
				
			||||
des.region(selection.area(40,02,41,03), "unlit")
 | 
				
			||||
des.region(selection.area(24,04,24,06), "unlit")
 | 
				
			||||
des.region(selection.area(26,04,33,06), "lit")
 | 
				
			||||
des.region(selection.area(38,02,38,06), "unlit")
 | 
				
			||||
des.region(selection.area(43,04,50,06), "lit")
 | 
				
			||||
des.region(selection.area(52,04,52,06), "unlit")
 | 
				
			||||
des.region(selection.area(35,05,36,06), "unlit")
 | 
				
			||||
des.region(selection.area(40,05,41,06), "unlit")
 | 
				
			||||
des.region(selection.area(21,08,22,11), "unlit")
 | 
				
			||||
des.region(selection.area(24,08,33,11), "lit")
 | 
				
			||||
des.region(selection.area(35,08,41,11), "unlit")
 | 
				
			||||
des.region(selection.area(43,08,52,11), "lit")
 | 
				
			||||
des.region(selection.area(54,08,55,11), "unlit")
 | 
				
			||||
des.region(selection.area(24,13,24,15), "unlit")
 | 
				
			||||
des.region(selection.area(26,13,33,15), "unlit")
 | 
				
			||||
des.region(selection.area(35,13,36,14), "unlit")
 | 
				
			||||
des.region(selection.area(35,16,36,17), "unlit")
 | 
				
			||||
des.region(selection.area(38,13,38,17), "unlit")
 | 
				
			||||
des.region(selection.area(40,13,41,14), "unlit")
 | 
				
			||||
des.region(selection.area(40,16,41,17), "unlit")
 | 
				
			||||
des.region({ region={43,13, 50,15}, lit=0, type="temple", filled=2 })
 | 
				
			||||
des.region(selection.area(52,13,52,15), "unlit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 38,10)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- The altar of Huhetotl.  Unattended.
 | 
				
			||||
des.altar({ x=50,y=14,align="chaos",type="altar" })
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "crystal ball", x=50, y=14,buc="blessed",spe=5,name="The Orb of Detection" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap("rolling boulder",46,14)
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("Minion of Huhetotl", 50, 14)
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("M")
 | 
				
			||||
@ -0,0 +1,145 @@
 | 
				
			||||
-- NetHack Archeologist Arc-loca.lua	$NHDT-Date: 1652195999 2022/05/10 15:19:59 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
........................-------------------------------.....................
 | 
				
			||||
........................|....|.S......................|.....................
 | 
				
			||||
........................|....|.|.|+------------------.|.....................
 | 
				
			||||
........................|....|.|.|.|.........|......|.|.....................
 | 
				
			||||
........................|....|.|.|.|.........|......|.|.....................
 | 
				
			||||
........................|---+-.|.|.|..---....+......|.|.....................
 | 
				
			||||
........................|....|.|.|.---|.|....|......|.|.....................
 | 
				
			||||
........................|....S.|.|.+..S.|--S-----S--|.|.....................
 | 
				
			||||
........................|....|.|.|.---|.|....|......+.|.....................
 | 
				
			||||
........................|---+-.|.|.|..---....|.------.|.....................
 | 
				
			||||
........................|....|.|.|.|.........|.|....+.|.....................
 | 
				
			||||
........................|....|.|.|.|.........|+|....|-|.....................
 | 
				
			||||
........................|....|.|.|------------+------.S.....................
 | 
				
			||||
........................|....|.S......................|.....................
 | 
				
			||||
........................-------------------------------.....................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region({ region={25,04, 28,07}, lit=1, type="temple", filled=2 })
 | 
				
			||||
des.region({ region={25,09, 28,11}, lit=0, type="temple", filled=2 })
 | 
				
			||||
des.region({ region={25,13, 28,16}, lit=1, type="temple", filled=2 })
 | 
				
			||||
des.region(selection.area(30,04,30,16), "lit")
 | 
				
			||||
des.region(selection.area(32,04,32,16), "unlit")
 | 
				
			||||
des.region({ region={33,04, 53,04}, lit=0, type="ordinary", irregular=1 })
 | 
				
			||||
des.region(selection.area(36,10,37,10), "unlit")
 | 
				
			||||
des.region(selection.area(39,09,39,11), "unlit")
 | 
				
			||||
des.region({ region={36,06, 42,08}, lit=0, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={36,12, 42,14}, lit=0, type="ordinary", irregular=1 })
 | 
				
			||||
des.region(selection.area(46,06,51,09), "unlit")
 | 
				
			||||
des.region({ region={46,11, 49,11}, lit=0, type="ordinary", irregular=1 })
 | 
				
			||||
des.region(selection.area(48,13,51,14), "unlit")
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("closed",31,04)
 | 
				
			||||
des.door("closed",28,08)
 | 
				
			||||
des.door("locked",29,10)
 | 
				
			||||
des.door("closed",28,12)
 | 
				
			||||
des.door("closed",31,16)
 | 
				
			||||
des.door("locked",34,05)
 | 
				
			||||
des.door("locked",35,10)
 | 
				
			||||
des.door("locked",38,10)
 | 
				
			||||
des.door("closed",43,10)
 | 
				
			||||
des.door("closed",45,08)
 | 
				
			||||
des.door("locked",46,14)
 | 
				
			||||
des.door("locked",46,15)
 | 
				
			||||
des.door("locked",49,10)
 | 
				
			||||
des.door("locked",52,11)
 | 
				
			||||
des.door("closed",52,13)
 | 
				
			||||
des.door("closed",54,15)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 03,17)
 | 
				
			||||
des.stair("down", 39,10)
 | 
				
			||||
-- Altars - three types.  All are unattended.
 | 
				
			||||
des.altar({ x=26,y=05,align=align[1], type="altar" })
 | 
				
			||||
des.altar({ x=26,y=10,align=align[2], type="altar" })
 | 
				
			||||
des.altar({ x=26,y=15,align=align[3], type="altar" })
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Treasure?
 | 
				
			||||
des.engraving({ type="engrave", text="X marks the spot." })
 | 
				
			||||
des.engraving({ type="engrave", text="X marks the spot." })
 | 
				
			||||
des.engraving({ type="engrave", text="X marks the spot." })
 | 
				
			||||
des.engraving({ type="engrave", text="X marks the spot." })
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("spiked pit",24,02)
 | 
				
			||||
des.trap("spiked pit",37,00)
 | 
				
			||||
des.trap("spiked pit",23,05)
 | 
				
			||||
des.trap("spiked pit",26,19)
 | 
				
			||||
des.trap("spiked pit",55,10)
 | 
				
			||||
des.trap("spiked pit",55,08)
 | 
				
			||||
des.trap("pit",51,01)
 | 
				
			||||
des.trap("pit",23,18)
 | 
				
			||||
des.trap("pit",31,18)
 | 
				
			||||
des.trap("pit",48,19)
 | 
				
			||||
des.trap("pit",55,15)
 | 
				
			||||
des.trap("magic",60,04)
 | 
				
			||||
des.trap("statue",72,07)
 | 
				
			||||
des.trap("statue")
 | 
				
			||||
des.trap("statue")
 | 
				
			||||
des.trap("anti magic",64,12)
 | 
				
			||||
des.trap("sleep gas")
 | 
				
			||||
des.trap("sleep gas")
 | 
				
			||||
des.trap("dart")
 | 
				
			||||
des.trap("dart")
 | 
				
			||||
des.trap("dart")
 | 
				
			||||
des.trap("rolling boulder",32,10)
 | 
				
			||||
des.trap("rolling boulder",40,16)
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("S")
 | 
				
			||||
des.monster("M")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("human mummy")
 | 
				
			||||
des.monster("M")
 | 
				
			||||
@ -0,0 +1,116 @@
 | 
				
			||||
-- NetHack Archeologist Arc-strt.lua	$NHDT-Date: 1652195999 2022/05/10 15:19:59 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Lord Carnarvon
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.................
 | 
				
			||||
....................}-------------------------------------}.................
 | 
				
			||||
....................}|..S......+.................+.......|}.................
 | 
				
			||||
....................}-S---------------+----------|.......|}.................
 | 
				
			||||
....................}|.|...............|.......+.|.......|}.................
 | 
				
			||||
....................}|.|...............---------.---------}.................
 | 
				
			||||
....................}|.S.\.............+.................+..................
 | 
				
			||||
....................}|.|...............---------.---------}.................
 | 
				
			||||
....................}|.|...............|.......+.|.......|}.................
 | 
				
			||||
....................}-S---------------+----------|.......|}.................
 | 
				
			||||
....................}|..S......+.................+.......|}.................
 | 
				
			||||
....................}-------------------------------------}.................
 | 
				
			||||
....................}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}.................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region(selection.area(22,06,23,06), "unlit")
 | 
				
			||||
des.region(selection.area(25,06,30,06), "unlit")
 | 
				
			||||
des.region(selection.area(32,06,48,06), "unlit")
 | 
				
			||||
des.region(selection.area(50,06,56,08), "lit")
 | 
				
			||||
des.region(selection.area(40,08,46,08), "unlit")
 | 
				
			||||
des.region(selection.area(22,08,22,12), "unlit")
 | 
				
			||||
des.region(selection.area(24,08,38,12), "unlit")
 | 
				
			||||
des.region(selection.area(48,08,48,08), "lit")
 | 
				
			||||
des.region(selection.area(40,10,56,10), "lit")
 | 
				
			||||
des.region(selection.area(48,12,48,12), "lit")
 | 
				
			||||
des.region(selection.area(40,12,46,12), "unlit")
 | 
				
			||||
des.region(selection.area(50,12,56,14), "lit")
 | 
				
			||||
des.region(selection.area(22,14,23,14), "unlit")
 | 
				
			||||
des.region(selection.area(25,14,30,14), "unlit")
 | 
				
			||||
des.region(selection.area(32,14,48,14), "unlit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 55,07)
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {63,06,63,06}, type="branch" })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("closed",22,07)
 | 
				
			||||
des.door("closed",38,07)
 | 
				
			||||
des.door("locked",47,08)
 | 
				
			||||
des.door("locked",23,10)
 | 
				
			||||
des.door("locked",39,10)
 | 
				
			||||
des.door("locked",57,10)
 | 
				
			||||
des.door("locked",47,12)
 | 
				
			||||
des.door("closed",22,13)
 | 
				
			||||
des.door("closed",38,13)
 | 
				
			||||
des.door("locked",24,14)
 | 
				
			||||
des.door("closed",31,14)
 | 
				
			||||
des.door("locked",49,14)
 | 
				
			||||
-- Lord Carnarvon
 | 
				
			||||
des.monster({ id = "Lord Carnarvon", coord = {25, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "fedora", spe = 5 });
 | 
				
			||||
   des.object({ id = "bullwhip", spe = 4 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Lord Carnarvon
 | 
				
			||||
des.object("chest", 25, 10)
 | 
				
			||||
-- student guards for the audience chamber
 | 
				
			||||
des.monster("student", 26, 09)
 | 
				
			||||
des.monster("student", 27, 09)
 | 
				
			||||
des.monster("student", 28, 09)
 | 
				
			||||
des.monster("student", 26, 10)
 | 
				
			||||
des.monster("student", 28, 10)
 | 
				
			||||
des.monster("student", 26, 11)
 | 
				
			||||
des.monster("student", 27, 11)
 | 
				
			||||
des.monster("student", 28, 11)
 | 
				
			||||
-- city watch guards in the antechambers
 | 
				
			||||
des.monster("watchman", 50, 06)
 | 
				
			||||
des.monster("watchman", 50, 14)
 | 
				
			||||
-- Eels in the moat
 | 
				
			||||
des.monster("giant eel", 20, 10)
 | 
				
			||||
des.monster("giant eel", 45, 04)
 | 
				
			||||
des.monster("giant eel", 33, 16)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster("S", 60, 09)
 | 
				
			||||
des.monster("M", 60, 10)
 | 
				
			||||
des.monster("S", 60, 11)
 | 
				
			||||
des.monster("S", 60, 12)
 | 
				
			||||
des.monster("M", 60, 13)
 | 
				
			||||
des.monster("S", 61, 10)
 | 
				
			||||
des.monster("S", 61, 11)
 | 
				
			||||
des.monster("S", 61, 12)
 | 
				
			||||
des.monster("S", 30, 03)
 | 
				
			||||
des.monster("M", 20, 17)
 | 
				
			||||
des.monster("S", 67, 02)
 | 
				
			||||
des.monster("S", 10, 19)
 | 
				
			||||
@ -0,0 +1,33 @@
 | 
				
			||||
-- NetHack Barbarian Bar-fila.lua	$NHDT-Date: 1652195999 2022/05/10 15:19:59 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=".", smoothed=true, joined=true, lit=0, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ class = "O", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,44 @@
 | 
				
			||||
-- NetHack Barbarian Bar-filb.lua	$NHDT-Date: 1652196000 2022/05/10 15:20:00 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, lit=0, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ class = "O", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ class = "T", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,95 @@
 | 
				
			||||
-- NetHack Barbarian Bar-goal.lua	$NHDT-Date: 1652196000 2022/05/10 15:20:00 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
                               .............                                
 | 
				
			||||
                             ..................                             
 | 
				
			||||
        ....              .........................          ....           
 | 
				
			||||
      .......          ..........................           .......         
 | 
				
			||||
      ......             ........................          .......          
 | 
				
			||||
      ..  ......................................             ..             
 | 
				
			||||
       ..                 .....................             ..              
 | 
				
			||||
        ..                 ..................              ..               
 | 
				
			||||
         ..         ..S...S..............   ................                
 | 
				
			||||
          ..                   ........                ...                  
 | 
				
			||||
       .........                                         ..                 
 | 
				
			||||
       ......  ..                                         ...  ....         
 | 
				
			||||
      .. ...    ..                             ......       ........        
 | 
				
			||||
   ....          .. ..................        ........       ......         
 | 
				
			||||
  ......          ......................       ......         ..            
 | 
				
			||||
   ....             ..................              ...........             
 | 
				
			||||
                      ..............                                        
 | 
				
			||||
                        ...........                                         
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "unlit")
 | 
				
			||||
-- Secret doors
 | 
				
			||||
des.door("locked",22,09)
 | 
				
			||||
des.door("locked",26,09)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 36,05)
 | 
				
			||||
-- The altar.  Unattended.
 | 
				
			||||
des.altar({ x=63,y=04,align="noncoaligned", type="altar" })
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "luckstone", x=63, y=04,buc="blessed",spe=0,name="The Heart of Ahriman" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Thoth Amon", x=63, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ class = "O", peaceful=0 })
 | 
				
			||||
des.monster({ class = "O", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ class = "T", peaceful=0 })
 | 
				
			||||
des.wallify()
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,107 @@
 | 
				
			||||
-- NetHack Barbarian Bar-loca.lua	$NHDT-Date: 1652196000 2022/05/10 15:20:00 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
..........PPP.........................................                      
 | 
				
			||||
...........PP..........................................        .......      
 | 
				
			||||
..........PP...........-----..........------------------     ..........     
 | 
				
			||||
...........PP..........+...|..........|....S...........|..  ............    
 | 
				
			||||
..........PPP..........|...|..........|-----...........|...  .............  
 | 
				
			||||
...........PPP.........-----..........+....+...........|...  .............  
 | 
				
			||||
..........PPPPPPPPP...................+....+...........S.................   
 | 
				
			||||
........PPPPPPPPPPPPP.........-----...|-----...........|................    
 | 
				
			||||
......PPPPPPPPPPPPPP..P.......+...|...|....S...........|          ...       
 | 
				
			||||
.....PPPPPPP......P..PPPP.....|...|...------------------..         ...      
 | 
				
			||||
....PPPPPPP.........PPPPPP....-----........................      ........   
 | 
				
			||||
...PPPPPPP..........PPPPPPP..................................   ..........  
 | 
				
			||||
....PPPPPPP........PPPPPPP....................................  ..........  
 | 
				
			||||
.....PPPPP........PPPPPPP.........-----........................   ........  
 | 
				
			||||
......PPP..PPPPPPPPPPPP...........+...|.........................    .....   
 | 
				
			||||
..........PPPPPPPPPPP.............|...|.........................     ....   
 | 
				
			||||
..........PPPPPPPPP...............-----.........................       .    
 | 
				
			||||
..............PPP.................................................          
 | 
				
			||||
...............PP....................................................       
 | 
				
			||||
................PPP...................................................      
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region(selection.area(24,03,26,04), "unlit")
 | 
				
			||||
des.region(selection.area(31,08,33,09), "unlit")
 | 
				
			||||
des.region(selection.area(35,14,37,15), "unlit")
 | 
				
			||||
des.region(selection.area(39,03,54,08), "lit")
 | 
				
			||||
des.region(selection.area(56,00,75,08), "unlit")
 | 
				
			||||
des.region(selection.area(64,09,75,16), "unlit")
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("open",23,03)
 | 
				
			||||
des.door("open",30,08)
 | 
				
			||||
des.door("open",34,14)
 | 
				
			||||
des.door("locked",38,05)
 | 
				
			||||
des.door("locked",38,06)
 | 
				
			||||
des.door("closed",43,03)
 | 
				
			||||
des.door("closed",43,05)
 | 
				
			||||
des.door("closed",43,06)
 | 
				
			||||
des.door("closed",43,08)
 | 
				
			||||
des.door("locked",55,06)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 05,02)
 | 
				
			||||
des.stair("down", 70,13)
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ x = 42, y = 03 })
 | 
				
			||||
des.object({ x = 42, y = 03 })
 | 
				
			||||
des.object({ x = 42, y = 03 })
 | 
				
			||||
des.object({ x = 41, y = 03 })
 | 
				
			||||
des.object({ x = 41, y = 03 })
 | 
				
			||||
des.object({ x = 41, y = 03 })
 | 
				
			||||
des.object({ x = 41, y = 03 })
 | 
				
			||||
des.object({ x = 41, y = 08 })
 | 
				
			||||
des.object({ x = 41, y = 08 })
 | 
				
			||||
des.object({ x = 42, y = 08 })
 | 
				
			||||
des.object({ x = 42, y = 08 })
 | 
				
			||||
des.object({ x = 42, y = 08 })
 | 
				
			||||
des.object({ x = 71, y = 13 })
 | 
				
			||||
des.object({ x = 71, y = 13 })
 | 
				
			||||
des.object({ x = 71, y = 13 })
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("spiked pit",10,13)
 | 
				
			||||
des.trap("spiked pit",21,07)
 | 
				
			||||
des.trap("spiked pit",67,08)
 | 
				
			||||
des.trap("spiked pit",68,09)
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "ogre", x=12, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=18, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=45, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=45, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=47, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=46, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=56, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=56, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=56, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=56, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=57, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=57, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=57, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", x=57, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ogre", peaceful=0 })
 | 
				
			||||
des.monster({ class = "O", peaceful=0 })
 | 
				
			||||
des.monster({ class = "T", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", x=46, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", x=47, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", x=56, y=07, peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", x=57, y=07, peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", x=70, y=13, peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ id = "rock troll", peaceful=0 })
 | 
				
			||||
des.monster({ class = "T", peaceful=0 })
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,99 @@
 | 
				
			||||
-- NetHack Barbarian Bar-strt.lua	$NHDT-Date: 1652196001 2022/05/10 15:20:01 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Pelias,
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
..................................PP........................................
 | 
				
			||||
...................................PP.......................................
 | 
				
			||||
...................................PP.......................................
 | 
				
			||||
....................................PP......................................
 | 
				
			||||
........--------------......-----....PPP....................................
 | 
				
			||||
........|...S........|......+...|...PPP.....................................
 | 
				
			||||
........|----........|......|...|....PP.....................................
 | 
				
			||||
........|.\..........+......-----...........................................
 | 
				
			||||
........|----........|...............PP.....................................
 | 
				
			||||
........|...S........|...-----.......PPP....................................
 | 
				
			||||
........--------------...+...|......PPPPP...................................
 | 
				
			||||
.........................|...|.......PPP....................................
 | 
				
			||||
...-----......-----......-----........PP....................................
 | 
				
			||||
...|...+......|...+..--+--.............PP...................................
 | 
				
			||||
...|...|......|...|..|...|..............PP..................................
 | 
				
			||||
...-----......-----..|...|.............PPPP.................................
 | 
				
			||||
.....................-----............PP..PP................................
 | 
				
			||||
.....................................PP...PP................................
 | 
				
			||||
....................................PP...PP.................................
 | 
				
			||||
....................................PP....PP................................
 | 
				
			||||
]]);
 | 
				
			||||
 | 
				
			||||
-- the forest beyond the river
 | 
				
			||||
des.replace_terrain({ region={37,00, 59,19}, fromterrain=".", toterrain="T", chance=5 })
 | 
				
			||||
des.replace_terrain({ region={60,00, 64,19}, fromterrain=".", toterrain="T", chance=10 })
 | 
				
			||||
des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=20 })
 | 
				
			||||
-- guarantee a path and free spot for the portal
 | 
				
			||||
des.terrain(selection.randline(selection.new(), 37,7, 62,02, 7), ".")
 | 
				
			||||
des.terrain({62,02}, ".")
 | 
				
			||||
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region(selection.area(09,05,11,05), "unlit")
 | 
				
			||||
des.region(selection.area(09,07,11,07), "lit")
 | 
				
			||||
des.region(selection.area(09,09,11,09), "unlit")
 | 
				
			||||
des.region(selection.area(13,05,20,09), "lit")
 | 
				
			||||
des.region(selection.area(29,05,31,06), "lit")
 | 
				
			||||
des.region(selection.area(26,10,28,11), "lit")
 | 
				
			||||
des.region(selection.area(04,13,06,14), "lit")
 | 
				
			||||
des.region(selection.area(15,13,17,14), "lit")
 | 
				
			||||
des.region(selection.area(22,14,24,15), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 09,09)
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {62,02,62,02}, type="branch" })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",12,05)
 | 
				
			||||
des.door("locked",12,09)
 | 
				
			||||
des.door("closed",21,07)
 | 
				
			||||
des.door("open",07,13)
 | 
				
			||||
des.door("open",18,13)
 | 
				
			||||
des.door("open",23,13)
 | 
				
			||||
des.door("open",25,10)
 | 
				
			||||
des.door("open",28,05)
 | 
				
			||||
-- Elder
 | 
				
			||||
des.monster({ id = "Pelias", coord = {10, 07}, inventory = function()
 | 
				
			||||
   des.object({ id = "runesword", spe = 5 });
 | 
				
			||||
   des.object({ id = "chain mail", spe = 5 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Pelias
 | 
				
			||||
des.object("chest", 09, 05)
 | 
				
			||||
-- chieftain guards for the audience chamber
 | 
				
			||||
des.monster("chieftain", 10, 05)
 | 
				
			||||
des.monster("chieftain", 10, 09)
 | 
				
			||||
des.monster("chieftain", 11, 05)
 | 
				
			||||
des.monster("chieftain", 11, 09)
 | 
				
			||||
des.monster("chieftain", 14, 05)
 | 
				
			||||
des.monster("chieftain", 14, 09)
 | 
				
			||||
des.monster("chieftain", 16, 05)
 | 
				
			||||
des.monster("chieftain", 16, 09)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- One trap to keep the ogres at bay.
 | 
				
			||||
des.trap("spiked pit",37,07)
 | 
				
			||||
-- Eels in the river
 | 
				
			||||
des.monster("giant eel", 36, 01)
 | 
				
			||||
des.monster("giant eel", 37, 09)
 | 
				
			||||
des.monster("giant eel", 39, 15)
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
local ogrelocs = selection.floodfill(37,7) & selection.area(40,03, 45,20)
 | 
				
			||||
for i = 0, 11 do
 | 
				
			||||
   des.monster({ id = "ogre", coord = ogrelocs:rndcoord(1), peaceful = 0 })
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,35 @@
 | 
				
			||||
-- NetHack Caveman Cav-fila.lua	$NHDT-Date: 1652196001 2022/05/10 15:20:01 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style = "mines", fg = ".", bg = " ", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ class = "h", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,41 @@
 | 
				
			||||
-- NetHack Caveman Cav-filb.lua	$NHDT-Date: 1652196001 2022/05/10 15:20:01 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style = "mines", fg = ".", bg = " ", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ class = "h", peaceful=0 })
 | 
				
			||||
des.monster({ class = "h", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
-- NetHack Caveman Cav-goal.lua	$NHDT-Date: 1652196002 2022/05/10 15:20:02 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
                          .....................                             
 | 
				
			||||
                         .......................                            
 | 
				
			||||
                        .........................                           
 | 
				
			||||
                       ...........................                          
 | 
				
			||||
                      .............................                         
 | 
				
			||||
                     ...............................                        
 | 
				
			||||
                    .................................                       
 | 
				
			||||
                   ...................................                      
 | 
				
			||||
                  .....................................                     
 | 
				
			||||
                 .......................................                    
 | 
				
			||||
                  .....................................                     
 | 
				
			||||
                   ...................................                      
 | 
				
			||||
                    .................................                       
 | 
				
			||||
                     ...............................                        
 | 
				
			||||
                      .............................                         
 | 
				
			||||
                       ...........................                          
 | 
				
			||||
                        .........................                           
 | 
				
			||||
                         .......................                            
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up")
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "mace", x=23, y=10, buc="blessed", spe=0, name="The Sceptre of Might" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- monsters.
 | 
				
			||||
des.monster({ id = "Chromatic Dragon", x=23, y=10, asleep=1 })
 | 
				
			||||
des.monster("shrieker", 26, 13)
 | 
				
			||||
des.monster("shrieker", 25, 8)
 | 
				
			||||
des.monster("shrieker", 45, 11)
 | 
				
			||||
des.wallify()
 | 
				
			||||
@ -0,0 +1,101 @@
 | 
				
			||||
-- NetHack Caveman Cav-loca.lua	$NHDT-Date: 1652196002 2022/05/10 15:20:02 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
    .............                     ...........                           
 | 
				
			||||
   ...............                   .............                          
 | 
				
			||||
    .............                  ...............        ..........        
 | 
				
			||||
     ...........                    .............      ...............      
 | 
				
			||||
        ...                                    ...   ..................     
 | 
				
			||||
         ...                ..........          ... ..................      
 | 
				
			||||
          ...              ............          BBB...................     
 | 
				
			||||
           ...              ..........          ......................      
 | 
				
			||||
            .....                 ..      .....B........................    
 | 
				
			||||
  ....       ...............      .    ........B..........................  
 | 
				
			||||
 ......     .. .............S..............         ..................      
 | 
				
			||||
  ....     ..                ...........             ...............        
 | 
				
			||||
     ..  ...                                    ....................        
 | 
				
			||||
      ....                                      BB...................       
 | 
				
			||||
         ..                 ..                 ..  ...............          
 | 
				
			||||
          ..   .......     ....  .....  ....  ..     .......   S            
 | 
				
			||||
           ............     ....... ..  .......       .....    ...  ....    
 | 
				
			||||
               .......       .....   ......                      .......    
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "unlit")
 | 
				
			||||
des.region({ region={52,06, 73,15}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",28,11)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 04,03)
 | 
				
			||||
des.stair("down", 73,10)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "bugbear", x=02, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=03, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=04, y=12, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=02, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=16, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=17, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=18, y=18, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=19, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=30, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=31, y=07, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=32, y=08, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=33, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", x=34, y=07, peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ id = "bugbear", peaceful=0 })
 | 
				
			||||
des.monster({ class = "h", peaceful=0 })
 | 
				
			||||
des.monster({ class = "H", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", x=03, y=12, peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", x=20, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", x=35, y=08, peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
des.monster({ id = "hill giant", peaceful=0 })
 | 
				
			||||
des.monster({ class = "H", peaceful=0 })
 | 
				
			||||
des.wallify()
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
--	The "goal" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet Tiamat your nemesis monster.  You have to
 | 
				
			||||
--	defeat Tiamat in combat to gain the artifact you have
 | 
				
			||||
--	been assigned to retrieve.
 | 
				
			||||
--
 | 
				
			||||
@ -0,0 +1,94 @@
 | 
				
			||||
-- NetHack Caveman Cav-strt.lua	$NHDT-Date: 1652196002 2022/05/10 15:20:02 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Shaman Karnov
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
  ......     ..........................       ...        ....  ......       
 | 
				
			||||
 ......       ..........................     ........       ....    .....   
 | 
				
			||||
  ..BB      .............................    .........            ....  ..  
 | 
				
			||||
     ..    ......................              .......      ..     ....  .. 
 | 
				
			||||
     ..     ....................                     ..  .......    ..  ... 
 | 
				
			||||
   ..              S   BB                .....     .......   ....      .... 
 | 
				
			||||
    ..        ...  .   ..               ........  ..     ..   ..       ...  
 | 
				
			||||
     ..      ......     ..             ............       ..          ...   
 | 
				
			||||
       .      ....       ..             ........           ..  ...........  
 | 
				
			||||
  ...   ..     ..        .............                  ................... 
 | 
				
			||||
 .....   .....            ...............................      ...........  
 | 
				
			||||
  .....B................            ...                               ...   
 | 
				
			||||
  .....     .  ..........        .... .      ...  ..........           ...  
 | 
				
			||||
   ...     ..          .............  ..    ...................        .... 
 | 
				
			||||
          BB       ..   .........      BB    ...  ..........  ..   ...  ... 
 | 
				
			||||
       ......    .....  B          ........         ..         .. ....  ... 
 | 
				
			||||
     ..........  ..........         ..... ...      .....        ........    
 | 
				
			||||
       ..  ...    .  .....         ....    ..       ...            ..       
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "unlit")
 | 
				
			||||
des.region({ region={13,01, 40,05}, lit=1, type="temple", filled=1, irregular=1 })
 | 
				
			||||
-- The occupied rooms.
 | 
				
			||||
des.region({ region={02,01, 08,03}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={01,11, 06,14}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={13,08, 18,10}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={05,17, 14,18}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={17,16, 23,18}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
des.region({ region={35,16, 44,18}, lit=1, type="ordinary", irregular=1 })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 02,03)
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {71,09,71,09}, type="branch" })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",19,06)
 | 
				
			||||
-- The temple altar (this will force a priest(ess) to be created)
 | 
				
			||||
des.altar({ x=36,y=02, align="coaligned", type="shrine" })
 | 
				
			||||
-- Shaman Karnov
 | 
				
			||||
des.monster({ id = "Shaman Karnov", coord = {35, 02}, inventory = function()
 | 
				
			||||
   des.object({ id = "leather armor", spe = 5 });
 | 
				
			||||
   des.object({ id = "club", spe = 5 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Shaman Karnov
 | 
				
			||||
des.object("chest", 34, 02)
 | 
				
			||||
-- neanderthal guards for the audience chamber
 | 
				
			||||
des.monster("neanderthal", 20, 03)
 | 
				
			||||
des.monster("neanderthal", 20, 02)
 | 
				
			||||
des.monster("neanderthal", 20, 01)
 | 
				
			||||
des.monster("neanderthal", 21, 03)
 | 
				
			||||
des.monster("neanderthal", 21, 02)
 | 
				
			||||
des.monster("neanderthal", 21, 01)
 | 
				
			||||
des.monster("neanderthal", 22, 01)
 | 
				
			||||
des.monster("neanderthal", 26, 09)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("pit",47,11)
 | 
				
			||||
des.trap("pit",57,10)
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty (in the outer caves).
 | 
				
			||||
des.monster({ id ="bugbear", x=47, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=48, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=49, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=67, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=69, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=51, y=13, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=53, y=14, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=55, y=15, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=63, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=65, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=67, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id ="bugbear", x=69, y=11, peaceful=0 })
 | 
				
			||||
des.wallify()
 | 
				
			||||
@ -0,0 +1,46 @@
 | 
				
			||||
#!/usr/bin/perl
 | 
				
			||||
# NetHack 3.7   GENFILES      $NHDT-Date: 1596498242 2020/08/03 23:44:02 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
#       Copyright (c) 2018 by Kenneth Lorber
 | 
				
			||||
# NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
 | 
				
			||||
# 2 sections:
 | 
				
			||||
#   *.lev entries are generated by reading *.des
 | 
				
			||||
#   hardcoded entries are in __DATA__
 | 
				
			||||
 | 
				
			||||
($dir = $0) =~ s!^(.*/)(.*)!$1!;
 | 
				
			||||
 | 
				
			||||
#print "T (files generated by lev_comp at playground creation time)\n";
 | 
				
			||||
#
 | 
				
			||||
#foreach $des (<$dir*.des>){
 | 
				
			||||
#    open IN, "<", $des or warn("Can't open $des: $!");
 | 
				
			||||
#    while(<IN>){
 | 
				
			||||
#	m/^(MAZE|LEVEL):\s*"(.*?)"/ && do {
 | 
				
			||||
#	    print "F $2.lev\n";
 | 
				
			||||
#	};
 | 
				
			||||
#    }
 | 
				
			||||
#    close IN;
 | 
				
			||||
#}
 | 
				
			||||
while(<DATA>){
 | 
				
			||||
    print;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
__DATA__
 | 
				
			||||
T (tile files optionally generated for X ports at playground creation time)
 | 
				
			||||
F pet_mark.xbm
 | 
				
			||||
F rip.xpm
 | 
				
			||||
F x11tiles
 | 
				
			||||
T (files generated for Qt interface on macOS)
 | 
				
			||||
F nethack.icns
 | 
				
			||||
F Info.plist
 | 
				
			||||
T (files generated for windows at compile time)
 | 
				
			||||
F porthelp
 | 
				
			||||
F dlb.lst
 | 
				
			||||
T (files generated for windows tty at compile time)
 | 
				
			||||
F ttyoptions
 | 
				
			||||
T (files generated for windows gui at compile time)
 | 
				
			||||
F guioptions
 | 
				
			||||
T (files generated by makedefs at playground creation time)
 | 
				
			||||
F data
 | 
				
			||||
F options
 | 
				
			||||
F oracles
 | 
				
			||||
F rumors
 | 
				
			||||
@ -0,0 +1,42 @@
 | 
				
			||||
-- NetHack Healer Hea-fila.lua	$NHDT-Date: 1652196003 2022/05/10 15:20:03 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991, 1993 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "P" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,50 @@
 | 
				
			||||
-- NetHack Healer Hea-filb.lua	$NHDT-Date: 1652196003 2022/05/10 15:20:03 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991, 1993 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "P" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,90 @@
 | 
				
			||||
-- NetHack Healer Hea-goal.lua	$NHDT-Date: 1652196003 2022/05/10 15:20:03 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991, 1993 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "P" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
.P....................................PP.
 | 
				
			||||
PP.......PPPPPPP....PPPPPPP....PPPP...PP.
 | 
				
			||||
...PPPPPPP....PPPPPPP.....PPPPPP..PPP...P
 | 
				
			||||
...PP..............................PPP...
 | 
				
			||||
..PP..............................PP.....
 | 
				
			||||
..PP..............................PPP....
 | 
				
			||||
..PPP..............................PP....
 | 
				
			||||
.PPP..............................PPPP...
 | 
				
			||||
...PP............................PPP...PP
 | 
				
			||||
..PPPP...PPPPP..PPPP...PPPPP.....PP...PP.
 | 
				
			||||
P....PPPPP...PPPP..PPPPP...PPPPPPP...PP..
 | 
				
			||||
PPP..................................PPP.
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,40,11), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 39,10)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,40,11))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "quarterstaff", x=20, y=06, buc="blessed", spe=0, name="The Staff of Aesculapius" })
 | 
				
			||||
des.object("wand of lightning", 20, 06)
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Cyclops", x=20, y=06, peaceful=0 })
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster("shark")
 | 
				
			||||
des.monster("shark")
 | 
				
			||||
des.monster({ class = ";", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,97 @@
 | 
				
			||||
-- NetHack Healer Hea-loca.lua	$NHDT-Date: 1652196004 2022/05/10 15:20:04 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991, 1993 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor");
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=true ,joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
PPPPPPPPPPPPP.......PPPPPPPPPPP
 | 
				
			||||
PPPPPPPP...............PPPPPPPP
 | 
				
			||||
PPPP.....-------------...PPPPPP
 | 
				
			||||
PPPPP....|.S.........|....PPPPP
 | 
				
			||||
PPP......+.|.........|...PPPPPP
 | 
				
			||||
PPP......+.|.........|..PPPPPPP
 | 
				
			||||
PPPP.....|.S.........|..PPPPPPP
 | 
				
			||||
PPPPP....-------------....PPPPP
 | 
				
			||||
PPPPPPPP...............PPPPPPPP
 | 
				
			||||
PPPPPPPPPPP........PPPPPPPPPPPP
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,30,09), "lit")
 | 
				
			||||
des.region({ region={12,03, 20,06}, lit=1, type="temple", filled=1 })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("closed",09,04)
 | 
				
			||||
des.door("closed",09,05)
 | 
				
			||||
des.door("locked",11,03)
 | 
				
			||||
des.door("locked",11,06)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 04,04)
 | 
				
			||||
des.stair("down", 20,06)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(11,02,21,07))
 | 
				
			||||
-- Altar in the temple.
 | 
				
			||||
des.altar({ x=13,y=05, align="chaos", type="shrine" })
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster({ class = "r", peaceful=0 })
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster("electric eel")
 | 
				
			||||
des.monster("kraken")
 | 
				
			||||
des.monster("shark")
 | 
				
			||||
des.monster("shark")
 | 
				
			||||
des.monster({ class = ";", peaceful=0 })
 | 
				
			||||
des.monster({ class = ";", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,109 @@
 | 
				
			||||
-- NetHack Healer Hea-strt.lua	$NHDT-Date: 1652196004 2022/05/10 15:20:04 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991, 1993 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Hippocrates
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 | 
				
			||||
PPPP........PPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.P..PPPPP......PPPPPPPP
 | 
				
			||||
PPP..........PPPP...PPPPP.........................PPPP..PPPPP........PPPPPPP
 | 
				
			||||
PP............PPPPPPPP..............................PPP...PPPP......PPPPPPPP
 | 
				
			||||
P.....PPPPPPPPPPPPPPP................................PPPPPPPPPPPPPPPPPPPPPPP
 | 
				
			||||
PPPP....PPPPPPPPPPPP...................................PPPPP.PPPPPPPPPPPPPPP
 | 
				
			||||
PPPP........PPPPP.........-----------------------........PP...PPPPPPP.....PP
 | 
				
			||||
PPP............PPPPP....--|.|......S..........S.|--.....PPPP.PPPPPPP.......P
 | 
				
			||||
PPPP..........PPPPP.....|.S.|......-----------|S|.|......PPPPPP.PPP.......PP
 | 
				
			||||
PPPPPP......PPPPPP......|.|.|......|...|......|.|.|.....PPPPPP...PP.......PP
 | 
				
			||||
PPPPPPPPPPPPPPPPPPP.....+.|.|......S.\.S......|.|.+......PPPPPP.PPPP.......P
 | 
				
			||||
PPP...PPPPP...PPPP......|.|.|......|...|......|.|.|.......PPPPPPPPPPP.....PP
 | 
				
			||||
PP.....PPP.....PPP......|.|S|-----------......|.S.|......PPPPPPPPPPPPPPPPPPP
 | 
				
			||||
PPP..PPPPP...PPPP.......--|.S..........S......|.|--.....PPPPPPPPP....PPPPPPP
 | 
				
			||||
PPPPPPPPPPPPPPPP..........-----------------------..........PPPPP..........PP
 | 
				
			||||
PPPPPPPPPPPPPPPPP........................................PPPPPP............P
 | 
				
			||||
PPP.............PPPP...................................PPP..PPPP..........PP
 | 
				
			||||
PP...............PPPPP................................PPPP...PPPP........PPP
 | 
				
			||||
PPP.............PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPP
 | 
				
			||||
PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 | 
				
			||||
]]);
 | 
				
			||||
 | 
				
			||||
des.replace_terrain({ region={01,01, 74,18}, fromterrain="P", toterrain=".", chance=10 })
 | 
				
			||||
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 37,9)
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {04,12,04,12}, type="branch" })
 | 
				
			||||
-- altar for the Temple
 | 
				
			||||
des.altar({ x=32,y=09,align="neutral",type="altar" })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",24,10)
 | 
				
			||||
des.door("closed",26,08)
 | 
				
			||||
des.door("closed",27,12)
 | 
				
			||||
des.door("locked",28,13)
 | 
				
			||||
des.door("closed",35,07)
 | 
				
			||||
des.door("locked",35,10)
 | 
				
			||||
des.door("locked",39,10)
 | 
				
			||||
des.door("closed",39,13)
 | 
				
			||||
des.door("locked",46,07)
 | 
				
			||||
des.door("closed",47,08)
 | 
				
			||||
des.door("closed",48,12)
 | 
				
			||||
des.door("locked",50,10)
 | 
				
			||||
-- Hippocrates
 | 
				
			||||
des.monster({ id = "Hippocrates", coord = {37, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "silver dagger", spe = 5 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Hippocrates
 | 
				
			||||
des.object("chest", 37, 10)
 | 
				
			||||
-- intern guards for the audience chamber
 | 
				
			||||
des.monster("attendant", 29, 08)
 | 
				
			||||
des.monster("attendant", 29, 09)
 | 
				
			||||
des.monster("attendant", 29, 10)
 | 
				
			||||
des.monster("attendant", 29, 11)
 | 
				
			||||
des.monster("attendant", 40, 09)
 | 
				
			||||
des.monster("attendant", 40, 10)
 | 
				
			||||
des.monster("attendant", 40, 11)
 | 
				
			||||
des.monster("attendant", 40, 13)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("rabid rat")
 | 
				
			||||
des.monster("giant eel")
 | 
				
			||||
des.monster("shark")
 | 
				
			||||
des.monster(";")
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "D", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
des.monster({ class = "S", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,35 @@
 | 
				
			||||
-- NetHack Knight Kni-fila.lua	$NHDT-Date: 1652196004 2022/05/10 15:20:04 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "." });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,40 @@
 | 
				
			||||
-- NetHack Knight Kni-filb.lua	$NHDT-Date: 1652196005 2022/05/10 15:20:05 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "." });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,99 @@
 | 
				
			||||
-- NetHack Knight Kni-goal.lua	$NHDT-Date: 1652196005 2022/05/10 15:20:05 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
....PPPP..PPP..                                                             
 | 
				
			||||
.PPPPP...PP..     ..........     .................................          
 | 
				
			||||
..PPPPP...P..    ...........    ...................................         
 | 
				
			||||
..PPP.......   ...........    ......................................        
 | 
				
			||||
...PPP.......    .........     ...............   .....................      
 | 
				
			||||
...........    ............    ............     ......................      
 | 
				
			||||
............   .............      .......     .....................         
 | 
				
			||||
..............................            .........................         
 | 
				
			||||
...............................   ..................................        
 | 
				
			||||
.............................    ....................................       
 | 
				
			||||
.........    ......................................................         
 | 
				
			||||
.....PP...    .....................................................         
 | 
				
			||||
.....PPP....    ....................................................        
 | 
				
			||||
......PPP....   ..............   ....................................       
 | 
				
			||||
.......PPP....  .............    .....................................      
 | 
				
			||||
........PP...    ............    ......................................     
 | 
				
			||||
...PPP........     ..........     ..................................        
 | 
				
			||||
..PPPPP........     ..........     ..............................           
 | 
				
			||||
....PPPPP......       .........     ..........................              
 | 
				
			||||
.......PPPP...                                                              
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,14,19), "lit")
 | 
				
			||||
des.region(selection.area(15,00,75,19), "unlit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 03,08)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "mirror", x=50,y=06, buc="blessed", spe=0, name="The Magic Mirror of Merlin" })
 | 
				
			||||
des.object({ coord = { 33, 01 } })
 | 
				
			||||
des.object({ coord = { 33, 02 } })
 | 
				
			||||
des.object({ coord = { 33, 03 } })
 | 
				
			||||
des.object({ coord = { 33, 04 } })
 | 
				
			||||
des.object({ coord = { 33, 05 } })
 | 
				
			||||
des.object({ coord = { 34, 01 } })
 | 
				
			||||
des.object({ coord = { 34, 02 } })
 | 
				
			||||
des.object({ coord = { 34, 03 } })
 | 
				
			||||
des.object({ coord = { 34, 04 } })
 | 
				
			||||
des.object({ coord = { 34, 05 } })
 | 
				
			||||
des.object({ coord = { 35, 01 } })
 | 
				
			||||
des.object({ coord = { 35, 02 } })
 | 
				
			||||
des.object({ coord = { 35, 03 } })
 | 
				
			||||
des.object({ coord = { 35, 04 } })
 | 
				
			||||
des.object({ coord = { 35, 05 } })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("spiked pit",13,07)
 | 
				
			||||
des.trap("spiked pit",12,08)
 | 
				
			||||
des.trap("spiked pit",12,09)
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Ixoth", x=50, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ class = "j", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,137 @@
 | 
				
			||||
-- NetHack Knight Kni-loca.lua	$NHDT-Date: 1652196005 2022/05/10 15:20:05 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=false, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
xxxxxxxxx......xxxx...........xxxxxxxxxx
 | 
				
			||||
xxxxxxx.........xxx.............xxxxxxxx
 | 
				
			||||
xxxx..............................xxxxxx
 | 
				
			||||
xx.................................xxxxx
 | 
				
			||||
....................................xxxx
 | 
				
			||||
.......................................x
 | 
				
			||||
........................................
 | 
				
			||||
xx...................................xxx
 | 
				
			||||
xxxx..............................xxxxxx
 | 
				
			||||
xxxxxx..........................xxxxxxxx
 | 
				
			||||
xxxxxxxx.........xx..........xxxxxxxxxxx
 | 
				
			||||
xxxxxxxxx.......xxxxxx.....xxxxxxxxxxxxx
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
-- The Isle of Glass is a Tor rising out of the swamps surrounding it.
 | 
				
			||||
des.region(selection.area(00,00,39,11), "lit")
 | 
				
			||||
-- The top area of the Tor is a holy site.
 | 
				
			||||
des.region({ region={09,02, 27,09}, lit=1, type="temple", filled=2 })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 38,0)
 | 
				
			||||
des.stair("down", 18,05)
 | 
				
			||||
-- The altar atop the Tor and its attendant (creating altar makes the priest).
 | 
				
			||||
des.altar({ x=17, y=05, align="neutral", type="shrine" })
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
-- All of the avenues are guarded by magic except for the East.
 | 
				
			||||
-- South
 | 
				
			||||
des.trap("magic",08,11)
 | 
				
			||||
des.trap("magic",09,11)
 | 
				
			||||
des.trap("magic",10,11)
 | 
				
			||||
des.trap("magic",11,11)
 | 
				
			||||
des.trap("magic",12,11)
 | 
				
			||||
des.trap("magic",13,11)
 | 
				
			||||
des.trap("magic",14,11)
 | 
				
			||||
des.trap("magic",15,11)
 | 
				
			||||
des.trap("magic",16,11)
 | 
				
			||||
des.trap("magic",20,11)
 | 
				
			||||
des.trap("magic",21,11)
 | 
				
			||||
des.trap("magic",22,11)
 | 
				
			||||
des.trap("magic",23,11)
 | 
				
			||||
des.trap("magic",24,11)
 | 
				
			||||
des.trap("magic",25,11)
 | 
				
			||||
des.trap("magic",26,11)
 | 
				
			||||
des.trap("magic",27,11)
 | 
				
			||||
des.trap("magic",28,11)
 | 
				
			||||
-- West
 | 
				
			||||
des.trap("magic",00,03)
 | 
				
			||||
des.trap("magic",00,04)
 | 
				
			||||
des.trap("magic",00,05)
 | 
				
			||||
des.trap("magic",00,06)
 | 
				
			||||
-- North
 | 
				
			||||
des.trap("magic",06,00)
 | 
				
			||||
des.trap("magic",07,00)
 | 
				
			||||
des.trap("magic",08,00)
 | 
				
			||||
des.trap("magic",09,00)
 | 
				
			||||
des.trap("magic",10,00)
 | 
				
			||||
des.trap("magic",11,00)
 | 
				
			||||
des.trap("magic",12,00)
 | 
				
			||||
des.trap("magic",13,00)
 | 
				
			||||
des.trap("magic",14,00)
 | 
				
			||||
des.trap("magic",19,00)
 | 
				
			||||
des.trap("magic",20,00)
 | 
				
			||||
des.trap("magic",21,00)
 | 
				
			||||
des.trap("magic",22,00)
 | 
				
			||||
des.trap("magic",23,00)
 | 
				
			||||
des.trap("magic",24,00)
 | 
				
			||||
des.trap("magic",25,00)
 | 
				
			||||
des.trap("magic",26,00)
 | 
				
			||||
des.trap("magic",27,00)
 | 
				
			||||
des.trap("magic",28,00)
 | 
				
			||||
des.trap("magic",29,00)
 | 
				
			||||
des.trap("magic",30,00)
 | 
				
			||||
des.trap("magic",31,00)
 | 
				
			||||
des.trap("magic",32,00)
 | 
				
			||||
-- Even so, there are magic "sinkholes" around.
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
des.trap("anti magic")
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", peaceful=0 })
 | 
				
			||||
des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
des.monster({ class = "j", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ochre jelly", peaceful=0 })
 | 
				
			||||
des.monster({ class = "j", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,109 @@
 | 
				
			||||
-- NetHack Knight Kni-strt.lua	$NHDT-Date: 1652196006 2022/05/10 15:20:06 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, King Arthur
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "." });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
-- This is a kludge to init the level as a lit field.
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=".", smoothed=false, joined=false, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
..................................................
 | 
				
			||||
.-----......................................-----.
 | 
				
			||||
.|...|......................................|...|.
 | 
				
			||||
.--|+-------------------++-------------------+|--.
 | 
				
			||||
...|...................+..+...................|...
 | 
				
			||||
...|.|-----------------|++|-----------------|.|...
 | 
				
			||||
...|.|.................|..|.........|.......|.|...
 | 
				
			||||
...|.|...\.............+..+.........|.......|.|...
 | 
				
			||||
...|.|.................+..+.........+.......|.|...
 | 
				
			||||
...|.|.................|..|.........|.......|.|...
 | 
				
			||||
...|.|--------------------------------------|.|...
 | 
				
			||||
...|..........................................|...
 | 
				
			||||
.--|+----------------------------------------+|--.
 | 
				
			||||
.|...|......................................|...|.
 | 
				
			||||
.-----......................................-----.
 | 
				
			||||
..................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,49,15), "lit")
 | 
				
			||||
des.region(selection.area(04,04,45,11), "unlit")
 | 
				
			||||
des.region({ region={06,06,22,09}, lit=1, type="throne", filled=2 })
 | 
				
			||||
des.region(selection.area(27,06,43,09), "lit")
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {20,14,20,14}, type="branch" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 40,7)
 | 
				
			||||
-- Doors
 | 
				
			||||
-- Outside Doors
 | 
				
			||||
des.door("locked",24,03)
 | 
				
			||||
des.door("locked",25,03)
 | 
				
			||||
-- Inside Doors
 | 
				
			||||
des.door("closed",23,04)
 | 
				
			||||
des.door("closed",26,04)
 | 
				
			||||
des.door("locked",24,05)
 | 
				
			||||
des.door("locked",25,05)
 | 
				
			||||
des.door("closed",23,07)
 | 
				
			||||
des.door("closed",26,07)
 | 
				
			||||
des.door("closed",23,08)
 | 
				
			||||
des.door("closed",26,08)
 | 
				
			||||
des.door("closed",36,08)
 | 
				
			||||
-- Watchroom Doors
 | 
				
			||||
des.door("closed",04,03)
 | 
				
			||||
des.door("closed",45,03)
 | 
				
			||||
des.door("closed",04,12)
 | 
				
			||||
des.door("closed",45,12)
 | 
				
			||||
-- King Arthur
 | 
				
			||||
des.monster({ id = "King Arthur", coord = {09, 07}, inventory = function()
 | 
				
			||||
   des.object({ id = "long sword", spe = 4, buc = "blessed", name = "Excalibur" });
 | 
				
			||||
   des.object({ id = "plate mail", spe = 4 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of King Arthur
 | 
				
			||||
des.object("chest", 09, 07)
 | 
				
			||||
-- knight guards for the watchrooms
 | 
				
			||||
des.monster({ id = "knight", x=04, y=02, peaceful = 1 })
 | 
				
			||||
des.monster({ id = "knight", x=04, y=13, peaceful = 1 })
 | 
				
			||||
des.monster({ id = "knight", x=45, y=02, peaceful = 1 })
 | 
				
			||||
des.monster({ id = "knight", x=45, y=13, peaceful = 1 })
 | 
				
			||||
-- page guards for the audience chamber
 | 
				
			||||
des.monster("page", 16, 06)
 | 
				
			||||
des.monster("page", 18, 06)
 | 
				
			||||
des.monster("page", 20, 06)
 | 
				
			||||
des.monster("page", 16, 09)
 | 
				
			||||
des.monster("page", 18, 09)
 | 
				
			||||
des.monster("page", 20, 09)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,49,15))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("sleep gas",24,04)
 | 
				
			||||
des.trap("sleep gas",25,04)
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster({ id = "quasit", x=14, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=16, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=18, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=20, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=22, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=24, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=26, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=28, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=30, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=32, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=34, y=00, peaceful=0 })
 | 
				
			||||
des.monster({ id = "quasit", x=36, y=00, peaceful=0 })
 | 
				
			||||
 | 
				
			||||
-- Some warhorses
 | 
				
			||||
for i = 1, 2 + nh.rn2(3) do
 | 
				
			||||
    des.monster({ id = "warhorse", peaceful = 1, inventory = function() if percent(50) then des.object("saddle"); end end });
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,61 @@
 | 
				
			||||
-- NetHack Monk Mon-fila.lua	$NHDT-Date: 1652196006 2022/05/10 15:20:06 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "E", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "E", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("xorn")
 | 
				
			||||
              des.monster("earth elemental")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "E", peaceful=0 })
 | 
				
			||||
              des.monster("earth elemental")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "X", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("earth elemental")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,60 @@
 | 
				
			||||
-- NetHack Monk Mon-filb.lua	$NHDT-Date: 1652196006 2022/05/10 15:20:06 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "X", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "X", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "E", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "E", peaceful=0 })
 | 
				
			||||
              des.monster("earth elemental")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "X", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("earth elemental")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,75 @@
 | 
				
			||||
-- NetHack Monk Mon-goal.lua	$NHDT-Date: 1652196007 2022/05/10 15:20:07 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
-- des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg="L", bg=".", smoothed=false, joined=false, lit=0, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
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
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
local place = { {14,04},{13,07} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
 | 
				
			||||
des.region(selection.area(00,00,25,10), "unlit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 20,05)
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "lenses", coord = place[placeidx], buc="blessed", spe=0, name="The Eyes of the Overworld" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("Master Kaen",place[placeidx])
 | 
				
			||||
des.altar({ coord = place[placeidx], align="noalign", type="altar" })
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
@ -0,0 +1,98 @@
 | 
				
			||||
-- NetHack Monk Mon-loca.lua	$NHDT-Date: 1652196007 2022/05/10 15:20:07 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
--         1         2         3         4         5         6         7 
 | 
				
			||||
--123456789012345678901234567890123456789012345678901234567890123456789012345
 | 
				
			||||
des.map([[
 | 
				
			||||
             ----------------------------------------------------   --------
 | 
				
			||||
           ---.................................................-    --.....|
 | 
				
			||||
         ---...--------........------........................---     ---...|
 | 
				
			||||
       ---.....-      --.......-    ----..................----         --.--
 | 
				
			||||
     ---.....----      ---------       --..................--         --..| 
 | 
				
			||||
   ---...-----                       ----.----.....----.....---      --..|| 
 | 
				
			||||
----..----                       -----..---  |...---  |.......---   --...|  
 | 
				
			||||
|...---                       ----....---    |.---    |.........-- --...||  
 | 
				
			||||
|...-                      ----.....---     ----      |..........---....|   
 | 
				
			||||
|...----                ----......---       |         |...|.......-....||   
 | 
				
			||||
|......-----          ---.........-         |     -----...|............|    
 | 
				
			||||
|..........-----   ----...........---       -------......||...........||    
 | 
				
			||||
|..............-----................---     |............|||..........|     
 | 
				
			||||
|-S----...............................---   |...........|| |.........||     
 | 
				
			||||
|.....|..............------.............-----..........||  ||........|      
 | 
				
			||||
|.....|.............--    ---.........................||    |.......||      
 | 
				
			||||
|.....|.............-       ---.....................--|     ||......|       
 | 
				
			||||
|---S--------.......----      --.................----        |.....||       
 | 
				
			||||
|...........|..........--------..............-----           ||....|        
 | 
				
			||||
|...........|............................-----                |....|        
 | 
				
			||||
------------------------------------------                    ------        
 | 
				
			||||
]]);
 | 
				
			||||
-- Random Monsters
 | 
				
			||||
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,20), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,20))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- since vegetarian monks shouldn't eat giant corpses, give a chance for
 | 
				
			||||
-- Str boost that isn't throttled by exercise restrictions;
 | 
				
			||||
-- make a modest effort (Elbereth only) to prevent xorns from eating the tins
 | 
				
			||||
local tinplace = selection.negate():filter_mapchar('.')
 | 
				
			||||
local tinloc = tinplace:rndcoord(0)
 | 
				
			||||
des.object({ id="tin", coord=tinloc, quantity=2, buc="blessed",
 | 
				
			||||
             montype="spinach" })
 | 
				
			||||
des.engraving({ coord=tinloc, type="burn", text="Elbereth" })
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("earth elemental")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
des.monster("xorn")
 | 
				
			||||
@ -0,0 +1,106 @@
 | 
				
			||||
-- NetHack Monk Mon-strt.lua	$NHDT-Date: 1652196007 2022/05/10 15:20:07 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, the Grand Master
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
....................------------------------------------....................
 | 
				
			||||
....................|................|.....|.....|.....|....................
 | 
				
			||||
....................|..------------..|--+-----+-----+--|....................
 | 
				
			||||
....................|..|..........|..|.................|....................
 | 
				
			||||
....................|..|..........|..|+---+---+-----+--|....................
 | 
				
			||||
..................---..|..........|......|...|...|.....|....................
 | 
				
			||||
..................+....|..........+......|...|...|.....|....................
 | 
				
			||||
..................+....|..........+......|...|...|.....|....................
 | 
				
			||||
..................---..|..........|......|...|...|.....|....................
 | 
				
			||||
....................|..|..........|..|+-----+---+---+--|....................
 | 
				
			||||
....................|..|..........|..|.................|....................
 | 
				
			||||
....................|..------------..|--+-----+-----+--|....................
 | 
				
			||||
....................|................|.....|.....|.....|....................
 | 
				
			||||
....................------------------------------------....................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region({ region={24,06, 33,13}, lit=1, type="temple" })
 | 
				
			||||
 | 
				
			||||
des.replace_terrain({ region={00,00, 10,19}, fromterrain=".", toterrain="T", chance=10 })
 | 
				
			||||
des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=10 })
 | 
				
			||||
 | 
				
			||||
local spacelocs = selection.floodfill(05,04);
 | 
				
			||||
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.terrain({05,04}, ".")
 | 
				
			||||
des.levregion({ region = {05,04,05,04}, type="branch" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 52,09)
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",18,09)
 | 
				
			||||
des.door("locked",18,10)
 | 
				
			||||
des.door("closed",34,09)
 | 
				
			||||
des.door("closed",34,10)
 | 
				
			||||
des.door("closed",40,05)
 | 
				
			||||
des.door("closed",46,05)
 | 
				
			||||
des.door("closed",52,05)
 | 
				
			||||
des.door("locked",38,07)
 | 
				
			||||
des.door("closed",42,07)
 | 
				
			||||
des.door("closed",46,07)
 | 
				
			||||
des.door("closed",52,07)
 | 
				
			||||
des.door("locked",38,12)
 | 
				
			||||
des.door("closed",44,12)
 | 
				
			||||
des.door("closed",48,12)
 | 
				
			||||
des.door("closed",52,12)
 | 
				
			||||
des.door("closed",40,14)
 | 
				
			||||
des.door("closed",46,14)
 | 
				
			||||
des.door("closed",52,14)
 | 
				
			||||
-- Unattended Altar - unaligned due to conflict - player must align it.
 | 
				
			||||
des.altar({ x=28,y=09, align="noalign", type="altar" })
 | 
				
			||||
-- The Grand Master
 | 
				
			||||
des.monster({ id = "Grand Master", coord = {28, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "robe", spe = 6 });
 | 
				
			||||
end })
 | 
				
			||||
-- No treasure chest!
 | 
				
			||||
-- guards for the audience chamber
 | 
				
			||||
des.monster("abbot", 32, 07)
 | 
				
			||||
des.monster("abbot", 32, 08)
 | 
				
			||||
des.monster("abbot", 32, 11)
 | 
				
			||||
des.monster("abbot", 32, 12)
 | 
				
			||||
des.monster("abbot", 33, 07)
 | 
				
			||||
des.monster("abbot", 33, 08)
 | 
				
			||||
des.monster("abbot", 33, 11)
 | 
				
			||||
des.monster("abbot", 33, 12)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(18,03,55,16))
 | 
				
			||||
-- Random traps
 | 
				
			||||
for i = 1, 2 do
 | 
				
			||||
   des.trap("dart", spacelocs:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
for i = 1, 8 do
 | 
				
			||||
   des.monster("earth elemental", spacelocs:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
for i = 1, 4 do
 | 
				
			||||
   des.monster("xorn", spacelocs:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
-- next to leader, so possibly tricky to pick up if not ready for quest yet;
 | 
				
			||||
-- there's no protection against a xorn eating these tins; BUC state is random
 | 
				
			||||
des.object({ id="tin", coord = {29, 9}, quantity=2, montype="spinach" })
 | 
				
			||||
@ -0,0 +1,55 @@
 | 
				
			||||
-- NetHack Priest Pri-fila.lua	$NHDT-Date: 1652196008 2022/05/10 15:20:08 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("human zombie")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("human zombie")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "morgue",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("wraith")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "morgue",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,62 @@
 | 
				
			||||
-- NetHack Priest Pri-filb.lua	$NHDT-Date: 1652196008 2022/05/10 15:20:08 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("human zombie")
 | 
				
			||||
              des.monster("wraith")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "morgue",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("human zombie")
 | 
				
			||||
              des.monster("wraith")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "morgue",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("human zombie")
 | 
				
			||||
              des.monster("wraith")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
des.room({ type = "morgue",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,84 @@
 | 
				
			||||
-- NetHack Priest Pri-goal.lua	$NHDT-Date: 1687033651 2023/06/17 20:27:31 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg="L", bg=".", smoothed=false, joined=false, lit=0, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
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
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
local place = { {14,04}, {13,07} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
 | 
				
			||||
des.region(selection.area(00,00,25,10), "unlit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 20,05)
 | 
				
			||||
-- Objects [note: eroded=-1 => obj->oerodeproof=1]
 | 
				
			||||
des.object({ id = "helm of brilliance", coord = place[placeidx],
 | 
				
			||||
             buc="blessed", spe=0, eroded=-1, name="The Mitre of Holiness" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("Nalzok",place[placeidx])
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("human zombie")
 | 
				
			||||
des.monster("Z")
 | 
				
			||||
des.monster("Z")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("wraith")
 | 
				
			||||
des.monster("W")
 | 
				
			||||
@ -0,0 +1,73 @@
 | 
				
			||||
-- NetHack Priest Pri-loca.lua	$NHDT-Date: 1652196009 2022/05/10 15:20:09 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor", "noflip")
 | 
				
			||||
-- This is a kludge to init the level as a lit field.
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=".", smoothed=false, joined=false, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
........................................
 | 
				
			||||
........................................
 | 
				
			||||
..........----------+----------.........
 | 
				
			||||
..........|........|.|........|.........
 | 
				
			||||
..........|........|.|........|.........
 | 
				
			||||
..........|----.----.----.----|.........
 | 
				
			||||
..........+...................+.........
 | 
				
			||||
..........+...................+.........
 | 
				
			||||
..........|----.----.----.----|.........
 | 
				
			||||
..........|........|.|........|.........
 | 
				
			||||
..........|........|.|........|.........
 | 
				
			||||
..........----------+----------.........
 | 
				
			||||
........................................
 | 
				
			||||
........................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region({ region={00,00, 09,13}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region({ region={09,00, 30,01}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region({ region={09,12, 30,13}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region({ region={31,00, 39,13}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region({ region={11,03, 29,10}, lit=1, type="temple", filled=1, irregular=1 })
 | 
				
			||||
-- The altar inside the temple
 | 
				
			||||
des.altar({ x=20,y=07, align="noalign", type="shrine" })
 | 
				
			||||
des.monster({ id = "aligned cleric", x=20, y=07, align="noalign", peaceful = 0 })
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",10,06)
 | 
				
			||||
des.door("locked",10,07)
 | 
				
			||||
des.door("locked",20,02)
 | 
				
			||||
des.door("locked",20,11)
 | 
				
			||||
des.door("locked",30,06)
 | 
				
			||||
des.door("locked",30,07)
 | 
				
			||||
-- Stairs
 | 
				
			||||
-- Note:  The up stairs are *intentionally* off of the map.
 | 
				
			||||
des.stair("up", 43,05)
 | 
				
			||||
des.stair("down", 20,06)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(10,02,30,13))
 | 
				
			||||
-- Objects (inside the antechambers).
 | 
				
			||||
des.object({ coord = { 14, 03 } })
 | 
				
			||||
des.object({ coord = { 15, 03 } })
 | 
				
			||||
des.object({ coord = { 16, 03 } })
 | 
				
			||||
des.object({ coord = { 14, 10 } })
 | 
				
			||||
des.object({ coord = { 15, 10 } })
 | 
				
			||||
des.object({ coord = { 16, 10 } })
 | 
				
			||||
des.object({ coord = { 17, 10 } })
 | 
				
			||||
des.object({ coord = { 24, 03 } })
 | 
				
			||||
des.object({ coord = { 25, 03 } })
 | 
				
			||||
des.object({ coord = { 26, 03 } })
 | 
				
			||||
des.object({ coord = { 27, 03 } })
 | 
				
			||||
des.object({ coord = { 24, 10 } })
 | 
				
			||||
des.object({ coord = { 25, 10 } })
 | 
				
			||||
des.object({ coord = { 26, 10 } })
 | 
				
			||||
des.object({ coord = { 27, 10 } })
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap({ coord = { 15,04 } })
 | 
				
			||||
des.trap({ coord = { 25,04 } })
 | 
				
			||||
des.trap({ coord = { 15,09 } })
 | 
				
			||||
des.trap({ coord = { 25,09 } })
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- No random monsters - the morgue generation will put them in.
 | 
				
			||||
@ -0,0 +1,102 @@
 | 
				
			||||
-- NetHack Priest Pri-strt.lua	$NHDT-Date: 1652196009 2022/05/10 15:20:09 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, High Priest
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
....................------------------------------------....................
 | 
				
			||||
....................|................|.....|.....|.....|....................
 | 
				
			||||
....................|..------------..|--+-----+-----+--|....................
 | 
				
			||||
....................|..|..........|..|.................|....................
 | 
				
			||||
....................|..|..........|..|+---+---+-----+--|....................
 | 
				
			||||
..................---..|..........|......|...|...|.....|....................
 | 
				
			||||
..................+....|..........+......|...|...|.....|....................
 | 
				
			||||
..................+....|..........+......|...|...|.....|....................
 | 
				
			||||
..................---..|..........|......|...|...|.....|....................
 | 
				
			||||
....................|..|..........|..|+-----+---+---+--|....................
 | 
				
			||||
....................|..|..........|..|.................|....................
 | 
				
			||||
....................|..------------..|--+-----+-----+--|....................
 | 
				
			||||
....................|................|.....|.....|.....|....................
 | 
				
			||||
....................------------------------------------....................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region({ region={24,06, 33,13}, lit=1, type="temple", filled=2 })
 | 
				
			||||
 | 
				
			||||
des.replace_terrain({ region={00,00, 10,19}, fromterrain=".", toterrain="T", chance=10 })
 | 
				
			||||
des.replace_terrain({ region={65,00, 75,19}, fromterrain=".", toterrain="T", chance=10 })
 | 
				
			||||
des.terrain({05,04}, ".")
 | 
				
			||||
 | 
				
			||||
local spacelocs = selection.floodfill(05,04);
 | 
				
			||||
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {05,04,05,04}, type="branch" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 52,09)
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",18,09)
 | 
				
			||||
des.door("locked",18,10)
 | 
				
			||||
des.door("closed",34,09)
 | 
				
			||||
des.door("closed",34,10)
 | 
				
			||||
des.door("closed",40,05)
 | 
				
			||||
des.door("closed",46,05)
 | 
				
			||||
des.door("closed",52,05)
 | 
				
			||||
des.door("locked",38,07)
 | 
				
			||||
des.door("closed",42,07)
 | 
				
			||||
des.door("closed",46,07)
 | 
				
			||||
des.door("closed",52,07)
 | 
				
			||||
des.door("locked",38,12)
 | 
				
			||||
des.door("closed",44,12)
 | 
				
			||||
des.door("closed",48,12)
 | 
				
			||||
des.door("closed",52,12)
 | 
				
			||||
des.door("closed",40,14)
 | 
				
			||||
des.door("closed",46,14)
 | 
				
			||||
des.door("closed",52,14)
 | 
				
			||||
-- Unattended Altar - unaligned due to conflict - player must align it.
 | 
				
			||||
des.altar({ x=28, y=09, align="noalign", type="altar" })
 | 
				
			||||
-- High Priest
 | 
				
			||||
des.monster({ id = "Arch Priest", coord = {28, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "robe", spe = 4 });
 | 
				
			||||
   des.object({ id = "mace", spe = 4 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of High Priest
 | 
				
			||||
des.object("chest", 27, 10)
 | 
				
			||||
-- knight guards for the audience chamber
 | 
				
			||||
des.monster("acolyte", 32, 07)
 | 
				
			||||
des.monster("acolyte", 32, 08)
 | 
				
			||||
des.monster("acolyte", 32, 11)
 | 
				
			||||
des.monster("acolyte", 32, 12)
 | 
				
			||||
des.monster("acolyte", 33, 07)
 | 
				
			||||
des.monster("acolyte", 33, 08)
 | 
				
			||||
des.monster("acolyte", 33, 11)
 | 
				
			||||
des.monster("acolyte", 33, 12)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(18,03,55,16))
 | 
				
			||||
-- Random traps
 | 
				
			||||
for i = 1, 2 do
 | 
				
			||||
   des.trap("dart", spacelocs:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
for i = 1, 12 do
 | 
				
			||||
   des.monster("human zombie", spacelocs:rndcoord(1));
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,35 @@
 | 
				
			||||
-- NetHack Ranger Ran-fila.lua	$NHDT-Date: 1652196009 2022/05/10 15:20:09 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="T", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ class = "C", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,39 @@
 | 
				
			||||
-- NetHack Ranger Ran-filb.lua	$NHDT-Date: 1652196010 2022/05/10 15:20:10 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ class = "C", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,106 @@
 | 
				
			||||
-- NetHack Ranger Ran-goal.lua	$NHDT-Date: 1652196010 2022/05/10 15:20:10 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                                                            
 | 
				
			||||
  ...                                                                  ...  
 | 
				
			||||
 .......................................................................... 
 | 
				
			||||
  ...                                +                                 ...  
 | 
				
			||||
   .     ............     .......    .                   .......        .   
 | 
				
			||||
   .  .............................  .       ........   .........S..    .   
 | 
				
			||||
   .   ............    .  ......     .       .      .    .......   ..   .   
 | 
				
			||||
   .     .........     .   ....      +       . ...  .               ..  .   
 | 
				
			||||
   .        S          .         .........   .S.    .S...............   .   
 | 
				
			||||
   .  ...   .     ...  .         .........          .                   .   
 | 
				
			||||
   . ........    .....S.+.......+....\....+........+.                   .   
 | 
				
			||||
   .  ...         ...    S       .........           ..      .....      .   
 | 
				
			||||
   .                    ..       .........            ..      ......    .   
 | 
				
			||||
   .      .......     ...            +       ....    ....    .......... .   
 | 
				
			||||
   . ..............  ..              .      ......  ..  .............   .   
 | 
				
			||||
   .     .............               .     ..........          ......   .   
 | 
				
			||||
  ...                                +                                 ...  
 | 
				
			||||
 .......................................................................... 
 | 
				
			||||
  ...                                                                  ...  
 | 
				
			||||
                                                                            
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 19,10)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "bow", x=37, y=10, buc="blessed", spe=0, name="The Longbow of Diana" })
 | 
				
			||||
des.object("chest", 37, 10)
 | 
				
			||||
des.object({ coord = { 36, 09 } })
 | 
				
			||||
des.object({ coord = { 36, 10 } })
 | 
				
			||||
des.object({ coord = { 36, 11 } })
 | 
				
			||||
des.object({ coord = { 37, 09 } })
 | 
				
			||||
des.object({ coord = { 37, 11 } })
 | 
				
			||||
des.object({ coord = { 38, 09 } })
 | 
				
			||||
des.object({ coord = { 38, 10 } })
 | 
				
			||||
des.object({ coord = { 38, 11 } })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- doors
 | 
				
			||||
des.door("locked",12,08)
 | 
				
			||||
des.door("closed",22,10)
 | 
				
			||||
des.door("locked",24,10)
 | 
				
			||||
des.door("closed",25,11)
 | 
				
			||||
des.door("closed",32,10)
 | 
				
			||||
des.door("closed",37,03)
 | 
				
			||||
des.door("closed",37,07)
 | 
				
			||||
des.door("closed",37,13)
 | 
				
			||||
des.door("closed",37,16)
 | 
				
			||||
des.door("closed",42,10)
 | 
				
			||||
des.door("locked",46,08)
 | 
				
			||||
des.door("closed",51,10)
 | 
				
			||||
des.door("locked",53,08)
 | 
				
			||||
des.door("closed",65,05)
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Scorpius", x=37, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=36, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=36, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=36, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=37, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=37, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=38, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=38, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=38, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=02, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=71, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=02, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", x=71, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ class = "C", peaceful=0 })
 | 
				
			||||
des.monster({ class = "C", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=03, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=72, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=03, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=72, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=41, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", x=33, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ class = "s", peaceful=0 })
 | 
				
			||||
 | 
				
			||||
des.wallify()
 | 
				
			||||
@ -0,0 +1,79 @@
 | 
				
			||||
-- NetHack Ranger Ran-loca.lua	$NHDT-Date: 1652196010 2022/05/10 15:20:10 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
--1234567890123456789012345678901234567890123456789012345678901234567890
 | 
				
			||||
des.map([[
 | 
				
			||||
              .......  .........  .......              
 | 
				
			||||
     ...................       ...................     
 | 
				
			||||
  ....        .......             .......        ....  
 | 
				
			||||
...    .....     .       .....       .     .....    ...
 | 
				
			||||
.   .......... .....  ...........  ..... ..........   .
 | 
				
			||||
.  ..  ..... ..........  .....  .......... .....  ..  .
 | 
				
			||||
.  .     .     .....       .       .....     .     .  .
 | 
				
			||||
.  .   .....         .............         .....   .  .
 | 
				
			||||
.  .  ................  .......  ................  .  .
 | 
				
			||||
.  .   .....            .......            .....   .  .
 | 
				
			||||
.  .     .    ......               ......    .     .  .
 | 
				
			||||
.  .     ...........   .........   ...........     .  .
 | 
				
			||||
.  .          ..........       ..........          .  .
 | 
				
			||||
.  ..  .....     .       .....       .     .....  ..  .
 | 
				
			||||
.   .......... .....  ...........  ..... ..........   .
 | 
				
			||||
.      ..... ..........  .....  .......... .....      .
 | 
				
			||||
.        .     .....       .       .....     .        .
 | 
				
			||||
...   .......           .......           .......   ...
 | 
				
			||||
  ..............     .............     ..............  
 | 
				
			||||
      .......  .......  .......  .......  .......      
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,54,19), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 25,05)
 | 
				
			||||
des.stair("down", 27,18)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,54,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("spiked pit")
 | 
				
			||||
des.trap("spiked pit")
 | 
				
			||||
des.trap("teleport")
 | 
				
			||||
des.trap("teleport")
 | 
				
			||||
des.trap("arrow")
 | 
				
			||||
des.trap("arrow")
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "wumpus", x=27, y=18, peaceful=0, asleep=1 })
 | 
				
			||||
des.monster({ id = "giant bat", peaceful=0 })
 | 
				
			||||
des.monster({ id = "giant bat", peaceful=0 })
 | 
				
			||||
des.monster({ id = "giant bat", peaceful=0 })
 | 
				
			||||
des.monster({ id = "giant bat", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "mountain centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ class = "s", peaceful=0 })
 | 
				
			||||
des.monster({ class = "s", peaceful=0 })
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,101 @@
 | 
				
			||||
-- NetHack Ranger Ran-strt.lua	$NHDT-Date: 1652196011 2022/05/10 15:20:11 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Orion,
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "." });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor", "arboreal")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=".", smoothed=true, joined=true, lit=1, walled=false })
 | 
				
			||||
des.replace_terrain({ region={00,00, 76,19}, fromterrain=".", toterrain="T", chance=5 })
 | 
				
			||||
--1234567890123456789012345678901234567890123456789012345678901234567890
 | 
				
			||||
des.map({ halign = "left", valign = "center", map = [[
 | 
				
			||||
                                       xx
 | 
				
			||||
   ...................................  x
 | 
				
			||||
  ..                                 ..  
 | 
				
			||||
 ..  ...............F...............  .. 
 | 
				
			||||
 .  ..             .F.             ..  . 
 | 
				
			||||
 . ..  .............F.............  .. . 
 | 
				
			||||
 . .  ..                         ..  . . 
 | 
				
			||||
 . . ..  .......................  .. ... 
 | 
				
			||||
 . . .  ..                     ..  .     
 | 
				
			||||
 ... . ..  .|..................... ......
 | 
				
			||||
 FFF . .  ..S..................          
 | 
				
			||||
 ... . ..  .|.................  .... ... 
 | 
				
			||||
 . . .  ..                     ..  . . . 
 | 
				
			||||
 . . ..  .......................  .. . . 
 | 
				
			||||
 . .  ..                         ..  . . 
 | 
				
			||||
 . ..  .............F.............  .. . 
 | 
				
			||||
 .  ..             .F.             ..  . 
 | 
				
			||||
 ..  ...............F...............  .. 
 | 
				
			||||
  ..                                 ..  
 | 
				
			||||
   ...................................  x
 | 
				
			||||
                                       xx
 | 
				
			||||
]] });
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,40,20), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 10,10)
 | 
				
			||||
-- Portal arrival point; just about anywhere on the right hand side of the map
 | 
				
			||||
des.levregion({ region = {51,2,77,18}, region_islev = 1, type="branch" })
 | 
				
			||||
-- Orion
 | 
				
			||||
des.monster({ id = "Orion", coord = {20, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "leather armor", spe = 4 });
 | 
				
			||||
   des.object({ id = "yumi", spe = 4 });
 | 
				
			||||
   des.object({ id = "arrow", spe = 4, quantity = 50 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Orion
 | 
				
			||||
des.object("chest", 20, 10)
 | 
				
			||||
-- Guards for the audience chamber
 | 
				
			||||
des.monster("hunter", 19, 09)
 | 
				
			||||
des.monster("hunter", 20, 09)
 | 
				
			||||
des.monster("hunter", 21, 09)
 | 
				
			||||
des.monster("hunter", 19, 10)
 | 
				
			||||
des.monster("hunter", 21, 10)
 | 
				
			||||
des.monster("hunter", 19, 11)
 | 
				
			||||
des.monster("hunter", 20, 11)
 | 
				
			||||
des.monster("hunter", 21, 11)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,40,20))
 | 
				
			||||
-- Traps
 | 
				
			||||
des.trap("arrow",30,09)
 | 
				
			||||
des.trap("arrow",30,10)
 | 
				
			||||
des.trap("pit",40,09)
 | 
				
			||||
des.trap("spiked pit")
 | 
				
			||||
des.trap("bear")
 | 
				
			||||
des.trap("bear")
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster({ id = "minotaur", x=33, y=09, peaceful=0, asleep=1 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=03, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=04, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=01, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=02, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=03, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=01, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=02, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=03, y=11, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=15, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=19, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=15, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=16, peaceful=0 })
 | 
				
			||||
des.monster({ id = "forest centaur", x=21, y=17, peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "plains centaur", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
des.monster({ id = "scorpion", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,64 @@
 | 
				
			||||
-- NetHack Rogue Rog-fila.lua	$NHDT-Date: 1652196011 2022/05/10 15:20:11 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1992 by Dean Luick
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "water nymph", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "l", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "water nymph", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,64 @@
 | 
				
			||||
-- NetHack Rogue Rog-filb.lua	$NHDT-Date: 1652196011 2022/05/10 15:20:11 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1992 by Dean Luick
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ id = "water nymph", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "l", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
              des.monster({ id = "water nymph", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
@ -0,0 +1,110 @@
 | 
				
			||||
-- NetHack Rogue Rog-goal.lua	$NHDT-Date: 1652196012 2022/05/10 15:20:12 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1992 by Dean Luick
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport")
 | 
				
			||||
 | 
				
			||||
--         1         2         3         4         5         6         7
 | 
				
			||||
--123456789012345678901234567890123456789012345678901234567890123456789012345
 | 
				
			||||
des.map([[
 | 
				
			||||
-----      -------.......................................|-----------------|
 | 
				
			||||
|...|  -----.....|.......................................|.................|
 | 
				
			||||
|...----...|.....|.......................................|....---------....|
 | 
				
			||||
|.---......---..--.................................------------.......|....|
 | 
				
			||||
|...............|..................................|..|...|...----........-|
 | 
				
			||||
|.....-----....--.................................|-..--..-|.....----S----| 
 | 
				
			||||
|--S---...|....|.................................|-........-|....|........| 
 | 
				
			||||
|.........---------.............................|-....}}....-|...|...|....| 
 | 
				
			||||
|....|.....S......|............................|-.....}}.....-|..--.------| 
 | 
				
			||||
|-----.....--.....|...........................|-...}}}}}}}}...-|....|.....--
 | 
				
			||||
|...........--....------S-----...............|-....}}}}}}}}....-|..........|
 | 
				
			||||
|............--........|...| |..............--.....}}.}}........----------S-
 | 
				
			||||
|.............|........|...| |..............|......}}}}}}}}......|...|.....|
 | 
				
			||||
|S-.---.---.---.---.---|...| ------------...--........}}.}}.....--..---....|
 | 
				
			||||
|.---.---.---.---.-S-..----- |....|.....|....|-....}}}}}}}}....---..S.|--..|
 | 
				
			||||
|...|.......|..........|...---....---...S.....|-...}}}}}}}}...-|.S..|...|..|
 | 
				
			||||
|...|..|....|..........|............|..--..----|-.....}}.....-|..----...-S--
 | 
				
			||||
|...|---....----.......|----- ......|...---|    |-....}}....-|...|..--.--..|
 | 
				
			||||
-----.....---.....--.---....--...--------..|     |-........-|....|.........|
 | 
				
			||||
    |.............|..........|.............S...   |S-------|.....|..-----..|
 | 
				
			||||
    ----------------------------------------  ......       ----------   ----
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,20), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.levregion({ region={01,00,15,20}, region_islev=1, exclude={01,18,04,20}, type="stair-up" });
 | 
				
			||||
-- Doors
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,20))
 | 
				
			||||
-- One trap to keep the gnomes at bay.
 | 
				
			||||
des.trap("spiked pit",37,07)
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "skeleton key", x=38, y=10, buc="blessed", spe=0, name="The Master Key of Thievery" })
 | 
				
			||||
des.object({ id = "tin", x=26, y=12, montype="chameleon" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Master Assassin", x=38, y=10, peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ class = "l", peaceful=0 })
 | 
				
			||||
des.monster({ class = "l", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "shark", x=51, y=14, peaceful=0 })
 | 
				
			||||
des.monster({ id = "shark", x=53, y=09, peaceful=0 })
 | 
				
			||||
des.monster({ id = "shark", x=55, y=15, peaceful=0 })
 | 
				
			||||
des.monster({ id = "shark", x=58, y=10, peaceful=0 })
 | 
				
			||||
@ -0,0 +1,99 @@
 | 
				
			||||
-- NetHack Rogue Rog-loca.lua	$NHDT-Date: 1652196012 2022/05/10 15:20:12 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1992 by Dean Luick
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
--         1         2         3         4         5         6         7
 | 
				
			||||
--123456789012345678901234567890123456789012345678901234567890123456789012345
 | 
				
			||||
des.map([[
 | 
				
			||||
             ----------------------------------------------------   --------
 | 
				
			||||
           ---.................................................-    --.....|
 | 
				
			||||
         ---...--------........-------.......................---     ---...|
 | 
				
			||||
       ---.....-      ---......-     ---..................----         --.--
 | 
				
			||||
     ---.....----       --------       --..................--         --..| 
 | 
				
			||||
   ---...-----                       ----.----.....----.....---      --..|| 
 | 
				
			||||
----..----                       -----..---  |...---  |.......---   --...|  
 | 
				
			||||
|...---                       ----....---    |.---    |.........-- --...||  
 | 
				
			||||
|...-                      ----.....---     ----      |..........---....|   
 | 
				
			||||
|...----                ----......---       |         |...|.......-....||   
 | 
				
			||||
|......-----          ---.........-         |     -----...|............|    
 | 
				
			||||
|..........-----   ----...........---       -------......||...........||    
 | 
				
			||||
|..............-----................---     |............|||..........|     
 | 
				
			||||
|------...............................---   |...........|| |.........||     
 | 
				
			||||
|.....|..............------.............-----..........||  ||........|      
 | 
				
			||||
|.....|.............--    ---.........................||    |.......||      
 | 
				
			||||
|.....|.............-       ---.....................--|     ||......|       
 | 
				
			||||
|-S----------.......----      --.................----        |.....||       
 | 
				
			||||
|...........|..........--------..............-----           ||....|        
 | 
				
			||||
|...........|............................-----                |....|        
 | 
				
			||||
------------------------------------------                    ------        
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,20), "lit")
 | 
				
			||||
-- Doors
 | 
				
			||||
--DOOR:locked|closed|open,(xx,yy)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,20))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "scroll of teleportation", x=11, y=18, buc="cursed", spe=0 })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", peaceful=0 })
 | 
				
			||||
des.monster({ class = "l", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ id = "guardian naga", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ class = "N", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
des.monster({ id = "chameleon", peaceful=0 })
 | 
				
			||||
@ -0,0 +1,166 @@
 | 
				
			||||
-- NetHack Rogue Rog-strt.lua	$NHDT-Date: 1652196012 2022/05/10 15:20:12 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1992 by Dean Luick
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Master of Thieves
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor", "nommap")
 | 
				
			||||
 | 
				
			||||
--         1         2         3         4         5         6         7
 | 
				
			||||
--123456789012345678901234567890123456789012345678901234567890123456789012345
 | 
				
			||||
des.map([[
 | 
				
			||||
---------------------------------.------------------------------------------
 | 
				
			||||
|.....|.||..........|....|......|.|.........|.......+............---.......|
 | 
				
			||||
|.....|..+..........+....---....S.|...-S-----.-----.|............+.+.......|
 | 
				
			||||
|.....+.||........---......|....|.|...|.....|.|...|.---.....------.--------|
 | 
				
			||||
|-----|.-------|..|........------.-----.....|.--..|...-------..............|
 | 
				
			||||
|.....|........------+------..........+.....|..--S---.........------.-----..
 | 
				
			||||
|.....|.------...............-----.}}.--------.|....-------.---....|.+...--|
 | 
				
			||||
|..-+--.|....|-----.--------.|...|.....+.....|.|....|.....+.+......|.--....|
 | 
				
			||||
|..|....|....|....+.|......|.|...-----.|.....|.--...|.....|.|......|..|....|
 | 
				
			||||
|..|.-----S----...|.+....-----...|...|.----..|..|.---....--.---S-----.|----|
 | 
				
			||||
|..|.|........|...------.|.S.....|...|....-----.+.|......|..|.......|.|....|
 | 
				
			||||
|---.-------..|...|....|.|.|.....|...----.|...|.|---.....|.|-.......|.---..|
 | 
				
			||||
...........|..S...|....---.----S----..|...|...+.|..-------.---+-....|...--+|
 | 
				
			||||
|---------.---------...|......|....S..|.---...|.|..|...........----.---....|
 | 
				
			||||
|........|.........|...+.------....|---.---...|.--+-.----.----....|.+...--+|
 | 
				
			||||
|........|.---+---.|----.--........|......-----......|..|..|.--+-.|.-S-.|..|
 | 
				
			||||
|........|.|.....|........----------.----.......---.--..|-.|....|.-----.|..|
 | 
				
			||||
|----....+.|.....----+---............|..|--------.+.|...SS.|....|.......|..|
 | 
				
			||||
|...--+-----.....|......|.------------............---...||.------+--+----..|
 | 
				
			||||
|..........S.....|......|.|..........S............|.....||...|.....|....|..|
 | 
				
			||||
-------------------------.--------------------------------------------------
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
--REGION:(00,00,75,20),lit,"ordinary"
 | 
				
			||||
 | 
				
			||||
local streets = selection.floodfill(0,12)
 | 
				
			||||
 | 
				
			||||
-- The down stairs is at one of the 4 "exits".  The others are mimics,
 | 
				
			||||
-- mimicing stairwells.
 | 
				
			||||
local place = { {33,0}, {0,12}, {25,20}, {75,05} }
 | 
				
			||||
shuffle(place)
 | 
				
			||||
 | 
				
			||||
des.stair({ dir = "down", coord = place[1] })
 | 
				
			||||
des.monster({ id = "giant mimic", coord = place[2], appear_as = "ter:staircase down" })
 | 
				
			||||
des.monster({ id = "large mimic", coord = place[3], appear_as = "ter:staircase down" })
 | 
				
			||||
des.monster({ id = "small mimic", coord = place[4], appear_as = "ter:staircase down" })
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {19,09,19,09}, type="branch" })
 | 
				
			||||
-- Doors (secret)
 | 
				
			||||
--DOOR:locked|closed|open,(xx,yy)
 | 
				
			||||
des.door("locked", 32, 2)
 | 
				
			||||
des.door("locked", 63, 9)
 | 
				
			||||
des.door("locked", 27,10)
 | 
				
			||||
des.door("locked", 31,12)
 | 
				
			||||
des.door("locked", 35,13)
 | 
				
			||||
des.door("locked", 69,15)
 | 
				
			||||
des.door("locked", 56,17)
 | 
				
			||||
des.door("locked", 57,17)
 | 
				
			||||
des.door("locked", 11,19)
 | 
				
			||||
des.door("locked", 37,19)
 | 
				
			||||
des.door("locked", 39, 2)
 | 
				
			||||
des.door("locked", 49, 5)
 | 
				
			||||
des.door("locked", 10, 9)
 | 
				
			||||
des.door("locked", 14,12)
 | 
				
			||||
-- Doors (regular)
 | 
				
			||||
des.door("closed", 52, 1)
 | 
				
			||||
des.door("closed",  9, 2)
 | 
				
			||||
des.door("closed", 20, 2)
 | 
				
			||||
des.door("closed", 65, 2)
 | 
				
			||||
des.door("closed", 67, 2)
 | 
				
			||||
des.door("closed",  6, 3)
 | 
				
			||||
des.door("closed", 21, 5)
 | 
				
			||||
des.door("closed", 38, 5)
 | 
				
			||||
des.door("closed", 69, 6)
 | 
				
			||||
des.door("closed",  4, 7)
 | 
				
			||||
des.door("closed", 39, 7)
 | 
				
			||||
des.door("closed", 58, 7)
 | 
				
			||||
des.door("closed", 60, 7)
 | 
				
			||||
des.door("closed", 18, 8)
 | 
				
			||||
des.door("closed", 20, 9)
 | 
				
			||||
des.door("closed", 48,10)
 | 
				
			||||
des.door("closed", 46,12)
 | 
				
			||||
des.door("closed", 62,12)
 | 
				
			||||
des.door("closed", 74,12)
 | 
				
			||||
des.door("closed", 23,14)
 | 
				
			||||
des.door("closed", 23,14)
 | 
				
			||||
des.door("closed", 50,14)
 | 
				
			||||
des.door("closed", 68,14)
 | 
				
			||||
des.door("closed", 74,14)
 | 
				
			||||
des.door("closed", 14,15)
 | 
				
			||||
des.door("closed", 63,15)
 | 
				
			||||
des.door("closed",  9,17)
 | 
				
			||||
des.door("closed", 21,17)
 | 
				
			||||
des.door("closed", 50,17)
 | 
				
			||||
des.door("closed",  6,18)
 | 
				
			||||
des.door("closed", 65,18)
 | 
				
			||||
des.door("closed", 68,18)
 | 
				
			||||
-- Master of Thieves
 | 
				
			||||
des.monster({ id = "Master of Thieves", coord = {36, 11}, inventory = function()
 | 
				
			||||
   des.object({ id = "leather armor", spe = 5 });
 | 
				
			||||
   des.object({ id = "silver dagger", spe = 4 });
 | 
				
			||||
   des.object({ id = "dagger", spe = 2, quantity = d(2,4), buc = "not-cursed" });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Master of Thieves
 | 
				
			||||
des.object("chest", 36, 11)
 | 
				
			||||
-- thug guards, room #1
 | 
				
			||||
des.monster("thug", 28, 10)
 | 
				
			||||
des.monster("thug", 29, 11)
 | 
				
			||||
des.monster("thug", 30, 09)
 | 
				
			||||
des.monster("thug", 31, 07)
 | 
				
			||||
-- thug guards, room #2
 | 
				
			||||
des.monster("thug", 31, 13)
 | 
				
			||||
des.monster("thug", 33, 14)
 | 
				
			||||
des.monster("thug", 30, 15)
 | 
				
			||||
--thug guards, room #3
 | 
				
			||||
des.monster("thug", 35, 09)
 | 
				
			||||
des.monster("thug", 36, 13)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,20))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
-- Monsters to get in the way.
 | 
				
			||||
--
 | 
				
			||||
-- West exit
 | 
				
			||||
des.monster({ id = "leprechaun", x=01, y=12, peaceful=0 })
 | 
				
			||||
des.monster({ id = "water nymph", x=02, y=12, peaceful=0 })
 | 
				
			||||
-- North exit
 | 
				
			||||
des.monster({ id = "water nymph", x=33, y=01, peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", x=33, y=02, peaceful=0 })
 | 
				
			||||
-- East exit
 | 
				
			||||
des.monster({ id = "water nymph", x=74, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "leprechaun", x=74, y=04, peaceful=0 })
 | 
				
			||||
-- South exit
 | 
				
			||||
des.monster({ id = "leprechaun", x=25, y=19, peaceful=0 })
 | 
				
			||||
des.monster({ id = "water nymph", x=25, y=18, peaceful=0 })
 | 
				
			||||
-- Wandering the streets.
 | 
				
			||||
for i=1,4 + math.random(1 - 1,1*3)  do
 | 
				
			||||
   des.monster({ id = "water nymph", coord = streets:rndcoord(1), peaceful=0 })
 | 
				
			||||
   des.monster({ id = "leprechaun", coord = streets:rndcoord(1), peaceful=0 })
 | 
				
			||||
end
 | 
				
			||||
for i=1,7 + math.random(1 - 1,1*3)  do
 | 
				
			||||
   des.monster({ id = "chameleon", coord = streets:rndcoord(1), peaceful=0 })
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,37 @@
 | 
				
			||||
-- NetHack Samurai Sam-fila.lua	$NHDT-Date: 1652196013 2022/05/10 15:20:13 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="P", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("d")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,60 @@
 | 
				
			||||
-- NetHack Samurai Sam-filb.lua	$NHDT-Date: 1652196013 2022/05/10 15:20:13 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
-------------                                  -------------
 | 
				
			||||
|...........|                                  |...........|
 | 
				
			||||
|...-----...|----------------------------------|...-----...|
 | 
				
			||||
|...|   |...|..................................|...|   |...|
 | 
				
			||||
|...-----..........................................-----...|
 | 
				
			||||
|...........|--S----------------------------S--|...........|
 | 
				
			||||
----...--------.|..........................|.--------...----
 | 
				
			||||
   |...|........+..........................+........|...|   
 | 
				
			||||
   |...|........+..........................+........|...|   
 | 
				
			||||
----...--------.|..........................|.--------...----
 | 
				
			||||
|...........|--S----------------------------S--|...........|
 | 
				
			||||
|...-----..........................................-----...|
 | 
				
			||||
|...|   |...|..................................|...|   |...|
 | 
				
			||||
|...-----...|----------------------------------|...-----...|
 | 
				
			||||
|...........|                                  |...........|
 | 
				
			||||
-------------                                  -------------
 | 
				
			||||
]]);
 | 
				
			||||
des.region(selection.area(00,00,59,15), "unlit")
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("closed",16,07)
 | 
				
			||||
des.door("closed",16,08)
 | 
				
			||||
des.door("closed",43,07)
 | 
				
			||||
des.door("closed",43,08)
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("d")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,111 @@
 | 
				
			||||
-- NetHack Samurai Sam-goal.lua	$NHDT-Date: 1652196013 2022/05/10 15:20:13 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
                                             
 | 
				
			||||
           .......................           
 | 
				
			||||
       ......-------------------......       
 | 
				
			||||
    ......----.................----......    
 | 
				
			||||
   ....----.....-------------.....----....   
 | 
				
			||||
  ....--.....----...........----.....--....  
 | 
				
			||||
  ...||....---....---------....---....||...  
 | 
				
			||||
  ...|....--....---.......---....--....|...  
 | 
				
			||||
 ....|...||...---...--+--...---...||...|.... 
 | 
				
			||||
 ....|...|....|....|-...-|....|....|...|.... 
 | 
				
			||||
 ....|...|....|....+.....+....|....|...|.... 
 | 
				
			||||
 ....|...|....|....|-...-|....|....|...|.... 
 | 
				
			||||
 ....|...||...---...--+--...---...||...|.... 
 | 
				
			||||
  ...|....--....---.......---....--....|...  
 | 
				
			||||
  ...||....---....---------....---....||...  
 | 
				
			||||
  ....--.....----...........----.....--....  
 | 
				
			||||
   ....----.....-------------.....----....   
 | 
				
			||||
    ......----.................----......    
 | 
				
			||||
       ......-------------------......       
 | 
				
			||||
           .......................           
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
local place = { {02,11},{42,09} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
 | 
				
			||||
des.region(selection.area(00,00,44,19), "unlit")
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("closed",19,10)
 | 
				
			||||
des.door("closed",22,08)
 | 
				
			||||
des.door("closed",22,12)
 | 
				
			||||
des.door("closed",25,10)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair({ dir = "up", coord = place[placeidx] })
 | 
				
			||||
 | 
				
			||||
-- Holes in the concentric ring walls
 | 
				
			||||
local place = { {22,14},{30,10},{22, 6},{14,10} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
des.terrain(place[placeidx], ".")
 | 
				
			||||
local place = { {22, 4},{35,10},{22,16},{ 9,10} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
des.terrain(place[placeidx], ".")
 | 
				
			||||
local place = { {22, 2},{22,18} }
 | 
				
			||||
local placeidx = math.random(1, #place);
 | 
				
			||||
des.terrain(place[placeidx], ".")
 | 
				
			||||
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,44,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "tsurugi", x=22, y=10, buc="blessed", spe=0, name="The Tsurugi of Muramasa" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap("board",22,09)
 | 
				
			||||
des.trap("board",24,10)
 | 
				
			||||
des.trap("board",22,11)
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("Ashikaga Takauji", 22, 10)
 | 
				
			||||
des.monster({ id = "samurai", peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", peaceful=0 })
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("wolf")
 | 
				
			||||
des.monster("d")
 | 
				
			||||
des.monster("d")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
@ -0,0 +1,141 @@
 | 
				
			||||
-- NetHack Samurai Sam-loca.lua	$NHDT-Date: 1652196014 2022/05/10 15:20:14 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
........-----..................................................-----........
 | 
				
			||||
........|...|..................................................|...|........
 | 
				
			||||
........|...---..}..--+------------------------------+--..}..---...|........
 | 
				
			||||
........|-|...|.....|...|....|....|....|....|....|.|...|.....|...|-|........
 | 
				
			||||
..........|...-------...|....|....|....|....|....S.|...-------...|..........
 | 
				
			||||
..........|-|.........------+----+-+-------+-+--------.........|-|..........
 | 
				
			||||
............|..--------.|}........................}|.--------..|............
 | 
				
			||||
............|..+........+..........................+........+..|............
 | 
				
			||||
............|..+........+..........................+........+..|............
 | 
				
			||||
............|..--------.|}........................}|.--------..|............
 | 
				
			||||
..........|-|.........--------+-+-------+-+----+------.........|-|..........
 | 
				
			||||
..........|...-------...|.S....|....|....|....|....|...-------...|..........
 | 
				
			||||
........|-|...|.....|...|.|....|....|....|....|....|...|.....|...|-|........
 | 
				
			||||
........|...---..}..--+------------------------------+--..}..---...|........
 | 
				
			||||
........|...|..................................................|...|........
 | 
				
			||||
........-----..................................................-----........
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",22,04)
 | 
				
			||||
des.door("locked",22,15)
 | 
				
			||||
des.door("locked",53,04)
 | 
				
			||||
des.door("locked",53,15)
 | 
				
			||||
des.door("locked",49,06)
 | 
				
			||||
des.door("locked",26,13)
 | 
				
			||||
des.door("locked",28,07)
 | 
				
			||||
des.door("locked",30,12)
 | 
				
			||||
des.door("locked",33,07)
 | 
				
			||||
des.door("locked",32,12)
 | 
				
			||||
des.door("locked",35,07)
 | 
				
			||||
des.door("locked",40,12)
 | 
				
			||||
des.door("locked",43,07)
 | 
				
			||||
des.door("locked",42,12)
 | 
				
			||||
des.door("locked",45,07)
 | 
				
			||||
des.door("locked",47,12)
 | 
				
			||||
des.door("closed",15,09)
 | 
				
			||||
des.door("closed",15,10)
 | 
				
			||||
des.door("closed",24,09)
 | 
				
			||||
des.door("closed",24,10)
 | 
				
			||||
des.door("closed",51,09)
 | 
				
			||||
des.door("closed",51,10)
 | 
				
			||||
des.door("closed",60,09)
 | 
				
			||||
des.door("closed",60,10)
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 10,10)
 | 
				
			||||
des.stair("down", 25,14)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object("*", 25, 05)
 | 
				
			||||
des.object("*", 26, 05)
 | 
				
			||||
des.object("*", 27, 05)
 | 
				
			||||
des.object("*", 28, 05)
 | 
				
			||||
des.object("*", 25, 06)
 | 
				
			||||
des.object("*", 26, 06)
 | 
				
			||||
des.object("*", 27, 06)
 | 
				
			||||
des.object("*", 28, 06)
 | 
				
			||||
--
 | 
				
			||||
des.object("[", 40, 05)
 | 
				
			||||
des.object("[", 41, 05)
 | 
				
			||||
des.object("[", 42, 05)
 | 
				
			||||
des.object("[", 43, 05)
 | 
				
			||||
des.object("[", 40, 06)
 | 
				
			||||
des.object("[", 41, 06)
 | 
				
			||||
des.object("[", 42, 06)
 | 
				
			||||
des.object("[", 43, 06)
 | 
				
			||||
--
 | 
				
			||||
des.object(")", 27, 13)
 | 
				
			||||
des.object(")", 28, 13)
 | 
				
			||||
des.object(")", 29, 13)
 | 
				
			||||
des.object(")", 30, 13)
 | 
				
			||||
des.object(")", 27, 14)
 | 
				
			||||
des.object(")", 28, 14)
 | 
				
			||||
des.object(")", 29, 14)
 | 
				
			||||
des.object(")", 30, 14)
 | 
				
			||||
--
 | 
				
			||||
des.object("(", 37, 13)
 | 
				
			||||
des.object("(", 38, 13)
 | 
				
			||||
des.object("(", 39, 13)
 | 
				
			||||
des.object("(", 40, 13)
 | 
				
			||||
des.object("(", 37, 14)
 | 
				
			||||
des.object("(", 38, 14)
 | 
				
			||||
des.object("(", 39, 14)
 | 
				
			||||
des.object("(", 40, 14)
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "ninja", x=15, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=16, y=05, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 17, 05)
 | 
				
			||||
des.monster("wolf", 18, 05)
 | 
				
			||||
des.monster({ id = "ninja", x=19, y=05, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 15, 14)
 | 
				
			||||
des.monster("wolf", 16, 14)
 | 
				
			||||
des.monster({ id = "ninja", x=17, y=14, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=18, y=14, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 56, 05)
 | 
				
			||||
des.monster({ id = "ninja", x=57, y=05, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 58, 05)
 | 
				
			||||
des.monster("wolf", 59, 05)
 | 
				
			||||
des.monster({ id = "ninja", x=56, y=14, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 57, 14)
 | 
				
			||||
des.monster({ id = "ninja", x=58, y=14, peaceful=0 })
 | 
				
			||||
des.monster("d", 59, 14)
 | 
				
			||||
des.monster("wolf", 60, 14)
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
--	"guards" for the central courtyard.
 | 
				
			||||
des.monster({ id = "samurai", x=30, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", x=31, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", x=32, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", x=32, y=14, peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", x=33, y=14, peaceful=0 })
 | 
				
			||||
des.monster({ id = "samurai", x=34, y=14, peaceful=0 })
 | 
				
			||||
@ -0,0 +1,98 @@
 | 
				
			||||
-- NetHack Samurai Sam-strt.lua	$NHDT-Date: 1695932714 2023/09/28 20:25:14 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Lord Sato
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
--      The throne room designation produces random atmospheric
 | 
				
			||||
--      messages (until the room is entered) but this one doesn't
 | 
				
			||||
--      actually contain any throne.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
..............................................................PP............
 | 
				
			||||
...............................................................PP...........
 | 
				
			||||
..........---------------------------------------------------...PPP.........
 | 
				
			||||
..........|......|.........|...|..............|...|.........|....PPPPP......
 | 
				
			||||
......... |......|.........S...|..............|...S.........|.....PPPP......
 | 
				
			||||
..........|......|.........|---|..............|---|.........|.....PPP.......
 | 
				
			||||
..........+......|.........+...-------++-------...+.........|......PP.......
 | 
				
			||||
..........+......|.........|......................|.........|......PP.......
 | 
				
			||||
......... |......---------------------++--------------------|........PP.....
 | 
				
			||||
..........|.................................................|.........PP....
 | 
				
			||||
..........|.................................................|...........PP..
 | 
				
			||||
..........----------------------------------------...-------|............PP.
 | 
				
			||||
..........................................|.................|.............PP
 | 
				
			||||
.............. ................. .........|.................|..............P
 | 
				
			||||
............. } ............... } ........|.................|...............
 | 
				
			||||
.............. ........PP....... .........|.................|...............
 | 
				
			||||
.....................PPP..................|.................|...............
 | 
				
			||||
......................PP..................-------------------...............
 | 
				
			||||
............................................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region({ region={18,03, 26,07}, lit=1, type="throne", filled=2 })
 | 
				
			||||
-- Portal arrival zone
 | 
				
			||||
des.levregion({ region = {62,12,70,17}, type="branch" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 29,04)
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",10,06)
 | 
				
			||||
des.door("locked",10,07)
 | 
				
			||||
des.door("closed",27,04)
 | 
				
			||||
des.door("closed",27,06)
 | 
				
			||||
des.door("closed",38,06)
 | 
				
			||||
des.door("locked",38,08)
 | 
				
			||||
des.door("closed",39,06)
 | 
				
			||||
des.door("locked",39,08)
 | 
				
			||||
des.door("closed",50,04)
 | 
				
			||||
des.door("closed",50,06)
 | 
				
			||||
-- Lord Sato
 | 
				
			||||
des.monster({ id = "Lord Sato", coord = {20, 04}, inventory = function()
 | 
				
			||||
   des.object({ id = "splint mail", spe = 5, eroded=-1, buc="not-cursed" });
 | 
				
			||||
   des.object({ id = "katana", spe = 4, eroded=-1, buc="not-cursed" });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Lord Sato
 | 
				
			||||
des.object("chest", 20, 04)
 | 
				
			||||
-- roshi guards for the audience chamber
 | 
				
			||||
des.monster("roshi", 18, 04)
 | 
				
			||||
des.monster("roshi", 18, 05)
 | 
				
			||||
des.monster("roshi", 18, 06)
 | 
				
			||||
des.monster("roshi", 18, 07)
 | 
				
			||||
des.monster("roshi", 26, 04)
 | 
				
			||||
des.monster("roshi", 26, 05)
 | 
				
			||||
des.monster("roshi", 26, 06)
 | 
				
			||||
des.monster("roshi", 26, 07)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster({ id = "ninja", x=64, y=00, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 65, 01)
 | 
				
			||||
des.monster({ id = "ninja", x=67, y=02, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=69, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=69, y=06, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 69, 07)
 | 
				
			||||
des.monster({ id = "ninja", x=70, y=06, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=70, y=07, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=72, y=01, peaceful=0 })
 | 
				
			||||
des.monster("wolf", 75, 09)
 | 
				
			||||
des.monster({ id = "ninja", x=73, y=05, peaceful=0 })
 | 
				
			||||
des.monster({ id = "ninja", x=68, y=02, peaceful=0 })
 | 
				
			||||
des.monster("stalker")
 | 
				
			||||
@ -0,0 +1,35 @@
 | 
				
			||||
-- NetHack Tourist Tou-fila.lua	$NHDT-Date: 1652196014 2022/05/10 15:20:14 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "C", peaceful = 0 })
 | 
				
			||||
@ -0,0 +1,39 @@
 | 
				
			||||
-- NetHack Tourist Tou-filb.lua	$NHDT-Date: 1652196015 2022/05/10 15:20:15 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noflip");
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg=" ", smoothed=true, joined=true, walled=true })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "soldier", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "captain", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "captain", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "C", peaceful = 0 })
 | 
				
			||||
des.monster("s")
 | 
				
			||||
@ -0,0 +1,159 @@
 | 
				
			||||
-- NetHack Tourist Tou-goal.lua	$NHDT-Date: 1652196015 2022/05/10 15:20:15 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.4 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel");
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
----------------------------------------------------------------------------
 | 
				
			||||
|.........|.........|..........|..| |.................|........|........|..|
 | 
				
			||||
|.........|.........|..........|..| |....--------.....|........|........|..|
 | 
				
			||||
|------S--|--+-----------+------..| |....|......|.....|........|........|..|
 | 
				
			||||
|.........|.......................| |....|......+.....--+-------------+--..|
 | 
				
			||||
|.........|.......................| |....|......|..........................|
 | 
				
			||||
|-S-----S-|......----------.......| |....|......|..........................|
 | 
				
			||||
|..|..|...|......|........|.......| |....-----------.........----..........|
 | 
				
			||||
|..+..+...|......|........|.......| |....|.........|.........|}}|..........|
 | 
				
			||||
|..|..|...|......+........|.......| |....|.........+.........|}}|..........|
 | 
				
			||||
|..|..|...|......|........|.......S.S....|.........|.........----..........|
 | 
				
			||||
|---..----|......|........|.......| |....|.........|.......................|
 | 
				
			||||
|.........+......|+F-+F-+F|.......| |....-----------.......................|
 | 
				
			||||
|---..----|......|..|..|..|.......| |......................--------------..|
 | 
				
			||||
|..|..|...|......--F-F--F--.......| |......................+............|..|
 | 
				
			||||
|..+..+...|.......................| |--.---...-----+-----..|............|..|
 | 
				
			||||
|--|..----|--+-----------+------..| |.....|...|.........|..|------------|..|
 | 
				
			||||
|..+..+...|.........|..........|..| |.....|...|.........|..+............|..|
 | 
				
			||||
|..|..|...|.........|..........|..| |.....|...|.........|..|............|..|
 | 
				
			||||
----------------------------------------------------------------------------
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- The Inn
 | 
				
			||||
des.region(selection.area(01,01,09,02), "lit")
 | 
				
			||||
des.region({ region = {01,04,09,05}, lit=1, type = "barracks", filled = 1 })
 | 
				
			||||
des.region(selection.area(01,07,02,10), "unlit")
 | 
				
			||||
des.region(selection.area(07,07,09,10), "unlit")
 | 
				
			||||
des.region(selection.area(01,14,02,15), "unlit")
 | 
				
			||||
des.region(selection.area(07,14,09,15), "unlit")
 | 
				
			||||
des.region(selection.area(01,17,02,18), "unlit")
 | 
				
			||||
des.region(selection.area(07,17,09,18), "unlit")
 | 
				
			||||
--
 | 
				
			||||
des.region({ region = {11,01,19,02}, lit = 0, type = "barracks", filled = 1 })
 | 
				
			||||
des.region(selection.area(21,01,30,02), "unlit")
 | 
				
			||||
des.region({ region = {11,17,19,18}, lit = 0, type = "barracks", filled = 1 })
 | 
				
			||||
des.region(selection.area(21,17,30,18), "unlit")
 | 
				
			||||
-- Police Station
 | 
				
			||||
des.region(selection.area(18,07,25,11), "lit")
 | 
				
			||||
des.region(selection.area(18,13,19,13), "unlit")
 | 
				
			||||
des.region(selection.area(21,13,22,13), "unlit")
 | 
				
			||||
des.region(selection.area(24,13,25,13), "unlit")
 | 
				
			||||
-- The town itself
 | 
				
			||||
des.region(selection.area(42,03,47,06), "unlit")
 | 
				
			||||
des.region(selection.area(42,08,50,11), "unlit")
 | 
				
			||||
des.region({ region = {37,16,41,18}, lit = 0, type = "morgue", filled = 1 })
 | 
				
			||||
des.region(selection.area(47,16,55,18), "unlit")
 | 
				
			||||
des.region(selection.area(55,01,62,03), "unlit")
 | 
				
			||||
des.region(selection.area(64,01,71,03), "unlit")
 | 
				
			||||
des.region({ region = {60,14,71,15}, lit = 1, type = "shop", filled = 1 })
 | 
				
			||||
des.region({ region = {60,17,71,18}, lit = 1, type = "shop", filled = 1 })
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 70,08)
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",07,03)
 | 
				
			||||
des.door("locked",02,06)
 | 
				
			||||
des.door("locked",08,06)
 | 
				
			||||
des.door("closed",03,08)
 | 
				
			||||
des.door("closed",06,08)
 | 
				
			||||
des.door("open",10,12)
 | 
				
			||||
des.door("closed",03,15)
 | 
				
			||||
des.door("closed",06,15)
 | 
				
			||||
des.door("closed",03,17)
 | 
				
			||||
des.door("closed",06,17)
 | 
				
			||||
des.door("closed",13,03)
 | 
				
			||||
des.door("random",25,03)
 | 
				
			||||
des.door("closed",13,16)
 | 
				
			||||
des.door("random",25,16)
 | 
				
			||||
des.door("locked",17,09)
 | 
				
			||||
des.door("locked",18,12)
 | 
				
			||||
des.door("locked",21,12)
 | 
				
			||||
des.door("locked",24,12)
 | 
				
			||||
des.door("locked",34,10)
 | 
				
			||||
des.door("locked",36,10)
 | 
				
			||||
des.door("random",48,04)
 | 
				
			||||
des.door("random",56,04)
 | 
				
			||||
des.door("random",70,04)
 | 
				
			||||
des.door("random",51,09)
 | 
				
			||||
des.door("random",51,15)
 | 
				
			||||
des.door("open",59,14)
 | 
				
			||||
des.door("open",59,17)
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "credit card", x=04, y=01, buc="blessed", spe=0, name="The Platinum Yendorian Express Card" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps - must avoid the 2 shops
 | 
				
			||||
local validtraps = selection.area(00,00,75,19):filter_mapchar('.')
 | 
				
			||||
validtraps = validtraps - selection.area(60,14,71,18)
 | 
				
			||||
for i=1,6 do
 | 
				
			||||
   des.trap(validtraps:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster({ id = "Master of Thieves", x=04, y=01, peaceful = 0 })
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
-- ladies of the evening
 | 
				
			||||
des.monster("succubus", 02, 08)
 | 
				
			||||
des.monster("succubus", 08, 08)
 | 
				
			||||
des.monster("incubus", 02, 14)
 | 
				
			||||
des.monster("incubus", 08, 14)
 | 
				
			||||
des.monster("incubus", 02, 17)
 | 
				
			||||
des.monster("incubus", 08, 17)
 | 
				
			||||
-- Police station (with drunken prisoners)
 | 
				
			||||
des.monster({ id = "Kop Kaptain", x=24, y=09, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Kop Lieutenant", x=20, y=09, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Kop Lieutenant", x=22, y=11, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Kop Lieutenant", x=22, y=07, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Keystone Kop", x=19, y=07, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Keystone Kop", x=19, y=08, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Keystone Kop", x=22, y=09, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Keystone Kop", x=24, y=11, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "Keystone Kop", x=19, y=11, peaceful = 0 })
 | 
				
			||||
des.monster("prisoner", 19, 13)
 | 
				
			||||
des.monster("prisoner", 21, 13)
 | 
				
			||||
des.monster("prisoner", 24, 13)
 | 
				
			||||
--
 | 
				
			||||
des.monster({ id = "watchman", x=33, y=10, peaceful = 0 })
 | 
				
			||||
 | 
				
			||||
des.wallify()
 | 
				
			||||
@ -0,0 +1,153 @@
 | 
				
			||||
-- NetHack Tourist Tou-loca.lua	$NHDT-Date: 1652196015 2022/05/10 15:20:15 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor")
 | 
				
			||||
des.map([[
 | 
				
			||||
----------------------------------------------------------------------------
 | 
				
			||||
|....|......|..........|......|......|...|....|.....|......|...............|
 | 
				
			||||
|....|......|.|------|.|......|......|.|.|....|..}..|......|.|----------|..|
 | 
				
			||||
|....|--+----.|......|.|-S---+|+-----|.|.S....|.....|---+--|.|..........+..|
 | 
				
			||||
|....|........|......|.|...|.........|.|------|..............|..........|-+|
 | 
				
			||||
|....+...}}...+......|.|...|.|-----|.|..............|--+----------------|..|
 | 
				
			||||
|----|........|------|.|---|.|.....|......|-----+-|.|.......|...........|--|
 | 
				
			||||
|............................|.....|.|--+-|.......|.|.......|...........|..|
 | 
				
			||||
|----|.....|-------------|...|--+--|.|....|.......|.|-----------+-------|..|
 | 
				
			||||
|....+.....+.........S...|...........|....|-------|........................|
 | 
				
			||||
|....|.....|.........|...|.|---------|....|.........|-------|.|----------|.|
 | 
				
			||||
|....|.....|---------|---|.|......|..+....|-------|.|.......|.+......S.\.|.|
 | 
				
			||||
|....|.....+.........S...|.|......|..|....|.......|.|.......|.|......|...|.|
 | 
				
			||||
|-------|..|.........|---|.|+-------------------+-|.|.......+.|----------|.|
 | 
				
			||||
|.......+..|---------|.........|.........|..........|.......|.|..........|.|
 | 
				
			||||
|.......|..............|--+--|.|.........|.|----+-----------|.|..........|.|
 | 
				
			||||
|---------+-|--+-----|-|.....|.|.........|.|........|.|.....+.|..........+.|
 | 
				
			||||
|...........|........|.S.....|.|----+----|.|--------|.|.....|.|----------|.|
 | 
				
			||||
|...........|........|.|.....|........................|.....|..............|
 | 
				
			||||
----------------------------------------------------------------------------
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
--
 | 
				
			||||
des.region({ region={01,01, 04,05}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region({ region={15,03, 20,05}, lit=1, type="shop", filled=1 })
 | 
				
			||||
des.region({ region={62,03, 71,04}, lit=1, type="shop", filled=1 })
 | 
				
			||||
des.region({ region={01,17, 11,18}, lit=1, type="barracks", filled=1 })
 | 
				
			||||
des.region({ region={12,09, 20,10}, lit=1, type="barracks", filled=1 })
 | 
				
			||||
des.region({ region={53,11, 59,14}, lit=1, type="zoo", filled=1 })
 | 
				
			||||
des.region({ region={63,14, 72,16}, lit=1, type="barracks", filled=1 })
 | 
				
			||||
des.region({ region={32,14, 40,16}, lit=1, type="temple", filled=1 })
 | 
				
			||||
--
 | 
				
			||||
des.region({ region = {06,01,11,02}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {24,01,29,02}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {31,01,36,02}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {42,01,45,03}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {53,01,58,02}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {24,04,26,05}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {30,06,34,07}, type = "ordinary" })
 | 
				
			||||
des.region(selection.area(73,05,74,05), "unlit")
 | 
				
			||||
des.region({ region = {01,09,04,12}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {01,14,07,15}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {12,12,20,13}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {13,17,20,18}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {22,09,24,10}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {22,12,24,12}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {24,16,28,18}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {28,11,33,12}, type = "ordinary" })
 | 
				
			||||
des.region(selection.area(35,11,36,12), "lit")
 | 
				
			||||
des.region({ region = {38,08,41,12}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {43,07,49,08}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {43,12,49,12}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {44,16,51,16}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {53,06,59,07}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {61,06,71,07}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {55,16,59,18}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {63,11,68,12}, type = "ordinary" })
 | 
				
			||||
des.region({ region = {70,11,72,12}, type = "ordinary" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 10,04)
 | 
				
			||||
des.stair("down", 73,05)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
des.door("closed",05,05)
 | 
				
			||||
des.door("closed",05,09)
 | 
				
			||||
des.door("closed",08,14)
 | 
				
			||||
des.door("closed",08,03)
 | 
				
			||||
des.door("closed",11,09)
 | 
				
			||||
des.door("closed",11,12)
 | 
				
			||||
des.door("closed",10,16)
 | 
				
			||||
des.door("closed",14,05)
 | 
				
			||||
des.door("closed",15,16)
 | 
				
			||||
des.door("locked",21,09)
 | 
				
			||||
des.door("locked",21,12)
 | 
				
			||||
des.door("closed",23,17)
 | 
				
			||||
des.door("closed",25,03)
 | 
				
			||||
des.door("closed",26,15)
 | 
				
			||||
des.door("closed",29,03)
 | 
				
			||||
des.door("closed",28,13)
 | 
				
			||||
des.door("closed",31,03)
 | 
				
			||||
des.door("closed",32,08)
 | 
				
			||||
des.door("closed",37,11)
 | 
				
			||||
des.door("closed",36,17)
 | 
				
			||||
des.door("locked",41,03)
 | 
				
			||||
des.door("closed",40,07)
 | 
				
			||||
des.door("closed",48,06)
 | 
				
			||||
des.door("closed",48,13)
 | 
				
			||||
des.door("closed",48,15)
 | 
				
			||||
des.door("closed",56,03)
 | 
				
			||||
des.door("closed",55,05)
 | 
				
			||||
des.door("closed",72,03)
 | 
				
			||||
des.door("locked",74,04)
 | 
				
			||||
des.door("closed",64,08)
 | 
				
			||||
des.door("closed",62,11)
 | 
				
			||||
des.door("closed",69,11)
 | 
				
			||||
des.door("closed",60,13)
 | 
				
			||||
des.door("closed",60,16)
 | 
				
			||||
des.door("closed",73,16)
 | 
				
			||||
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Toilet paper
 | 
				
			||||
des.object("blank paper", 71, 12)
 | 
				
			||||
des.object("blank paper", 71, 12)
 | 
				
			||||
-- Random traps - must avoid the 2 shops
 | 
				
			||||
local validtraps = selection.area(00,00,75,19):filter_mapchar('.')
 | 
				
			||||
validtraps = validtraps - (selection.area(15,03,20,05) + selection.area(62,03,71,04))
 | 
				
			||||
for i = 1,9 do
 | 
				
			||||
   des.trap(validtraps:rndcoord(1))
 | 
				
			||||
end
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
@ -0,0 +1,134 @@
 | 
				
			||||
-- NetHack Tourist Tou-strt.lua	$NHDT-Date: 1652196016 2022/05/10 15:20:16 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.3 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991,92 by M. Stephenson, P. Winner
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, Twoflower
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor")
 | 
				
			||||
des.map([[
 | 
				
			||||
.......}}....---------..-------------------------------------------------...
 | 
				
			||||
........}}...|.......|..|.-------------------------------------------...|...
 | 
				
			||||
.........}}..|.......|..|.|......|......|.............|......|......|...|...
 | 
				
			||||
..........}}.|.......|..|.|......+......+.............+......+..\...|...|...
 | 
				
			||||
...........}}}..........|.|......|......|.............|......|......|...|...
 | 
				
			||||
.............}}.........|.|----S-|--S---|S----------S-|---S--|------|...|...
 | 
				
			||||
..............}}}.......|...............................................|...
 | 
				
			||||
................}}}.....----S------++--S----------S----------S-----------...
 | 
				
			||||
..................}}...........    ..    ...................................
 | 
				
			||||
......-------......}}}}........}}}}..}}}}..}}}}..}}}}.......................
 | 
				
			||||
......|.....|.......}}}}}}..}}}}   ..   }}}}..}}}}..}}}.....................
 | 
				
			||||
......|.....+...........}}}}}}........................}}}..}}}}..}}}..}}}...
 | 
				
			||||
......|.....|...........................................}}}}..}}}..}}}}.}}}}
 | 
				
			||||
......-------...............................................................
 | 
				
			||||
............................................................................
 | 
				
			||||
...-------......-------.....................................................
 | 
				
			||||
...|.....|......|.....|.....................................................
 | 
				
			||||
...|.....+......+.....|.....................................................
 | 
				
			||||
...|.....|......|.....|.....................................................
 | 
				
			||||
...-------......-------.....................................................
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
des.region({ region={14,01, 20,03}, lit=0, type="morgue", filled=1 })
 | 
				
			||||
des.region(selection.area(07,10,11,12), "unlit")
 | 
				
			||||
des.region(selection.area(04,16,08,18), "unlit")
 | 
				
			||||
des.region(selection.area(17,16,21,18), "unlit")
 | 
				
			||||
des.region(selection.area(27,02,32,04), "unlit")
 | 
				
			||||
des.region(selection.area(34,02,39,04), "unlit")
 | 
				
			||||
des.region(selection.area(41,02,53,04), "unlit")
 | 
				
			||||
des.region(selection.area(55,02,60,04), "unlit")
 | 
				
			||||
des.region(selection.area(62,02,67,04), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 66,03)
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {68,14,68,14}, type="branch" })
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,75,19))
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",31,05)
 | 
				
			||||
des.door("locked",36,05)
 | 
				
			||||
des.door("locked",41,05)
 | 
				
			||||
des.door("locked",52,05)
 | 
				
			||||
des.door("locked",58,05)
 | 
				
			||||
des.door("locked",28,07)
 | 
				
			||||
des.door("locked",39,07)
 | 
				
			||||
des.door("locked",50,07)
 | 
				
			||||
des.door("locked",61,07)
 | 
				
			||||
des.door("closed",33,03)
 | 
				
			||||
des.door("closed",40,03)
 | 
				
			||||
des.door("closed",54,03)
 | 
				
			||||
des.door("closed",61,03)
 | 
				
			||||
des.door("open",12,11)
 | 
				
			||||
des.door("open",09,17)
 | 
				
			||||
des.door("open",16,17)
 | 
				
			||||
des.door("locked",35,07)
 | 
				
			||||
des.door("locked",36,07)
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("giant spider")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
des.monster("s")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("forest centaur")
 | 
				
			||||
des.monster("C")
 | 
				
			||||
-- Twoflower
 | 
				
			||||
des.monster({ id = "Twoflower", coord = {64, 03}, inventory = function()
 | 
				
			||||
   des.object({ id = "walking shoes", spe = 3 });
 | 
				
			||||
   des.object({ id = "hawaiian shirt", spe = 3 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of Twoflower
 | 
				
			||||
des.object("chest", 64, 03)
 | 
				
			||||
-- guides for the audience chamber
 | 
				
			||||
des.monster("guide", 29, 03)
 | 
				
			||||
des.monster("guide", 32, 04)
 | 
				
			||||
des.monster("guide", 35, 02)
 | 
				
			||||
des.monster("guide", 38, 03)
 | 
				
			||||
des.monster("guide", 45, 03)
 | 
				
			||||
des.monster("guide", 48, 02)
 | 
				
			||||
des.monster("guide", 49, 04)
 | 
				
			||||
des.monster("guide", 51, 03)
 | 
				
			||||
des.monster("guide", 57, 03)
 | 
				
			||||
des.monster("guide", 62, 04)
 | 
				
			||||
des.monster("guide", 66, 04)
 | 
				
			||||
-- path guards
 | 
				
			||||
des.monster("watchman", 35, 08)
 | 
				
			||||
des.monster("watchman", 36, 08)
 | 
				
			||||
-- river monsters
 | 
				
			||||
des.monster("giant eel", 62, 12)
 | 
				
			||||
des.monster("piranha", 47, 10)
 | 
				
			||||
des.monster("piranha", 29, 11)
 | 
				
			||||
des.monster("kraken", 34, 09)
 | 
				
			||||
des.monster("kraken", 37, 09)
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,40 @@
 | 
				
			||||
-- NetHack Valkyrie Val-fila.lua	$NHDT-Date: 1652196016 2022/05/10 15:20:16 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "I" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "icedpools", "noflip")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="I", smoothed=true, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("a")
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,42 @@
 | 
				
			||||
-- NetHack Valkyrie Val-filb.lua	$NHDT-Date: 1652196016 2022/05/10 15:20:16 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "L" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "icedpools", "noflip")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="L", smoothed=true, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
des.stair("up")
 | 
				
			||||
des.stair("down")
 | 
				
			||||
--
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
--
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("a")
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
--
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
@ -0,0 +1,104 @@
 | 
				
			||||
-- NetHack Valkyrie Val-goal.lua	$NHDT-Date: 1652196017 2022/05/10 15:20:17 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.5 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "L" });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "icedpools")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="L", smoothed=true, joined=true, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
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.......
 | 
				
			||||
xx.....LL|-...LLLLLLL...-|LL......x
 | 
				
			||||
xxx.....LL|--.........--|LL.....xxx
 | 
				
			||||
xxxx.....LLL|---------|LLL...xxxxxx
 | 
				
			||||
xxxxx.....LLLLLLLLLLLLLLL...xxxxxxx
 | 
				
			||||
xxxxxx......LLLLL.LLLLL.....xxxxxxx
 | 
				
			||||
xxxxxxxxx..................xxxxxxxx
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,34,16), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
-- Note:  The up stairs are *intentionally* off of the map.
 | 
				
			||||
-- if the stairs are surrounded by lava, maybe give some room
 | 
				
			||||
des.replace_terrain({ region = {44,09, 46,11}, fromterrain='L', toterrain='.', chance=50 });
 | 
				
			||||
des.stair("up", 45,10)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,34,16))
 | 
				
			||||
-- Drawbridges; northern one opens from the south (portcullis) to further
 | 
				
			||||
-- north (lowered span), southern one from the north to further south
 | 
				
			||||
des.drawbridge({ x=17, y=02, dir="south", state="random" })
 | 
				
			||||
if percent(75) then
 | 
				
			||||
   des.drawbridge({ x=17, y=14, dir="north", state="open" })
 | 
				
			||||
else
 | 
				
			||||
   des.drawbridge({ x=17, y=14, dir="north", state="random" })
 | 
				
			||||
end
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object({ id = "crystal ball", x=17, y=08, buc="blessed", spe=5, name="The Orb of Fate" })
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Traps
 | 
				
			||||
des.trap("board",13,08)
 | 
				
			||||
des.trap("board",21,08)
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("board")
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("Lord Surtur", 17, 08)
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("a")
 | 
				
			||||
des.monster("a")
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=06, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=07, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=08, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=09, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=10, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=24, y=06, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=24, y=07, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=24, y=08, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=24, y=09, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=24, y=10, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
 | 
				
			||||
--
 | 
				
			||||
--	The "fill" levels for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	These levels are used to fill out any levels not occupied by specific
 | 
				
			||||
--	levels as defined above. "filla" is the upper filler, between the
 | 
				
			||||
--	start and locate levels, and "fillb" the lower between the locate
 | 
				
			||||
--	and goal levels.
 | 
				
			||||
--
 | 
				
			||||
@ -0,0 +1,85 @@
 | 
				
			||||
-- NetHack Valkyrie Val-loca.lua	$NHDT-Date: 1652196017 2022/05/10 15:20:17 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
des.level_init({ style = "solidfill", fg = " " });
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "hardfloor", "icedpools", "noflip")
 | 
				
			||||
 | 
				
			||||
des.level_init({ style="mines", fg=".", bg="I", smoothed=true, joined=false, lit=1, walled=false })
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
PPPPxxxx                      xxxxPPPPPx
 | 
				
			||||
PLPxxx                          xPPLLLPP
 | 
				
			||||
PPP    .......................    PPPLLP
 | 
				
			||||
xx   ............................   PPPP
 | 
				
			||||
x  ...............................  xxxx
 | 
				
			||||
  .................................   xx
 | 
				
			||||
....................................   x
 | 
				
			||||
  ...................................   
 | 
				
			||||
x  ..................................  x
 | 
				
			||||
xx   ..............................   PP
 | 
				
			||||
xPPP  ..........................     PLP
 | 
				
			||||
xPLLP                             xxPLLP
 | 
				
			||||
xPPPPxx                         xxxxPPPP
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,39,12), "lit")
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("up", 48,14)
 | 
				
			||||
des.stair("down", 20,06)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(00,00,39,12))
 | 
				
			||||
-- Objects
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
des.object()
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap()
 | 
				
			||||
des.trap()
 | 
				
			||||
-- Random monsters.
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("fire ant")
 | 
				
			||||
des.monster("a")
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", peaceful = 0 })
 | 
				
			||||
des.monster({ class = "H", peaceful = 0 })
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,100 @@
 | 
				
			||||
-- NetHack Valkyrie Val-strt.lua	$NHDT-Date: 1652196017 2022/05/10 15:20:17 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.2 $
 | 
				
			||||
--	Copyright (c) 1989 by Jean-Christophe Collet
 | 
				
			||||
--	Copyright (c) 1991-2 by M. Stephenson
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
--	The "start" level for the quest.
 | 
				
			||||
--
 | 
				
			||||
--	Here you meet your (besieged) class leader, the Norn,
 | 
				
			||||
--	and receive your quest assignment.
 | 
				
			||||
--
 | 
				
			||||
 | 
				
			||||
des.level_flags("mazelevel", "noteleport", "hardfloor", "icedpools")
 | 
				
			||||
des.level_init({ style = "solidfill", fg = "I" })
 | 
				
			||||
 | 
				
			||||
local pools = selection.new()
 | 
				
			||||
-- random locations
 | 
				
			||||
for i = 1,13 do
 | 
				
			||||
   pools:set();
 | 
				
			||||
end
 | 
				
			||||
-- some bigger ones
 | 
				
			||||
pools = pools | selection.grow(selection.set(selection.new()), "west")
 | 
				
			||||
pools = pools | selection.grow(selection.set(selection.new()), "north")
 | 
				
			||||
pools = pools | selection.grow(selection.set(selection.new()), "random")
 | 
				
			||||
 | 
				
			||||
-- Lava pools surrounded by water
 | 
				
			||||
des.terrain(pools:clone():grow("all"), "P")
 | 
				
			||||
des.terrain(pools, "L")
 | 
				
			||||
 | 
				
			||||
des.map([[
 | 
				
			||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..{..xxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.....xxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxx.....xxxxxxxxxxxxx|----------------|xxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxx..xxx...xxxxxxxxxxx|................|xxxxxxxxxx..xxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxx..xxxxxx......xxxxx.|................|.xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxx..xxxxxxxxxxxx.......+................+...xxxxxxx.xxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxx..xxxxxxxxx.....xxxxx.|................|.x...xxxxx.xxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxx..xxxxxxxxx..xxxxxxxxxx|................|xxxx.......xxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxx..xxxxxxx..xxxxxxxxxxx|----------------|xxxxxxxxxx...xxxxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxx..xxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxx......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxx
 | 
				
			||||
xxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...x......xxxxxx
 | 
				
			||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.........xxxxx
 | 
				
			||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.......xxxxxx
 | 
				
			||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 | 
				
			||||
]]);
 | 
				
			||||
-- Dungeon Description
 | 
				
			||||
des.region(selection.area(00,00,75,19), "lit")
 | 
				
			||||
-- Portal arrival point
 | 
				
			||||
des.levregion({ region = {66,17,66,17}, type="branch" })
 | 
				
			||||
-- Stairs
 | 
				
			||||
des.stair("down", 18,01)
 | 
				
			||||
des.feature("fountain", 53,02)
 | 
				
			||||
-- Doors
 | 
				
			||||
des.door("locked",26,10)
 | 
				
			||||
des.door("locked",43,10)
 | 
				
			||||
-- Norn
 | 
				
			||||
des.monster({ id = "Norn", coord = {35, 10}, inventory = function()
 | 
				
			||||
   des.object({ id = "banded mail", spe = 5 });
 | 
				
			||||
   des.object({ id = "long sword", spe = 4 });
 | 
				
			||||
end })
 | 
				
			||||
-- The treasure of the Norn
 | 
				
			||||
des.object("chest", 36, 10)
 | 
				
			||||
-- valkyrie guards for the audience chamber
 | 
				
			||||
des.monster("warrior", 27, 08)
 | 
				
			||||
des.monster("warrior", 27, 09)
 | 
				
			||||
des.monster("warrior", 27, 11)
 | 
				
			||||
des.monster("warrior", 27, 12)
 | 
				
			||||
des.monster("warrior", 42, 08)
 | 
				
			||||
des.monster("warrior", 42, 09)
 | 
				
			||||
des.monster("warrior", 42, 11)
 | 
				
			||||
des.monster("warrior", 42, 12)
 | 
				
			||||
-- Non diggable walls
 | 
				
			||||
des.non_diggable(selection.area(26,07,43,13))
 | 
				
			||||
-- Random traps
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
des.trap("fire")
 | 
				
			||||
-- Monsters on siege duty.
 | 
				
			||||
des.monster("fire ant", 04, 12)
 | 
				
			||||
des.monster("fire ant", 08, 08)
 | 
				
			||||
des.monster("fire ant", 14, 04)
 | 
				
			||||
des.monster("fire ant", 17, 11)
 | 
				
			||||
des.monster("fire ant", 24, 10)
 | 
				
			||||
des.monster("fire ant", 45, 10)
 | 
				
			||||
des.monster("fire ant", 54, 02)
 | 
				
			||||
des.monster("fire ant", 55, 07)
 | 
				
			||||
des.monster("fire ant", 58, 14)
 | 
				
			||||
des.monster("fire ant", 63, 17)
 | 
				
			||||
des.monster({ id = "fire giant", x=18, y=01, peaceful = 0 })
 | 
				
			||||
des.monster({ id = "fire giant", x=10, y=16, peaceful = 0 })
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
-- NetHack Wizard Wiz-fila.lua	$NHDT-Date: 1652196018 2022/05/10 15:20:18 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.1 $
 | 
				
			||||
--	Copyright (c) 1992 by David Cohrs
 | 
				
			||||
-- NetHack may be freely redistributed.  See license for details.
 | 
				
			||||
--
 | 
				
			||||
--
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("up")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.monster("vampire bat")
 | 
				
			||||
              des.monster("vampire bat")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.stair("down")
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
              des.monster("vampire bat")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster({ class = "i", peaceful=0 })
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.room({ type = "ordinary",
 | 
				
			||||
           contents = function()
 | 
				
			||||
              des.object()
 | 
				
			||||
              des.trap()
 | 
				
			||||
              des.monster("vampire bat")
 | 
				
			||||
           end
 | 
				
			||||
})
 | 
				
			||||
 | 
				
			||||
des.random_corridors()
 | 
				
			||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue