summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-04-05 16:46:35 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-04-05 16:46:35 +0000
commit8b6403164380ecbc2a0a16b15757fd2cdce548eb (patch)
tree2f6d8bf84b4be0b82aad5ef055516e758e505b16
parentcd9d13b92dee71ff7671c10e69e4508b7554ff69 (diff)
downloadcrawl-ref-8b6403164380ecbc2a0a16b15757fd2cdce548eb.tar.gz
crawl-ref-8b6403164380ecbc2a0a16b15757fd2cdce548eb.zip
Merge trunk back into 0.2 for 0.2.2.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/branches/stone_soup-0.2@1227 c06c8d41-db1a-0410-9941-cceddc491573
-rw-r--r--crawl-ref/INSTALL291
-rw-r--r--crawl-ref/docs/crawl_options.txt8
-rw-r--r--crawl-ref/source/AppHdr.h2
-rw-r--r--crawl-ref/source/abl-show.cc4
-rw-r--r--crawl-ref/source/acr.cc6
-rw-r--r--crawl-ref/source/beam.cc20
-rw-r--r--crawl-ref/source/chardump.cc15
-rw-r--r--crawl-ref/source/dat/splev.des543
-rw-r--r--crawl-ref/source/dat/tricky.des139
-rw-r--r--crawl-ref/source/dat/vaults.des1087
-rw-r--r--crawl-ref/source/direct.cc13
-rw-r--r--crawl-ref/source/dungeon.cc3
-rw-r--r--crawl-ref/source/enum.h24
-rw-r--r--crawl-ref/source/externs.h4
-rw-r--r--crawl-ref/source/fight.cc8
-rw-r--r--crawl-ref/source/hiscores.cc4
-rw-r--r--crawl-ref/source/initfile.cc2
-rw-r--r--crawl-ref/source/libutil.cc6
-rw-r--r--crawl-ref/source/libutil.h3
-rw-r--r--crawl-ref/source/makefile.dos2
-rw-r--r--crawl-ref/source/makefile.mgw2
-rw-r--r--crawl-ref/source/makefile.unix2
-rw-r--r--crawl-ref/source/mapdef.cc7
-rw-r--r--crawl-ref/source/message.cc82
-rw-r--r--crawl-ref/source/mon-data.h15
-rw-r--r--crawl-ref/source/mon-util.cc55
-rw-r--r--crawl-ref/source/mon-util.h2
-rw-r--r--crawl-ref/source/monstuff.cc129
-rw-r--r--crawl-ref/source/mstuff2.cc34
-rw-r--r--crawl-ref/source/mutation.cc2
-rw-r--r--crawl-ref/source/newgame.cc2
-rw-r--r--crawl-ref/source/player.cc21
-rw-r--r--crawl-ref/source/religion.cc35
-rw-r--r--crawl-ref/source/religion.h3
-rw-r--r--crawl-ref/source/spells1.cc4
-rw-r--r--crawl-ref/source/spells3.cc22
-rw-r--r--crawl-ref/source/spells3.h5
-rw-r--r--crawl-ref/source/spells4.cc18
-rw-r--r--crawl-ref/source/spells4.h2
-rw-r--r--crawl-ref/source/spl-cast.cc32
-rw-r--r--crawl-ref/source/spl-cast.h4
-rw-r--r--crawl-ref/source/spl-data.h10
-rw-r--r--crawl-ref/source/spl-util.cc3
-rw-r--r--crawl-ref/source/stuff.cc8
-rw-r--r--crawl-ref/source/util/levcomp.ypp2
-rw-r--r--crawl-ref/source/version.h2
-rw-r--r--crawl-ref/source/view.cc8
47 files changed, 1529 insertions, 1166 deletions
diff --git a/crawl-ref/INSTALL b/crawl-ref/INSTALL
index d97284265b..b29dfb85e5 100644
--- a/crawl-ref/INSTALL
+++ b/crawl-ref/INSTALL
@@ -4,62 +4,70 @@ Install instructions for Dungeon Crawl Stone Soup (DCSS)
Building Dungeon Crawl Stone Soup
---------------------------------
-Crawl Stone Soup is known to compile successfully on the following platforms as
-of version 0.1:
-- Any Unix with a recent gcc (and g++), GNU make and libncurses, including
- Linux and Mac OS X.
-- Microsoft Windows NT/2000/XP. The game will also run on Windows 9X and ME.
- DOS binaries can also be compiled on Windows NT+.
+Crawl Stone Soup is known to compile successfully on the following
+platforms as of version 0.2:
-The only supported compiler is gcc (available on almost all Unixes, and as djgpp
-for DOS, and MinGW for Windows).
+- Any Unix with a recent gcc (and g++), GNU make and libncurses,
+ including Linux and Mac OS X. "Recent" is defined as gcc 3.3 or
+ newer.
+- Microsoft Windows NT/2000/XP. The game will also run on Windows 9X
+ and ME. DOS binaries can also be compiled on Windows NT+.
-Other platforms are unsupported, but you should be able to build Crawl on
-pretty much any operating system with a modern C++ compiler (full support for
-the standard C++ library, in particular <string>, the collection classes and
-<algorithm> is necessary) and the curses library.
+The only supported compiler is gcc (available on almost all Unixes,
+and as djgpp for DOS, and MinGW for Windows).
+
+Other platforms are unsupported, but you should be able to build Crawl
+on pretty much any operating system with a modern C++ compiler (full
+support for the standard C++ library, in particular <string>, the
+collection classes and <algorithm> is necessary) and the curses
+library.
Optional libraries
------------------
+
Crawl can be built with some optional features:
+
* Sounds
* Regular expressions
* Lua support
Crawl Stone Soup also uses a level compiler to compile special level
-definitions; to make changes to the level compiler, you'll need the flex and
-bison/byacc tools (Other lex/yaccs may also work). More details are available
-below.
+definitions; to make changes to the level compiler, you'll need the
+flex and bison/byacc tools (Other lex/yaccs may also work). More
+details are available below.
-Sounds must be enabled by editing AppHdr.h (uncomment SOUND_PLAY_COMMAND on
-Unixes or WINMM_PLAY_SOUNDS on Windows).
+Sounds must be enabled by editing AppHdr.h (uncomment
+SOUND_PLAY_COMMAND on Unixes or WINMM_PLAY_SOUNDS on Windows).
-Regular expressions require libpcre on non-Unix operating systems. On Unixes,
-the standard POSIX regular expression support is adequate for Crawl's needs.
+Regular expressions require libpcre on non-Unix operating systems. On
+Unixes, the standard POSIX regular expression support is adequate for
+Crawl's needs.
-Lua support requires liblua, which you can build by downloading the sources from
-www.lua.org. On most Unixes, you can also use the native package management
-system to easily install lua.
+Lua support requires liblua, which you can build by downloading the
+sources from www.lua.org. On most Unixes, you can also use the native
+package management system to easily install lua.
Makefile system
---------------
-Crawl uses a selector makefile (under source/makefile) to control what platform
-it's building for. Your first step in building Crawl should be to edit
-source/makefile and point it at the correct platform makefile. For instance, if
-you're building for Windows, you'd use MAKEFILE=makefile.mgw to build with MinGW
-for Windows (# is used for comments in makefiles).
-Consult the operating-system specific sections for detailed information on
-building Crawl.
+Crawl uses a selector makefile (under source/makefile) to control what
+platform it's building for. Your first step in building Crawl should
+be to edit source/makefile and point it at the correct platform
+makefile. For instance, if you're building for Windows, you'd use
+MAKEFILE=makefile.mgw to build with MinGW for Windows (# is used for
+comments in makefiles).
+
+Consult the operating-system specific sections for detailed
+information on building Crawl.
Building on Unix (Linux, *BSD, Solaris, etc.)
---------------------------------------------
-* Prerequisites:
+Prerequisites:
GNU gcc and g++, GNU make, libncurses or libcurses. You need the
development headers for ncurses - they may not be installed by default
@@ -68,75 +76,98 @@ on some Unixes.
flex and bison are optional but highly recommended. Recent versions of
byacc are also fine (edit your makefile appropriately).
-* Building:
+Building:
* cd to the source directory (you can safely ignore the dolinks.sh and
domake.sh scripts).
-* Edit makefile and make sure that MAKEFILE=makefile.unix is uncommented and
- all other MAKEFILE= lines are commented out.
-
-* Edit AppHdr.h and check that SAVE_DIR_PATH, SAVE_PACKAGE_CMD and
- LOAD_UNPACKAGE_CMD are set correctly for your system. If you do not want your
- saves packaged in a zip archive, it's safe to comment out SAVE_PACKAGE_CMD and
- LOAD_UNPACKAGE_CMD.
-
-* If you don't have flex or bison, edit makefile.unix and set DOYACC := n. If
- you want to use byacc instead of bison, edit makefile.unix and set YACC :=
- byacc. On some Linuxes you may not have lex symlinked to flex, in which case
- you'll have to set LEX := flex in makefile.unix.
-
-* Run make to build the normal (non-wizard) Crawl. On systems such as Solaris,
- you may have to use gmake for GNU make. Make sure your make identifies itself
- as GNU make when you do make --version.
+* Edit makefile and make sure that MAKEFILE=makefile.unix is
+ uncommented and all other MAKEFILE= lines are commented out.
+
+* If you want to install Crawl for multiple users, edit makefile.unix
+ and set SAVEDIR and DATADIR to appropriate directories. This is not
+ necessary if only one user is going to play Crawl. Also check
+ INSTALLDIR and change it if necessary.
+
+* Edit AppHdr.h and check that SAVE_PACKAGE_CMD and LOAD_UNPACKAGE_CMD
+ are set correctly for your system. If you do not want your saves
+ packaged in a zip archive, it's safe to comment out SAVE_PACKAGE_CMD
+ and LOAD_UNPACKAGE_CMD.
+
+* If you don't have (or don't want to use) flex or bison, edit
+ makefile.unix and set DOYACC := n. If you want to use byacc instead
+ of bison, edit makefile.unix and set YACC := byacc. On some Unixes,
+ you may not have flex (but have some other lex), in which case
+ you'll have to set LEX := lex in makefile.unix.
+
+* Run make to build the normal (non-wizard) Crawl. On systems such as
+ Solaris, you may have to use gmake for GNU make. Make sure your make
+ identifies itself as GNU make when you do make --version.
+
+* If you're installing Crawl for multiple users, run make install.
+ Crawl will be copied into the directory specified by INSTALLDIR. The
+ save and data directories will be created if necessary, and the
+ level layout (.des) and help files will be copied to the data
+ directory.
* If you have Lua, you can edit AppHdr.h and uncomment
// #define CLUA_BINDINGS
- then add -llua to your LIB = line in makefile.unix, and rebuild to compile with
- Lua support.
+ then add -llua to your LIB = line in makefile.unix, and rebuild to
+ compile with Lua support. See the section on Lua (below) for more
+ information.
Building on Mac OS X
--------------------
-You can follow the Linux instructions to build Crawl (but note you still need to
-install Xcode to get gcc and make), or alternatively you can use Xcode.
-* Crawl has been tested with Xcode 2.4 under OS X 10.4.7 on both PPC and Intel
- machines, but is likely to be buildable with earlier versions.
+You can follow the Unix instructions to build Crawl (but note you
+still need to install Xcode to get gcc and make), or alternatively you
+can use Xcode.
-* Make sure Xcode is installed. Xcode should be available on the OS X install
- DVD if you haven't already installed it.
+Note that the Unix instructions will build Crawl assuming that your
+terminal can display 16 colours. If you're planning to use
+Terminal.app (which supports only 8 colours), you should follow the
+Mac build instructions below.
-* Open the Xcode project (Crawl.xcodeproj) under the "source" directory.
+* Crawl has been tested with Xcode 2.4 under OS X 10.4.7 on both PPC
+ and Intel machines, but is likely to be buildable with earlier
+ versions.
+
+* Make sure Xcode is installed. Xcode should be available on the OS X
+ install DVD if you haven't already installed it.
+
+* Open the Xcode project (Crawl.xcodeproj) under the "source"
+ directory.
* Hit Build in Xcode.
-* The default build configuration, Release, will build a ppc/i386 Universal
- binary suitable for play on all OS X 10.3.9 or newer systems. The other build
- configurations are intended for development and may not result in a binary
- that can be distributed to others.
+* The default build configuration, Release, will build a ppc/i386
+ Universal binary suitable for play on all OS X 10.3.9 or newer
+ systems. The other build configurations are intended for development
+ and may not result in a binary that can be distributed to others.
* You can also use makefile.osx, which will run xcodebuild from the command line.
-* If you have Lua installed, you can add your lua headers and liblua library to
- the 'Crawl' target in the Xcode project, uncomment the '#define CLUA_BINDINGS'
- line in AppHdr.h, and rebuild to compile with Lua support.
-
+* If you have Lua installed, you can add your lua headers and liblua
+ library to the 'Crawl' target in the Xcode project, uncomment the
+ '#define CLUA_BINDINGS' line in AppHdr.h, and rebuild to compile
+ with Lua support.
-Building on Windows
--------------------
-NOTE: Building for Windows+MinGW on Windows 9x/ME may work, but we've not tested
-it. You may be better off using the DOS build instructions if you're on 9x/ME.
+Building on Windows (MinGW)
+---------------------------
-We've also not tested or updated the makefile for Borland C++. We strongly
-recommend using MinGW if possible.
+NOTE: You cannot build Windows binaries on Windows 9x/ME using the
+MinGW makefile supplied. If you're on 9x/ME, you can choose to use the
+Cygwin build instructions, or build a binary on a Windows NT/2k/XP
+system (the binary will run on 9x), or build a DOS binary.
-* Install MinGW from http://www.mingw.org. The MinGW 5.0.2 installer is best so
- you don't have to fiddle with individual packages (you can mess with the
- individual packages if you like to, of course). If you want to edit the level
- compiler, also get the flex and bison packages (available from the GnuWin32
- project on Sourceforge: http://gnuwin32.sourceforge.net/).
+* Install MinGW from http://www.mingw.org. The MinGW 5.0.2 installer
+ is best so you don't have to fiddle with individual packages (you
+ can mess with the individual packages if you like to, of course). If
+ you want to edit the level compiler, also get the flex and bison
+ packages (available from the GnuWin32 project on Sourceforge:
+ http://gnuwin32.sourceforge.net/).
* Make sure you have g++ and mingw32-make in your path.
@@ -150,8 +181,8 @@ recommend using MinGW if possible.
// #define CLUA_BINDINGS
and
// #define REGEX_PCRE
- Note that there are multiple // #define REGEX_PCRE lines in AppHdr.h - find
- the one in the Windows-specific section.
+ Note that there are multiple // #define REGEX_PCRE lines in AppHdr.h
+ - find the one in the Windows-specific section.
* If you have flex and bison, edit makefile.mgw and set DOYACC := y.
@@ -159,22 +190,39 @@ recommend using MinGW if possible.
LIB = -lwinmm -static -llua -lpcre
and build Crawl to include Lua and regex support.
-* When you're done, you should have crawl.exe under a "rel" subdirectory.
+* When you're done, you should have crawl.exe under a "rel"
+ subdirectory.
-Building on DOS
----------------
+Building on Windows (cygwin)
+----------------------------
+
+* Get Cygwin from http://www.cygwin.com/. When installing, ensure that
+ the following packages are selected: gcc, g++, make, flex, bison. If
+ you'd like to build from svn, install the svn client. You may also
+ want to install diff and patch if you'd like to apply third party
+ patches, or create your own.
+
+* Once Cygwin is installed, open a Cygwin bash shell (use the Start
+ menu, do not double-click bash.exe in Explorer). cd to the Crawl
+ source directory.
-* Install djgpp from http://www.delorie.com/djgpp/. Don't forget to include C++
- support when the Zip picker asks for what you want. You may also have to
- download GNU make as a separate package. It's important to follow the install
- instructions carefully, because bad installs can produce rather confusing
- error messages.
+* Follow the Linux build instructions to build Crawl.
+
+
+Building for DOS (djgpp)
+------------------------
+
+* Install djgpp from http://www.delorie.com/djgpp/. Don't forget to
+ include C++ support when the Zip picker asks for what you want. You
+ may also have to download GNU make as a separate package. It's
+ important to follow the install instructions carefully, because bad
+ installs can produce rather confusing error messages.
* Make sure gxx and make are in your PATH.
-* If you want to modify the level compiler, install the djgpp flex, bison and m4
- packages and set DOYACC := y in makefile.dos.
+* If you want to modify the level compiler, install the djgpp flex,
+ bison and m4 packages and set DOYACC := y in makefile.dos.
* cd to the Crawl source directory.
@@ -202,8 +250,9 @@ the source/dat directory.
If you're using one of the standard makefiles, the steps described in
this section are performed automatically:
-The level compiler source is in the source/util directory (levcomp.lpp and
-levcomp.ypp). The steps involved in building the level compiler are:
+The level compiler source is in the source/util directory (levcomp.lpp
+and levcomp.ypp). The steps involved in building the level compiler
+are:
* Run flex on levcomp.lpp to produce the levcomp.lex.cc lexer.
* Run bison on levcomp.ypp to produce the levcomp.tab.cc parser and
@@ -217,17 +266,19 @@ provided with the Crawl source distribution will use these
pre-generated files automatically if flex/bison is not available.
*****************************************************************************
-Optional Libraries
-------------------
+Optional Libraries (Lua and PCRE)
+---------------------------------
Lua
---
-NOTE: When linking in Lua, the makefile LIB line usually looks like this:
+
+NOTE: When linking in Lua, the makefile LIB line usually looks like
+this:
LIB = -llua
-If you're using Lua older than 5.1, though, the Lua library comprises of *two*
-libraries: liblua and liblualib (yes, confusing), so you need
+If you're using Lua older than 5.1, though, the Lua library comprises
+of *two* libraries: liblua and liblualib (yes, confusing), so you need
LIB = -llua -llualib
@@ -235,35 +286,55 @@ This also depends on how you install Lua - some package management
systems build just the plain old liblua.so even for pre 5.1 Lua. If in
doubt, try both "-llua -llualib" and "-llua".
-On many Linuxes, the package management system installs Lua libraries
-including the version number, so the linker option becomes something
-like:
+On many Linuxes (Debian, for instance), the package management system
+installs Lua libraries including the version number, so the linker
+option becomes something like:
LIB = -llua50
+Lua include path:
+
+On Unix, Lua headers may be installed in /usr/include (unlikely), or
+in a subdirectory of /usr/include (such as /usr/include/lua50/). If
+the headers are in a subdirectory, you need to add this directory to
+the include path in your makefile.unix:
+
+INCLUDES = -I/usr/include/ncurses -I/usr/include/lua50
+
+On other platforms, the Lua headers should usually be installed in
+your compiler's include directory, or a subdirectory. If it's in a
+subdirectory, you'll need to add the full directory path to your
+includes line.
+
+
Getting Lua:
-On Unixes your package management system is the best way to get Lua. Make
-sure to install the development headers and not just the naked library.
+On Unixes your package management system is the best way to get Lua.
+Make sure to install the development headers and not just the naked
+library.
-On Windows, Lua binaries are available on luaforge.net. You should find links to
-get binaries from www.lua.org.
+On Windows, Lua binaries are available on luaforge.net. You should
+find links to get binaries from www.lua.org.
-On DOS, you get the joy of compiling Lua yourself. It's not hard, and you can
-use the existing Windows support in the Lua makefiles with some minor
-modifications, but you may be better served using the official Crawl Stone Soup
-binaries if you want Lua with your Crawl and don't want to compile Lua.
+On DOS, you get the joy of compiling Lua yourself. It's not hard, and
+you can use the existing Windows support in the Lua makefiles with
+some minor modifications, but you may be better served using the
+official Crawl Stone Soup binaries if you want Lua with your Crawl and
+don't want to compile Lua.
PCRE
----
-On Unixes, you're better served by the existing POSIX regular expression
-support. If you want PCRE, your package management system is again your best
-bet. Remember to install development headers, not just the plain library.
+
+On Unixes, you're better served by the existing POSIX regular
+expression support. If you want PCRE, your package management system
+is again your best bet. Remember to install development headers, not
+just the plain library.
On Windows, PCRE binaries are available from
http://gnuwin32.sourceforge.net/packages/pcre.htm
-On DOS you get the joy of building PCRE yourself. It's a little more annoying
-than building Lua (you have to roll your own makefile), but not by much.
+On DOS you get the joy of building PCRE yourself. It's a little more
+annoying than building Lua (you have to roll your own makefile), but
+not by much.
diff --git a/crawl-ref/docs/crawl_options.txt b/crawl-ref/docs/crawl_options.txt
index 549c2c4e5c..4b264d8df3 100644
--- a/crawl-ref/docs/crawl_options.txt
+++ b/crawl-ref/docs/crawl_options.txt
@@ -260,7 +260,7 @@ autopickup_exceptions = <pickup-regex, >don't-pickup-regex, ...
autopickup_exceptions = decay, degeneration
You can use multiple autopickup_exceptions lines. Some examples:
- autopickup_exceptions = degeneration, decay, confusion,
+ autopickup_exceptions = degeneration, decay, potions? of confusion,
autopickup_exceptions = potions? of slowing, potions? of paralysis
autopickup_exceptions = potions? of strong poison,potions? of poison
autopickup_exceptions = inaccuracy
@@ -524,7 +524,9 @@ explore_stop = items,stairs,shops,altars
runrest_ignore_message = <string>
This only works if runrest.lua has been sourced already in init.txt.
Any message containing the string will *not* stop your run. E.g.
- runrest_ignore_message = prayer ends
+ runrest_ignore_message = offer a prayer,prayer is over
+ runrest_ignore_message = pleased with you,exalted
+ (useful in conjunction with autoprayer.)
runrest_ignore_poison = <poison damage>:<minimum hp>
This only works if runrest.lua has been sourced already in init.txt.
@@ -724,6 +726,8 @@ message_colour = <colour>:[<channel>:]<regex>
message_colour = yellow:LOW HITPOINT WARNING
You can also narrow the message match to a specific channel:
message_colour = lightred:god:xom
+ If you don't want to see a message at all, you can mute it:
+ message_colour = mute:You start resting
increasing_skill_progress = true
This affects the appearance of the skills screen ('m'). With the
diff --git a/crawl-ref/source/AppHdr.h b/crawl-ref/source/AppHdr.h
index 511013e01d..8bad5c10e4 100644
--- a/crawl-ref/source/AppHdr.h
+++ b/crawl-ref/source/AppHdr.h
@@ -225,6 +225,8 @@
// Record where players are currently.
#define DGL_WHEREIS
+ // Uses <playername>-macro.txt as the macro file if uncommented.
+ // #define DGL_NAMED_MACRO_FILE
// Uses Options.macro_dir as the full path to the macro file. Mutually
// exclusive with DGL_NAMED_MACRO_FILE.
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc
index 01eb25959d..98090b2818 100644
--- a/crawl-ref/source/abl-show.cc
+++ b/crawl-ref/source/abl-show.cc
@@ -955,7 +955,9 @@ bool activate_ability(void)
break;
case ABIL_TSO_SMITING:
- cast_smiting( (2 + skill_bump(SK_INVOCATIONS)) * 6 );
+ if (your_spells( SPELL_SMITING, (2 + skill_bump(SK_INVOCATIONS)) * 6,
+ false ) == SPRET_ABORT)
+ return (false);
exercise( SK_INVOCATIONS, (coinflip()? 3 : 2) );
break;
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index d293ea9066..d083f087c8 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -2873,9 +2873,6 @@ static bool initialise(void)
cio_init();
- // Load macros
- macro_init();
-
// system initialisation stuff:
textbackground(0);
@@ -2891,6 +2888,9 @@ static bool initialise(void)
if (!newc)
restore_game();
+
+ // Load macros
+ macro_init();
game_has_started = true;
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index c9c77dbb2a..1cf809f8e5 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -540,7 +540,7 @@ static void zappy( char z_type, int power, struct bolt &pbolt )
pbolt.colour = LIGHTMAGENTA;
pbolt.range = random2(5) + 8;
pbolt.damage = dice_def( 1, 3 + power / 5 ); // 25: 1d8
- pbolt.hit = 1500; // hits always
+ pbolt.hit = AUTOMATIC_HIT; // hits always
pbolt.type = SYM_ZAP;
pbolt.flavour = BEAM_MMISSILE; // unresistable
pbolt.obvious_effect = true;
@@ -1292,8 +1292,11 @@ void fire_beam( struct bolt &pbolt, item_def *item )
if ( pbolt.chose_ray )
ray = pbolt.ray;
else
+ {
+ ray.fullray_idx = -1; // to quiet valgrind
find_ray( pbolt.source_x, pbolt.source_y,
pbolt.target_x, pbolt.target_y, true, ray);
+ }
if ( !pbolt.aimed_at_feet )
ray.advance();
@@ -1572,6 +1575,15 @@ int mons_adjust_flavoured( struct monsters *monster, struct bolt &pbolt,
}
break;
+ case BEAM_ACID:
+ if (mons_res_acid(monster))
+ {
+ if (doFlavouredEffects)
+ simple_monster_message(monster, " appears unharmed.");
+
+ hurted = 0;
+ }
+ break;
case BEAM_POISON:
if (mons_res_poison(monster) > 0)
@@ -3800,10 +3812,16 @@ static int affect_monster_enchantment(struct bolt &beam, struct monsters *mon)
if (mons_holiness(mon) != MH_NATURAL) // no unnatural
return (MON_UNAFFECTED);
+ // Cold res monsters resist hibernation (for consistency
+ // with mass sleep).
+ if (mons_res_cold(mon) > 0)
+ return (MON_UNAFFECTED);
+
if (simple_monster_message(mon, " looks drowsy..."))
beam.obvious_effect = true;
mon->behaviour = BEH_SLEEP;
+ mon->add_ench(ENCH_SLEEPY);
mon->add_ench(ENCH_SLEEP_WARY);
return (MON_AFFECTED);
diff --git a/crawl-ref/source/chardump.cc b/crawl-ref/source/chardump.cc
index ab31941d55..3319e307ad 100644
--- a/crawl-ref/source/chardump.cc
+++ b/crawl-ref/source/chardump.cc
@@ -549,18 +549,9 @@ static void sdump_religion(const std::string &, std::string & text)
if (!player_under_penance())
{
- if (you.religion != GOD_XOM)
- { // Xom doesn't care
- text += god_name(you.religion);
- text += " is ";
- text += ((you.piety <= 5) ? "displeased" :
- (you.piety <= 20) ? "noncommittal" :
- (you.piety <= 40) ? "pleased with you" :
- (you.piety <= 70) ? "most pleased with you" :
- (you.piety <= 100) ? "greatly pleased with you" :
- (you.piety <= 130) ? "extremely pleased with you"
- : "exalted by your worship");
- text += ".";
+ if (you.religion != GOD_XOM) // Xom doesn't care
+ {
+ text += god_prayer_reaction();
text += "\n";
}
}
diff --git a/crawl-ref/source/dat/splev.des b/crawl-ref/source/dat/splev.des
index e833e32cd7..fd5725fb40 100644
--- a/crawl-ref/source/dat/splev.des
+++ b/crawl-ref/source/dat/splev.des
@@ -188,14 +188,15 @@
# does the same thing - whitespace is not significant.
# SUBST: ? = T:20 U V
# makes T twice as likely to be used as U or V (the default weight
-# is 10). Note that there has to be at least one space after T:20
-# and that whitespace in T:20 is not permitted.
+# is 10). Note that there has to be at least one space before and after
+# T:20 and that whitespace in T:20 is not permitted.
# SUBST: ? : TUV
# replaces occurrences of ? with one of TUV, and guarantees that all
# occurrences of ? will get the same replacement symbol.
-# The placeholder symbol can be any non-space, printable character apart from
-# : and =. The replacement symbols can be any non-space printable character,
-# including : and = ("SUBST: ? = +=:123def" is valid).
+#
+# The placeholder and replacement symbols can be any non-space, printable
+# character, including : and =, apart from commas - "SUBST: = = +=:123def" is
+# valid.
#
# SUBST: lines can safely replace symbols with themselves:
#
@@ -1156,18 +1157,13 @@ KFEAT: Z = weight:2 teleport trap / .
KFEAT: z = teleport trap
MONS: naga / nothing, greater naga / nothing, guardian naga / nothing
MONS: naga warrior / nothing, naga mage / nothing
-SHUFFLE: 123
-SHUFFLE: 45
-SUBST: ' : ' x
-SUBST: " : " x
+SUBST: ':'x, ":"x
SUBST: ' = .:250 1 2 3 4:15 5:5
SUBST: " = .:250 1 2 3 4:5 5:15
-SUBST: X = x c + .
-SUBST: Y = x c +
-SUBST: T : T U V .:30 b
-SUBST: _ : ! .
-SUBST: ! : ! . x
-SUBST: ! = x .:2
+SUBST: X=xc.+, Y=xc+
+SUBST: T : T U V .:30 b
+SUBST: _:.!, !:!.x, !=x .:2
+SHUFFLE: 123, 45
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -1210,40 +1206,40 @@ ENDMAP
############################################################################
# snake_pit
+# now slightly randomised (dp) - changes welcome
-NAME: snake_pit
-PLACE: Snake:5
+NAME: snake_pit
+PLACE: Snake:5
ORIENT: southwest
-
-# Rotation makes this look really bad if the console font is not square.
-FLAGS: no_rotate
-
-# Hey, this looks a bit like a face ...
-
+FLAGS: no_rotate
+MONS: greater naga / nothing, naga, naga mage / nothing, naga warrior / nothing
+SUBST: c = c .:1
+SUBST: v = v .:1
+SUBST: v = x
MAP
xxxxxxxxxxxxxxxxxxxxxxx..@.xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxx.............xxxxxxxx
-xxxxxxxxxxxxxx....x.............x..xxxxx
-xxxxxxxxxxxx....2.x.............x.2..xxx
-xxxxxxxxxxx.....2.x....x.....x..x..3.xxx
-xxxxxxxxxxx.....22x.............xx.2..xx
-xxxxxxxxxxx.......xx..x........xx..3..xx
-xxxxxxxxxx.....x23.xx....T...xxx.44...xx
-xxxxxxxxxx......4.4.x.........x.333....x
-xxxxxxxxxx......3.x4...x.......4x4.....x
-xxxxxxxxxx.......3.......x.............x
-xxxxxxxxxx..c......3.........x.......c.x
-xxxxxxxxx...cc...................3..cc.x
-xxxxxxxxx...cc..........4.4.........cc.x
-xxxxxxxxx...cc...3...x........2.....cc.x
+xxxxxxxxxxxxxx....v.............v..xxxxx
+xxxxxxxxxxxx....2.v.............v.2..xxx
+xxxxxxxxxxx.....2.v....v.....v..v.33.xxx
+xxxxxxxxxxx.....22v.............vv.2..xx
+xxxxxxxxxxx.......vv..v........vv.33..xx
+xxxxxxxxxx.....x233vv....T...vvv4444..xx
+xxxxxxxxxx......4444v.........v.333....x
+xxxxxxxxxx......33v4...v.......4x4.....x
+xxxxxxxxxx.......334.....v.....4333....x
+xxxxxxxxxx..c......3.3..4.4..v.......c.x
+xxxxxxxxx...cc.....1...1.1.1...133..cc.x
+xxxxxxxxx...cc....3.....4.4.........cc.x
+xxxxxxxxx...cc...3...v........2.....cc.x
xxxxxxxxx...cc.........1...1.......cc..x
xxxxxxxxxx..cc.....1.....1.....1..ccc.xx
-xxxxxxxxxx...ccc..................cc..xx
+xxxxxxxxxx...ccc......3333333.....cc..xx
xxxxxxxxxx....cccc....3333333.....cc..xx
-xxxxxxxxxx.....ccccccc...........cc...xx
-xxxxxxxxxx........cccccccO...ccccc....xx
+xxxxxxxxxx.....cccccc............cc...xx
+xxxxxxxxxx........ccccc..O....cccc....xx
xxxxxxxxxxx........cccccccccccccc....xxx
-xxxxxxxxxxx.........cccccccccccc.....xxx
+xxxxxxxxxxx..........ccccccccccc.....xxx
xxxxxxxxxxxxx.......................xxxx
xxxxxxxxxxxxxxxx..................xxxxxx
xxxxxxxxxxxxxxxxxxxxx.......xxxxxxxxxxxx
@@ -1257,17 +1253,27 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
-MONS: greater naga, naga, naga mage, naga warrior
-MONS: random, random, random
############################################################################
# elf_hall
+# now slightly randomised (dp) - changes welcome
-NAME: elf_hall
-PLACE: Elf:7
-ORIENT: northwest
-FLAGS: no_rotate
-
+NAME: elf_hall
+PLACE: Elf:7
+ORIENT: northwest
+FLAGS: no_rotate
+MONS: deep elf high priest, deep elf demonologist, deep elf annihilator
+MONS: deep elf sorcerer, deep elf death mage
+SUBST: 1=1., 2=2., 3=3., 4=4., 5=5.
+SHUFFLE: 23, 45
+KMONS: $ = weight:450 nothing / deep elf sorcerer / deep elf annihilator
+KMONS: * = weight:300 nothing / deep elf annihilator / deep elf death mage
+KMONS: | = weight:600 nothing / deep elf demonologist / deep elf death mage
+SUBST: v = v .:2
+SUBST: v : xvb
+SUBST: | = | *:2
+SUBST: $ = $:20 *:4 |:1
+SUBST: * = * |:3
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -1281,36 +1287,32 @@ xxxxxxxxxxxxxxxxxcc*|*|*|**|||||c$ccxxxx
xxxxxxxxxxxxxxxxcc*$*|*|*|*|||||c$$ccxxx
xxxxxxxxxxxxxxxcc*$|*$***$$|||||c|$$ccxx
xxxxxxxxxxxxxxcc*$*|**ccccccccccc$$$$ccx
-xxxxxxxxxxxxxxc*|*$*$ccc.....2..c+$|$$cx
+xxxxxxxxxxxxxxc*|*$*$ccc..2..2..c+$|$$cx
xxxxxxxxxxxxxxc$*$*ccc...........c$$$$cx
-xxxxxxxxxxxxxxc||**cc...5.......4cc$|$cx
-xxxxxxxxxxxxxxc*$$cc........3..ccccccccx
+xxxxxxxxxxxxxxc||**cc...5.5...4.4cc$|$cx
+xxxxxxxxxxxxxxc*$$cc..3.....3..ccccccccx
xxxxxxxxxxxxxxc$+ccc.....2....cc.....5cx
-xxxxxxxxxxxxxxc$c....5.......cc.......cx
+xxxxxxxxxxxxxxc$c....5.....5.cc....5..cx
xxxxxxxxxxxxxxccc......5....cc..2....ccx
-xxxxxxxxxxxxxxxxc..........cc.......ccxx
-xxxxxxxxxxxxxxxcc..1..U..........4..ccxx
+xxxxxxxxxxxxxxxxc....5...2.cc.......ccxx
+xxxxxxxxxxxxxxxcc..1..U.....3.4..4..ccxx
xxxxxxxxxxxxxxcc.....................ccx
-xxxxxxxxxxxxxxc...........3...........cx
-xxxxxxxxxxxxxxc.......2.......3.......cx
+xxxxxxxxxxxxxxc..2........3........5..cx
+xxxxxxxxxxxxxxc.......2..2....3.......cx
xxxxxxxxxxxxxxc..2................2..5cx
-xxxxxxxxxxxxxxc......x.........x......cx
-xxxxxxxxxxxxxxc.....xx.........xx.....cx
-xxxxxxxxxxxxxxc2...xxx....1....xxx.4..cx
-xxxxxxxxxxxxxxc..xxxx...........xxxx..cx
-xxxxxxxxxxxxxxc.xxx.....cc.cc.....xxx.cx
-xxxxxxxxxxxxxxc.x.....cccc.cccc.....x.cx
-xxxxxxxxxxxxxxc.3...cccxxc.cxxccc.3...cx
+xxxxxxxxxxxxxxc......v.........v..2...cx
+xxxxxxxxxxxxxxc..2..vv..1...1..vv.....cx
+xxxxxxxxxxxxxxc2...vvv....1....vvv.4.4cx
+xxxxxxxxxxxxxxc..vvvv...........vvvv..cx
+xxxxxxxxxxxxxxc.vvv.....cc.cc.....vvv.cx
+xxxxxxxxxxxxxxc.v.3...cccc.cccc.3...v.cx
+xxxxxxxxxxxxxxc.3...cccxxc.cxxccc.3.3.cx
xxxxxxxxxxxxxxc...cccxxxxc.cxxxxccc...cx
xxxxxxxxxxxxxxc.cccxxxxxxc.cxxxxxxccc.cx
xxxxxxxxxxxxxxcccxxxxxxxxc.cxxxxxxxxcccx
xxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxxxxxxxxx
ENDMAP
-MONS: deep elf high priest, deep elf demonologist
-MONS: deep elf annihilator, deep elf sorcerer
-MONS: deep elf death mage
-MONS: random, random
############################################################################
## alternative elf halls: gauntlets (David)
@@ -1400,9 +1402,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ~ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce**|||**eccccccce%*%%%*%ec$$ccccxc
@@ -1444,9 +1444,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce%*%%%%%ecccccc=e**|||**ec$$ccccxc
@@ -1488,9 +1486,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce%%%%%*%eccccccce**|||**ec$$=cccxc
@@ -1532,9 +1528,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce%*%%%%%eccccccce**|||**ec$$ccccxc
@@ -1576,9 +1570,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$cd%%%%%%%dc==c===e%%%%%%%ec$$ccccxc
@@ -1620,9 +1612,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce%%%%%%%eccccccce**|||**ec$$ccccxc
@@ -1664,9 +1654,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$cd|*|||**dcccccccd*||*|**dc$$ccccxc
@@ -1708,9 +1696,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$ce*|||||*ec==ccc=e*|||||*ec$$ccccxc
@@ -1752,9 +1738,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxcccc$$=e**|||**eccccccce%%|%|%%e=$$ccccxc
@@ -1796,9 +1780,7 @@ MONS: deep elf death mage
MONS: deep elf conjurer / deep elf fighter / deep elf summoner / deep elf knight / nothing
MONS: curse skull / curse toe
SUBST: ~ = ^ .:30
-SUBST: ! = 1 5
-SUBST: ? = . ?
-SUBST: ? : 2 3
+SUBST: !=15, ?=.?, ?:23
MAP
ccccccccccccccccccccccccccccccccccccccccccc
cxccc====ccccc=======cccc====ccccccccccccxc
@@ -1830,78 +1812,80 @@ ENDMAP
##############################################################################
# slime_pit
-
-NAME: slime_pit
-PLACE: Slime:$
-ORIENT: encompass
-
-# Slime pit take is reduced pending an increase in difficulty of this
-# subdungeon. -- bwr
-
-MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..xxxx.........xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx....................xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxx......................xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxx..........................x.xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxx............................xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxx.............................xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxx.................................xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxx..................................xxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxx....(................................xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxx......................................xxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxx..........................................xxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxx..........................................xxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxx............................................xxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxx............................................xxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxx.....................ccc..ccc............]......xxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxx...................cccc2ccccc...................xxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxx...................cc*cc..cc*cc....................xxxxxxxxxxxxxxx
-xxxxxxxxxxxxxx..................cc***cc4c***cc..................xxxxxxxxxxxxxxxx
-xxxxxxxxxxxxx..................cc*|*cc..cc*|*cc..................xxxxxxxxxxxxxxx
-xxxxxxxxxxxxx.................cc*|P|*c4cc*|P|*cc.................xxxxxxxxxxxxxxx
-xxxxxxxxxxxxx.................cc**|*cc..cc*|**cc....................xxxxxxxxxxxx
-xxxxxxxxxxxx..................ccc**c|cc4c|c**ccc...................xxxxxxxxxxxxx
-xxxxxxxxxxxx..................cccccccc..cccccccc....................xxxxxxxxxxxx
-xxxxxxxxxxx...................c.4.c.4.1..4.c.4.c.....................xxxxxxxxxxx
-xxxxxxxxxxx...................2.c.4.c..3.c.4.c.2.....................xxxxxxxxxxx
-xxxxxxxxxxx..........)........cccccccc..cccccccc.....................xxxxxxxxxxx
-xxxxxxxxxxx...................ccc**c|cc4c|c**ccc.....................xxxxxxxxxxx
-xxxxxxxxxx....................cc**|*cc..cc*|**cc....................xxxxxxxxxxxx
-xxxxxxxxxx....................cc*|P|*c4cc*|P|*cc....................xxxxxxxxxxxx
-xxxxxxxxxx.....................cc*|*cc..cc*|*cc....................xxxxxxxxxxxxx
-xxxxxxxxxxx.....................cc***cc4c***cc.....................xxxxxxxxxxxxx
-xxxxxxxxxxxx.....................cc*cc..cc*cc......................xxxxxxxxxxxxx
-xxxxxxxxxxxxx.....................cccc2ccccc......................xxxxxxxxxxxxxx
-xxxxxxxxxxxxxx.....................ccc..ccc.......................xxxxxxxxxxxxxx
-xxxxxxxxxxxxxx...........................................[.........xxxxxxxxxxxxx
-xxxxxxxxxxxxx......................................................xxxxxxxxxxxxx
-xxxxxxxxxxxxx..............................................xxxxx...xxxxxxxxxxxxx
-xxxxxxxxxxxxxx...........................................xxxxxxxx.xxxxxxxxxxxxxx
-xxxxxxxxxxxxxx..........................................xxxxxxxxx.xxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxx........................................xxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxx.........................................xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxx.......................................xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxx......................................xxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxx......................................xxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx.....................................xxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx.............................}......xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxx.................................xxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxx..............................xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxx..............................xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxx............................xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxx...........{........xxx..xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx................xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.........xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# now slightly randomised (dp) - changes welcome
+
+NAME: slime_pit
+PLACE: Slime:$
+ORIENT: encompass
+MONS: royal jelly, acid blob, great orb of eyes / nothing
+SUBST: ' : ' .:1, ' : ' x:1, ' = .x
+SUBST: " : " .:3, " = .c
+SHUFFLE: ([{
+# of what use are the exits?
+MAP
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''xxxx''''...''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxx'''..'''''........'''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxx'.....................'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxx'.......................''x'xxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxx'..........................'.xxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxx'............................'xxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxx'.............................'''xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxx'...............................''xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx''..(..............................''xxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxx'''....................................''xxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxx'.........................................'xxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxx''.........................................'xxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx'...........................................'xxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxx''xx'..........................................'xxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxx'..''................""""."""""...........]....''xxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxx'x.................."cccc2ccccc".................'xxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxx'.'................"cc*cc..cc*cc".................''xxxxxxxxxxxxxxx
+xxxxxxxxxxxxx'................."cc***cc4c***cc".................xxxxxxxxxxxxxxxx
+xxxxxxxxxxxxx'................"cc*|*cc..cc*|*cc"................'xxxxxxxxxxxxxxx
+xxxxxxxxxxxx''..............."cc*|P|*c4cc*|P|*cc"...............'xxxxxxxxxxxxxxx
+xxxxxxxxxxxx'................"cc**|*cc..cc*|**cc"................'''xxxxxxxxxxxx
+xxxxxxxxxxxx'................"ccc**c|cc4c|c**ccc"..................xxxxxxxxxxxxx
+xxxxxxxxxxx'................."cccccccc.3cccccccc"..................'xxxxxxxxxxxx
+xxxxxxxxxxx'................."c.4.c.4.1..4.c.4.c"..................''xxxxxxxxxxx
+xxxxxxxxxxx'..................2.c.4.c....c.4.c.2....................'xxxxxxxxxxx
+xxxxxxxxxx'..........)......."cccccccc3.cccccccc"...................'xxxxxxxxxxx
+xxxxxxxxxx'.................."ccc**c|cc4c|c**ccc"...................'xxxxxxxxxxx
+xxxxxxxxxx'.................."cc**|*cc..cc*|**cc"..................'xxxxxxxxxxxx
+xxxxxxxxx'..................."cc*|P|*c4cc*|P|*cc"..................'xxxxxxxxxxxx
+xxxxxxxxx''..................."cc*|*cc..cc*|*cc"..................'xxxxxxxxxxxxx
+xxxxxxxxxxx'..................."cc***cc4c***cc"...................'xxxxxxxxxxxxx
+xxxxxxxxxxxx'..................."cc*cc..cc*cc"....................'xxxxxxxxxxxxx
+xxxxxxxxxxxx'...................."cccc2ccccc"....................'xxxxxxxxxxxxxx
+xxxxxxxxxxxxx'...................."""".""""".....................'xxxxxxxxxxxxxx
+xxxxxxxxxxxxx'...........................................[........'xxxxxxxxxxxxx
+xxxxxxxxxxxx''..............................................'''....'xxxxxxxxxxxx
+xxxxxxxxxxxx'.............................................''xxx''.'xxxxxxxxxxxxx
+xxxxxxxxxxxxx'..........................................''xxxxxxx.xxxxxxxxxxxxxx
+xxxxxxxxxxxxx'''.......................................'xxxxxxxxx.xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx'......................................'xxxxxxxxx'xxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxx'.......................................'xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxx''.....................................'xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxx'.....................................'xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxx''....................................'xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxx'...................................'xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxx'............................}......'xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx''................................'xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxx'.............................''xxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxx'.............................'xxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxx'......................''...'xxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxx'''''........{.......'xx'..xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'''............'xxxx''xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''....'....'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''''x...''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx''''xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -1911,9 +1895,6 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
-MONS: royal jelly, acid blob, great orb of eyes
-MONS: random, random, random, random
-
##############################################################################
# The Hall of Blades
@@ -1921,7 +1902,8 @@ MONS: random, random, random, random
NAME: hall_of_blades
PLACE: Blade
ORIENT: north
-
+MONS: dancing weapon
+SHUFFLE: cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -1961,8 +1943,6 @@ xxxxxxxxcccc.............................cccccccccccccccccccccccccccccccxxxxxxxx
xxxxxxxxcccccccccccccccccccccccccccccc.@.cccccccccccccccccccccccccccccccxxxxxxxx
ENDMAP
-MONS: dancing weapon
-MONS: random, random, random, random, random, random
##############################################################################
# hall_of_Zot
@@ -2504,35 +2484,37 @@ MONS: random, random
#############################################################################
# Swamp:5
+# now slightly randomised (dp) - changes welcome
-NAME: swamp
-PLACE: Swamp:5
-ORIENT: southeast
-FLAGS: no_rotate
-
+NAME: swamp
+PLACE: Swamp:5
+ORIENT: southeast
+FLAGS: no_rotate
+MONS: swamp dragon / nothing, swamp drake / nothing, hydra / nothing
+SHUFFLE: 12
+SUBST: ' = xc
# NB - most of the 'x's here will be set to water in dungeon.cc
-
MAP
xxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx2xxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxx2xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxx2x.xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxx2x2xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxcc.ccxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxcc...ccxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxcc3.2..ccxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxcc.1.3.2.ccxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxccc....1.1cccxxxxxxxxxxxxxxxxxxxxxx
-xxxxxcc.1.32....ccxxxxxxxxxxxxxxxxxxxxxx
-xxxxxcc...3..1.3ccxxxxxxxxxxxxxxxxxxxxxx
-xxxxxcc2.1.3..2.ccxxxxxxxxxxxxxxxxxxxxxx
-xxxxxccc33..1..cccxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxcccc3O3ccccxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxcccccccccxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxcccccccxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxcccxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxcc3.2ccxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxx'c3.2.3c'xxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxx'c11.3322c''xxxxxxxxxxxxxxxxxxxxxx
+xxxxx'cc...21.1cccxxxxxxxxxxxxxxxxxxxxxx
+xxxxx'c.13321.1.cc'xxxxxxxxxxxxxxxxxxxxx
+xxxx'cc31333.113cc'xxxxxxxxxxxxxxxxxxxxx
+xxxx'cc22113.223ccxxxxxxxxxxxxxxxxxxxxxx
+xxxxx'cc3333113cc'xxxxxxxxxxxxxxxxxxxxxx
+xxxxx'cccc3O3ccc'xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxx'cccccccc'xxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxx''ccccc'xxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxx''cc'xxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxx'xxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -2549,8 +2531,37 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
-MONS: swamp dragon, swamp drake, hydra
-MONS: random, random, random, random
+#############################################################################
+# Swamp:5 alternative (dp)
+
+NAME: swamp_alternative
+PLACE: Swamp:5
+ORIENT: float
+MONS: swamp dragon, swamp drake, hydra, firedrake
+ITEM: nothing
+SUBST: 1=1., 2=2., 3=3., 4=4.
+SHUFFLE: Od, 123
+SUBST: l=l .:2, '=.x, "=cx, _=c.
+# NB - most of the 'x's here will be set to water in dungeon.cc
+MAP
+xxx@xxxxxxx@xxxxxxxxxxx
+xxx1'xxxxxxx2'xxxxxxxxx
+xxxx1xxxxxx2'xxxxxxxxxx
+xxxx.xxxxxx.xxxxxxxxxxx
+xx'2x3.x''3xxxxxxxxxxxx
+xx''x"c..1""""xxxxxxxxx
+xxxx""c".ccccc""xxx'3xx
+xxx"cc_.2lll.ccc""2.'3x
+xx"cc..33ll..2._c1'xxx@
+x"cc.1..lll...1..""xxxx
+x"c....llllll.1.2c"xxxx
+x"cc..l4llllll..cc"xxxx
+xx"ccll.llll.4lcc"xxxxx
+xxx"cccO.lld.ccc"xxxxxx
+xxxx""cccccccc""xxxxxxx
+xxxxxx""""""""xxxxxxxxx
+ENDMAP
+
##############################################################################
# Portal vaults
@@ -2590,7 +2601,7 @@ NAME: david_orc_1_choice
TAGS: orc_entry
MONS: orc, warg / orc priest / orc warrior, orc warrior / orc
ITEM: % / scroll of teleport / scroll of remove curse / scroll of identify
-ITEM: % / weight:2 * / scroll of blinking / scroll of recharging / scroll of fear
+ITEM: % / w:2 * / scroll of blinking / scroll of recharging / scroll of fear
SHUFFLE: %1
ORIENT: float
MAP
@@ -2708,7 +2719,7 @@ NAME: david_orc_5
TAGS: orc_entry
ORIENT: float
KFEAT: C = altar of Yredelemnul / altar of Makhleb / altar of Trog
-MONS: orc priest, orc / weight:5 orc warrior / weight:1 orc knight
+MONS: orc priest / nothing, orc / w:5 orc warrior / w:1 orc knight
SUBST: x : cxv
SUBST: ( = ( .
SUBST: ) = ) .
@@ -2730,7 +2741,7 @@ NAME: erik_orc_1
TAGS: orc_entry
MONS: orc, orc priest/orc wizard, weight:50 orc warrior/ogre, swamp drake
# The drake's name is Bobby. Since you did ask.
-KITEM: 1 = sausage / nothing / animal skin / potion of confusion / potion of paralysis / potion of slowing / potion of degeneration / weight:2 potion of speed / weight:2 potion of might
+KITEM: 1 = sausage / nothing / animal skin / potion of confusion / potion of paralysis / potion of slowing / potion of degeneration / w:2 potion of speed / w:2 potion of might
ITEM: club, potion of confusion, slice of pizza, sausage / weight:40 nothing
ITEM: potion of confusion / potion of water
SHUFFLE: defO
@@ -2866,16 +2877,17 @@ MONS: weight:20 nothing / weight:30 human / necromancer / wizard
ORIENT: float
SHUFFLE: !=
SUBST: ! = x
+SUBST: ' : cxv
MAP
-xxxxx.@.xxxxx
-x...+...x...x
-x...x...x...x
-x!x=x111x...x
-@.x.x111+.O.x
-x.x.x111x...x
-x.x.x...x...x
-x.+.x...x...x
-xxxxx.@.xxxxx
+xxxxx.@.'''''
+x...+...'...'
+x...x...'...'
+x!x=x111'...'
+@.x.x111+.O.'
+x.x.x111'...'
+x.x.x...'...'
+x.+.x...'...'
+xxxxx.@.'''''
ENDMAP
##############################################################################
@@ -2927,7 +2939,7 @@ ENDMAP
NAME: david_vaults_4
TAGS: vault_entry
ORIENT: float
-SHUFFLE: 12345
+SHUFFLE: 123456
MONS: dragon / golden dragon / ice dragon / iron dragon / shadow dragon / storm dragon
MONS: freezing wraith / shadow wraith / wight / wraith
MONS: deep troll / iron troll / rock troll / troll
@@ -2935,13 +2947,8 @@ MONS: cyclops / ettin / fire giant / frost giant / hill giant / stone giant / ti
MONS: necromancer / shapeshifter / vault guard / wizard
MONS: nothing
MONS: shapeshifter / weight:30 nothing
-SUBST: 1 = 1 .
-SUBST: 2 = 2 .
-SUBST: 3 = 3 .
-SUBST: 4 = 4 .
-SUBST: 5 = 5 .
-SUBST: * : * % .
-
+SUBST: 1=.1, 2=.2, 3=.3, 4=.4, 5=.5, *:*.%
+SUBST: x : xcv
MAP
@..........@
.xxxxxxxxxx.
@@ -2985,7 +2992,7 @@ NAME: erik_vaults_1
TAGS: vault_entry
MONS: dancing weapon
ORIENT: float
-
+SHUFFLE: vc
MAP
.............
.............
@@ -3006,7 +3013,7 @@ NAME: erik_vaults_2
TAGS: vault_entry
MONS: vault guard
ORIENT: float
-
+SHUFFLE: vx
MAP
vvvvvv.vvvvvv
vvvvvv.vvvvvv
@@ -3036,17 +3043,17 @@ ENDMAP
#
NAME: david_lair_1
TAGS: lair_entry
-MONS: giant lizard, giant snail / elephant slug
-MONS: yak / weight:2 death yak, plant / fungus
+MONS: giant lizard / sheep, giant snail / elephant slug / nothing
+MONS: nothing / yak / weight:2 death yak, plant / fungus / w:20 nothing
SHUFFLE: 12
ORIENT: float
MAP
xxxx..@..xxxx
xx.........xx
-x...2...44..x
-...4..1......
+x..42...44..x
+..44..1......
@....1O3....@
-..........4..
+...4......4..
x...4..2....x
xx.........xx
xxxx..@..xxxx
@@ -3055,19 +3062,20 @@ ENDMAP
##############################################################################
# Shrubbed Lair entry
#
-NAME: david_lair_2
-TAGS: lair_entry
-MONS: plant, firedrake
+NAME: david_lair_2
+TAGS: lair_entry
+MONS: plant, firedrake
+SUBST: ' = 1.
ORIENT: float
MAP
xxxxxxxxxxxxx
xx111111111xx
-x112..111111x
-x11.O..111...
-x11...111...@
-x111111......
-x1..11......x
-xx.........xx
+x112.'111111x
+x11.O.'111''.
+x11'..111'..@
+x111111''....
+x1''11......x
+xx.''..'...xx
xxxx..@..xxxx
ENDMAP
@@ -3076,11 +3084,11 @@ ENDMAP
#
NAME: david_lair_3
TAGS: lair_entry
-MONS: weight:50 nothing / weight:30 giant slug / weight:30 giant snail
-MONS: weight:100 nothing / weight:40 yak / sheep / death yak
-MONS: weight:100 nothing / weight:20 giant iguana / weight:20 giant lizard / gila monster / komodo dragon
+MONS: w:50 nothing / w:30 giant slug / w:30 giant snail
+MONS: w:100 nothing / w:40 yak / sheep / death yak
+MONS: w:100 nothing / w:20 giant iguana / w:20 giant lizard / gila monster / komodo dragon
MONS: green rat / grey rat / orange rat / quokka / rat
-MONS: weight:90 nothing / weight:30 giant frog / blink frog / giant brown frog / spiny frog
+MONS: w:90 nothing / w:30 giant frog / blink frog / giant brown frog / spiny frog
SHUFFLE: 12345
ORIENT: float
MAP
@@ -3161,17 +3169,17 @@ ENDMAP
#
NAME: erik_lair_3
TAGS: lair_entry
-MONS: weight:50 troll / Snorg, weight:30 hound / jackal / weight:20 war dog
+MONS: w:50 troll / Snorg, w:30 hound / jackal / w:20 war dog
ORIENT: float
SUBST: ? = w.
MAP
-.@........ww?www?.....
+.@........wwwwww?.....
..?.?.?..wwwwwww.?..?.
..??w..wwwwwwwww?.??..
-...??w.wwwwwww??www?..
-...wwwwwwwwwwwwwww??..
-..wwwwww?wwwww2wwww..@
-..wwwwwwww....wwww???.
+...??w.wwwwwwww?www?..
+...wwww?wwwwwwwwww??..
+..wwwwww??w??w2wwww..@
+..wwwwww??....wwww???.
......1..2.2O2.wwww...
..?wwwww???2.2www.ww?.
.....wwww2..w.2www....
@@ -3187,8 +3195,8 @@ ENDMAP
#
NAME: erik_lair_4
TAGS: lair_entry
-MONS: steam dragon/mottled dragon/swamp drake
-MONS: weight:20 giant iguana/komodo dragon/giant gecko/giant lizard
+MONS: steam dragon / mottled dragon / swamp drake
+MONS: w:20 giant iguana / komodo dragon / giant gecko / giant lizard / nothing
FLAGS: no_rotate
SUBST: ? = x.c
SHUFFLE: %*RO
@@ -3196,9 +3204,9 @@ ORIENT: float
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxx?xxx?x?xx?x.2xx??xx?x*?xxx?.2.xxxx
+xxxxxxxxxxxxxxx?xxx?x?xx?x.2xx?xxx?x*?xxx?.2.xxxx
xxxxxxxxxxxxxxx.2.......?xx.x.?xxx?.??xxxx?x.?xxx
-xxxxxxxxxxxxx?....xxx...2....??????..??x?x..%xxxx
+xxxxxxxxxxxxx?....xxx...2....??????..????x..%xxxx
xx?xx???xxxxx..xx??xx??..........?...???..??x=.?x
@......xxx.2.xx?xxxxxx?x?x??.......1...2.x.xxx.?x
xxx?xxx...xxxxxxxxxxxx?xxxx.??.2...?......?xxx$xx
@@ -3267,7 +3275,7 @@ ENDMAP
# Hive monsters near stair
#
NAME: david_hive_2
-TAGS: hive_entry
+TAGS: hive_entry generate_awake
MONS: nothing / killer bee / killer bee larva
MONS: queen bee
ORIENT: float
@@ -3294,14 +3302,8 @@ MONS: killer bee larva / killer bee, queen bee
MONS: giant ant / soldier ant, queen ant
MONS: yellow wasp / nothing, red wasp / yellow wasp
MONS: bumblebee
-SHUFFLE: XY
-SHUFFLE: VW
-SHUFFLE: defgOR
-SHUFFLE: 34 / 56
-SUBST: V = =
-SUBST: W = a
-SUBST: X = =
-SUBST: Y = a
+SHUFFLE: XY, VW, defgOR, 34/56
+SUBST: V==, W=a, X==, Y=a
SUBST: ? = a .:20
SUBST: 1 : 1 7:2
SUBST: 7 = 7 .
@@ -3325,21 +3327,21 @@ ENDMAP
#
NAME: erik_hive_1
TAGS: hive_entry
-MONS: weight:200 bear/polar bear, grizzly bear, black bear
+MONS: w:200 bear / polar bear, grizzly bear, black bear
MONS: killer bee, queen bee, killer bee larva
ITEM: honeycomb, royal jelly
-SHUFFLE: 123
-SHUFFLE: deO
+SUBST: ? = a.
+SHUFFLE: 123, deO
ORIENT: float
MAP
.......................
-.............aaa.......
+............?aaa???....
...........aaa4aaaaa...
-...........a4e6d564a...
-......2....a6.4.4O6a...
-............a64aa4a....
-....1.......aaaaaa.....
-.......3...............
+..........?a4e6d564a?..
+......2...?a6?4?4O6a?..
+...........?a64?a4a....
+....1......?aaaaaa?....
+.......3.....????......
.......................
ENDMAP
@@ -3377,17 +3379,18 @@ ENDMAP
NAME: erik_hive_3
TAGS: hive_entry
MONS: killer bee larva, killer bee, queen bee, firedrake
-SUBST: l = l.
+SHUFFLE: UVWXYZ
+SUBST: l=.l, U==, V=a, W=a, X=a, Y=a, Z=a
ORIENT: float
MAP
..................
...aaaaa..........
..aaRa....a...a...
-..a2.a.aaa=.aa....
-.aa.1aaa.1aaa...a.
+..a2.Y.aaaX.aa....
+.aV.1aaa.1aaa...a.
..aa21.2O2aaa4.aa.
-...aaa2131aaaaa...
-..aaaaaRaaa..aa...
+...Zaa2131Waaaa...
+..aaaaaRaUa..aa...
..aa.4aaa.a...a...
.aa...aaa.aa......
.a..aaaa..........
diff --git a/crawl-ref/source/dat/tricky.des b/crawl-ref/source/dat/tricky.des
index 39a8a386b1..d8993fc894 100644
--- a/crawl-ref/source/dat/tricky.des
+++ b/crawl-ref/source/dat/tricky.des
@@ -190,17 +190,17 @@ NAME: lemuel_trickyentry_002_batcave
TAGS: entry
ORIENT: float
SHUFFLE: {[(
-MONS: giant bat
+MONS: giant bat / nothing
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x{x[x(xxxxxxxxxxx.........%xxxx
x.x.x.xxxxxxxx...............xx
-x.x.x.xxxxxx..................x
-x.x.x.xxxx....1.1.1.1.1......%x
+x.x.x.xxxxxx...1.1.1..........x
+x.x.x.xxxx....1.1.1.1.1.1....%x
x.x.x.xx.......1.1.1.1.1....%xx
-x.....+.......1.1.1.1.1.....%xx
+x.....+.......1.1.1.1.1.1...%xx
xxx.xxx........1.1.1.1.1....xxx
-xxx.xxxx.................xxxxxx
+xxx.xxxx..........1.1.1..xxxxxx
xxx.xxxxx.............xxxxxxxxx
@...xxxxxxx.......xxxxxxxxxxxxx
xxx.xxxxxxxxx...xxxxxxxxxxxxxxx
@@ -215,11 +215,8 @@ ENDMAP
NAME: lemuel_trickyentry_river
TAGS: entry no_monster_gen
ORIENT: float
-SHUFFLE: {[(
-SHUFFLE: ABC
-SUBST: A = =
-SUBST: B = x
-SUBST: C = x
+SHUFFLE: {[(, ABC
+SUBST: A:=, B:x, C:x
CHANCE: 1
MAP
xxxxxxxxxxxxxxxxxxx
@@ -277,8 +274,7 @@ NAME: david_trickyentry_002_a
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
CHANCE: 2
-SHUFFLE: {[(
-SHUFFLE: wWl
+SHUFFLE: {[(, wWl
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -301,8 +297,7 @@ NAME: david_trickyentry_002_b
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
CHANCE: 2
-SHUFFLE: {[(
-SHUFFLE: wWl
+SHUFFLE: {[(, wWl
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -325,8 +320,7 @@ NAME: david_trickyentry_002_c
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
CHANCE: 2
-SHUFFLE: {[(
-SHUFFLE: wWl
+SHUFFLE: {[(, wWl
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxx=.....=xxxx
@@ -349,8 +343,7 @@ NAME: david_trickyentry_002_d
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
CHANCE: 2
-SHUFFLE: {[(
-SHUFFLE: wWl
+SHUFFLE: {[(, wWl
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxx=.....=xxxx
@@ -373,8 +366,7 @@ NAME: david_trickyentry_002_e
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
CHANCE: 2
-SHUFFLE: {[(
-SHUFFLE: wWl
+SHUFFLE: {[(, wWl
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -424,42 +416,24 @@ ENDMAP
##############################################################################
# Evil foreboding
-NAME: david_trickyentry_004_a
+NAME: david_trickyentry_004
TAGS: entry no_monster_gen
-MONS: troll
+MONS: troll / w:40 giant bat
ORIENT: float
-CHANCE: 2
SHUFFLE: {[(<
+SUBST: ?:?.l, ?=l.
MAP
{...............[
-......lll........
-...lll.lll.......
-..l.llll.llll..l.
-...lll]..1lllll..
-..ll.ll...ll.....
-.....lll.ll......
-....ll.lll.......
+....?.lll?.......
+...lll?lll??.....
+..l.llll.llll?.l.
+..?lll]..1lllll?.
+.?ll?ll...ll.??..
+...?.lll.ll??....
+....ll.lll?......
<...............(
ENDMAP
-NAME: david_trickyentry_004_b
-TAGS: entry no_monster_gen
-MONS: giant bat
-ORIENT: float
-CHANCE: 8
-SHUFFLE: {[(<
-MAP
-{...............<
-......lll........
-...lll.lll.......
-..l.l.lllllll..l.
-...lll].11lllll..
-..ll.ll.11ll.....
-.....lll.ll......
-....ll.lll.......
-[...............(
-ENDMAP
-
##############################################################################
# The pits are prepared
@@ -540,19 +514,18 @@ ENDMAP
NAME: david_trickyentry_006
TAGS: entry
-MONS: weight:30 nothing / worm
-MONS: weight:30 nothing / ooze / weight:2 jelly
-MONS: weight:30 nothing / jackal / rat
+MONS: w:30 nothing / worm
+MONS: w:30 nothing / ooze / weight:2 jelly
+MONS: w:30 nothing / jackal / rat
FLAGS: no_rotate
ORIENT: float
SUBST: ?=Gx
-SHUFFLE: xc
-SHUFFLE: 123
+SHUFFLE: xc, 123
MAP
.................
.xxxxxxxxxxxxxxx.
-.x123132>332213x.
-.x2312132211321x.
+.x1231321332212x.
+.x2312132211323x.
.x3123213123132x.
.x?????G+G?????x.
.x.............x.
@@ -604,8 +577,7 @@ NAME: david_trickyentry_008
TAGS: entry
ITEM: nothing
ORIENT: float
-SHUFFLE: [{(
-SHUFFLE: GIcbv=
+SHUFFLE: [{(, GIcbv=, Iw, Gl
MAP
xxxxxxxxxxxxx
x[....{....(x
@@ -631,7 +603,7 @@ TAGS: entry no_monster_gen no_pool_fixup
FLAGS: no_rotate
CHANCE: 1
MONS: plant, plant / nothing
-ITEM: bread ration / weight:20 meat ration, weight:20 any food / nothing
+ITEM: bread ration / w:20 meat ration, w:20 any food / nothing
ORIENT: float
SHUFFLE: {[(
SHUFFLE: lw
@@ -666,14 +638,15 @@ ENDMAP
NAME: david_trickyentry_010
TAGS: entry no_monster_gen no_pool_fixup
MONS: nothing / hobgoblin / warg / war dog / hog / hound / wolf
-MONS: nothing / giant gecko / giant iguana / giant lizard / giant newt
-MONS: nothing / orc / generate_awake orc priest / generate_awake orc warrior / generate_awake orc wizard
-MONS: nothing / generate_awake brain worm / generate_awake lava worm / generate_awake swamp worm / worm
+MONS: giant gecko / giant iguana / giant lizard / giant newt
+MONS: orc / generate_awake orc priest / generate_awake orc warrior / generate_awake orc wizard
+MONS: generate_awake brain worm / generate_awake lava worm / generate_awake swamp worm / worm
ITEM: any food
ORIENT: float
-SHUFFLE: {[(
-SHUFFLE: lw
-SHUFFLE: 1234d
+SUBST: 2 = 2:40 .
+SUBST: 3 = 3:40 .
+SUBST: 4 = 4:40 .
+SHUFFLE: {[(, lw, 1234d
MAP
xxxxxx@xxxxxx
x...........x
@@ -786,12 +759,14 @@ ENDMAP
##############################################################################
# Being Mean Is Cool
-
+# (Has anyone a good guess on proper CHANCEs?)
+
NAME: erik_trickyentry_004_a
TAGS: entry
ORIENT: float
-CHANCE: 5
-ITEM: scroll of curse armour, scroll of teleportation
+CHANCE: 10
+ITEM: scroll of curse armour
+ITEM: scroll of teleportation
MAP
xxxxx
xxexx
@@ -803,15 +778,35 @@ ENDMAP
NAME: erik_trickyentry_004_b
TAGS: entry
ORIENT: float
-CHANCE: 5
-ITEM: scroll of curse armour / scroll of random uselessness / scroll of identify
-ITEM: scroll of curse armour / scroll of fear / scroll of teleportation
+CHANCE: 10
+ITEM: scroll of curse armour, scroll of random uselessness, scroll of identify
+ITEM: scroll of curse armour, scroll of fear, scroll of teleportation
+SHUFFLE: def, ghi
MAP
@.....@
.xx=xx.
-.xxexx.
-.=d{e=.
+.xxgxx.
+.=d{g=.
.xxdxx.
.xx=xx.
@.....@
ENDMAP
+
+NAME: erik_trickyentry_004_c
+TAGS: entry
+ORIENT: float
+CHANCE: 10
+SHUFFLE: uU / vV / wW / zZ
+SUBST: u==, v==, V=~, w=x, W=x, z==, Z=~.
+ITEM: scroll of curse armour, scroll of random uselessness, scroll of identify
+ITEM: scroll of curse armour, scroll of fear, scroll of teleportation
+KFEAT: U = teleport trap
+MAP
+xxxxxxx
+xZxxxWx
+xxzgwxx
+xxd{gxx
+xxudvxx
+xUxxxVx
+xxxxxxx
+ENDMAP
diff --git a/crawl-ref/source/dat/vaults.des b/crawl-ref/source/dat/vaults.des
index 0e1536f342..f9e60b91f6 100644
--- a/crawl-ref/source/dat/vaults.des
+++ b/crawl-ref/source/dat/vaults.des
@@ -188,14 +188,15 @@
# does the same thing - whitespace is not significant.
# SUBST: ? = T:20 U V
# makes T twice as likely to be used as U or V (the default weight
-# is 10). Note that there has to be at least one space after T:20
-# and that whitespace in T:20 is not permitted.
+# is 10). Note that there has to be at least one space before and after
+# T:20 and that whitespace in T:20 is not permitted.
# SUBST: ? : TUV
# replaces occurrences of ? with one of TUV, and guarantees that all
# occurrences of ? will get the same replacement symbol.
-# The placeholder symbol can be any non-space, printable character apart from
-# : and =. The replacement symbols can be any non-space printable character,
-# including : and = ("SUBST: ? = +=:123def" is valid).
+#
+# The placeholder and replacement symbols can be any non-space, printable
+# character, including : and =, apart from commas - "SUBST: = = +=:123def" is
+# valid.
#
# SUBST: lines can safely replace symbols with themselves:
#
@@ -434,11 +435,8 @@ NAME: lemuel_entry_005_b
TAGS: entry no_monster_gen
ORIENT: float
CHANCE: 5
-SHUFFLE: {[(
-SHUFFLE: XYZ
-SUBST: X = W
-SUBST: Y = w
-SUBST: Z = w
+SHUFFLE: {[(, XYZ
+SUBST: X=W, Y=w, Z=w
MAP
xxxxxxxxxxxxxxxxxxx
xxxxx{...(...[xxxxx
@@ -466,25 +464,26 @@ ENDMAP
NAME: lemuel_entry_006_tunnels
TAGS: entry no_monster_gen
ORIENT: float
+SUBST: ? = x.
SHUFFLE: {[(
MAP
xxxxxxxxxxxxxxxxxxx
x{xxxxxxxxxxxxxxxxx
-x..xxxxxxxxxxxx[xxx
-xx.xxxxxx(xxxxx...x
-xx..xxxx..xxxxxxx.x
-x...xx...xxxxxxxx.x
-x.xxx..xxxxxx.....x
-x..xx.xxxxxxx.xxxxx
-xx..x.xxxxxx..xxxxx
-xxx...xxxxx..xxxxxx
+x..xxxxxxxxxxxx[x?x
+xx.?xxxxx(xxxx?...x
+x?..xxxx..xxxx???.x
+x..?x?..?xxxx?x??.x
+x.?xx..xxxxx?.....x
+x.?xx.?xxxx?x.x???x
+xx..?.xxxx??..xxxxx
+xxx...?x??x..xxxxxx
xxxxx.xx....xxxxxxx
-xxxxx..x.xxxxxxxxxx
-xxxxxx.x.xxxxxxxxxx
-xxxxxx...xxxxxxxxxx
-xxxxxxxx.xxxxxxxxxx
-xxxxxxxx.xxxxxxxxxx
-xxxxxxxx...xxxxxxxx
+xxxxx..x.??xxxxxxxx
+xxxxxx.?.xxxxxxxxxx
+xxxxxx..??xxxxxxxxx
+xxxxxx?x.xxxxxxxxxx
+xxxxxxx?.?xxxxxxxxx
+xxxxxxxx..?xxxxxxxx
xxxxxxxxxx.xxxxxxxx
ENDMAP
@@ -494,16 +493,17 @@ ENDMAP
NAME: lemuel_entry_007_funnel
TAGS: entry no_monster_gen
ORIENT: float
+SUBST: c : x.
MAP
xxxxxxxxxxxxxxx
x{.....(.....[x
x.............x
-xx...........xx
-xx...........xx
-xxx.........xxx
-xxx.........xxx
-xxxx.......xxxx
-xxxx.......xxxx
+xx...ccccc...xx
+xx...ccccc...xx
+xxx...ccc...xxx
+xxx...ccc...xxx
+xxxx...c...xxxx
+xxxx...c...xxxx
xxxxx.....xxxxx
xxxxx.....xxxxx
xxxxxx...xxxxxx
@@ -520,22 +520,23 @@ NAME: lemuel_entry_008_muddy
TAGS: entry no_monster_gen
ORIENT: float
SHUFFLE: {[(
+SUBST: ? = w.
MONS: nothing / plant, nothing / fungus
MAP
xxxxxxxxxxxxxxxxxxx
xxxxx{..1..(.1ww.[x
xxxxx1...1...11ww.x
-xxxxxx..w.11....1.x
-xxxxxx........2.1.x
-xxxxxw..11......w.x
-xxxxxw...........xx
-xxxxx.11..22.2....x
-xxxxx11.....w2....x
-xxxxx....1.......xx
-xxxxxx..1.......xxx
-xxxxxx.....2....xxx
-xxxxxx...2......xxx
-xxxxx.....2.....xxx
+xxxx?x..w.11..??1.x
+xxx??x........2.1.x
+xxx?ww..11.....?w.x
+xxxxww?..........xx
+xxx?w?11?.22.2....x
+xxx?w11?....w2....x
+xxxx???..1..???..xx
+xxxxx?..1??..??.xxx
+xxxx?x.....2?...xxx
+xxxx?x...2......xxx
+xxxx?w....2.....xxx
xxxxx.22w......xxxx
xxxxxxx..2.....xxxx
xxxxxxx..2..22xxxxx
@@ -553,28 +554,55 @@ NAME: lemuel_entry_009_a
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: ? : xcvG.
CHANCE: 4
MAP
xxxxxxxxxxx
x{...(...[x
x.........x
-x.x.....x.x
+x.?.....?.x
x.........x
x.........x
-x.x.....x.x
+x.?.....?.x
x.........x
x.........x
-x.x.....x.x
+x.?.....?.x
x.........x
x.........x
-x.x.....x.x
+x.?.....?.x
x.........x
x@...@...@x
ENDMAP
+NAME: lemuel_entry_009_b
+TAGS: entry
+ORIENT: float
+SUBST: ? : xcvG.
+ITEM: meat ration / bread ration / beef jerky / spear / potion of water / apple / club / hammer / knife
+SHUFFLE: {[(
+CHANCE: 3
+MAP
+xxxxxxxxxxxx
+x{...(...[xx
+x.........xx
+x.?.....?.xx
+x.........xx
+x.........xx
+x.?.....?.xx
+x.........xx
+x.........xxxxxx
+x.?.....?.xxxddx
+x.........=..ddx
+x.........xxxxxx
+x.?.....?.xx
+x.........xx
+x@...@...@xx
+ENDMAP
+
NAME: lemuel_entry_009_c
TAGS: entry
ORIENT: float
+SUBST: ? : xcvG.
ITEM: meat ration / bread ration / beef jerky / spear / potion of water / apple / club / hammer / knife
SHUFFLE: {[(
CHANCE: 3
@@ -582,27 +610,29 @@ MAP
xxxxxxxxxxxx
x{...(...[xx
x.........xx
-x.x.....x.xx
+x.?.....?.xx
x.........xx
x.........xxxxxx
-x.x.....x.xxxddx
+x.?.....?.xxxddx
x.........=..ddx
x.........xxxxxx
-x.x.....x.xx
+x.?.....?.xx
x.........xx
x.........xx
-x.x.....x.xx
+x.?.....?.xx
x.........xx
x@...@...@xx
ENDMAP
###################################
-# behind the green door
+# behind the door
-NAME: lemuel_entry_010_green
+NAME: lemuel_entry_010_a
TAGS: entry
+CHANCE: 5
ORIENT: float
SHUFFLE: {(
+SUBST: b : bcv
MAP
xxxxxxxxxxx
x{...(...[x
@@ -617,6 +647,22 @@ xbbbb+bbbbx
x....@....x
ENDMAP
+NAME: lemuel_entry_010_b
+TAGS: entry
+CHANCE: 5
+ORIENT: float
+SHUFFLE: {(
+SUBST: b : bcv
+MAP
+xxxxxxxxxxx
+x{...(...[x
+x.........x
+x.........x
+x.........x
+xbbbb+bbbbx
+x....@....x
+ENDMAP
+
#############################
# lemuel_lava_pool
@@ -624,6 +670,7 @@ NAME: lemuel_entry_011_lava_pool
TAGS: entry no_monster_gen
ORIENT: float
SHUFFLE: {[
+SUBST: l = l .:3
MAP
xxxxxxxxxxxxxxx
xxxxx..{..xxxxx
@@ -648,10 +695,11 @@ ENDMAP
# David's entry vaults
##############################################################################
-NAME: david_entry_001
+NAME: david_entry_001_a
TAGS: entry
FLAGS: no_rotate
ORIENT: float
+CHANCE: 5
SHUFFLE: {[(
MAP
xxxxxxxxxxx@xxxxxxxxxxx
@@ -674,6 +722,37 @@ xxxxx.............xxxxx
xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
+NAME: david_entry_001_b
+TAGS: entry
+FLAGS: no_rotate
+ORIENT: float
+CHANCE: 5
+SHUFFLE: {[
+MAP
+xxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxx...xxxxxxxxxx
+xxxxxxxxx..{..xxxxxxxxx
+xxxxxxxxx.....xxxxxxxxx
+xxxx...xxx...xxx...xxxx
+xx.......xx+xx.......xx
+x.........x.x.........x
+x....[....+.+....(....x
+x.........x.x.........x
+xx.......xx+xx.......xx
+xxxx...xxxx.xxxx...xxxx
+xxxxxxxx.......xxxxxxxx
+xxxxx.............xxxxx
+xxxx...............xxxx
+xxx.................xxx
+xxx........T........xxx
+xxx.......TTT.......xxx
+xxx.................xxx
+xxxx...............xxxx
+xxxxx.............xxxxx
+xxxxxxxx.......xxxxxxxx
+xxxxxxxxxxx@xxxxxxxxxxx
+ENDMAP
+
##############################################################################
# Three discs
@@ -681,6 +760,9 @@ NAME: david_entry_002
TAGS: entry
FLAGS: no_rotate
ORIENT: float
+SUBST: . : ?.
+SUBST: ? = .:1000 % ~
+SUBST: ' = .x
MAP
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx...xxxx
@@ -693,11 +775,11 @@ x.........xxxxxx...xxxx
xx.......xxxxxx.xxxxxxx
xxxx...xxxxxx...xxxxxxx
xxxxxxxxxxx.......xxxxx
-xxx...x............xxxx
-xx..x...xx....[....xxxx
-xx.xxxxxxx.........xxxx
-xx...x...xx.......xxxxx
-xxxx...x..xxx...xxxxxxx
+xxx...''...........xxxx
+x'.''...xx....[....xxxx
+x'.'xx'xxx.........xxxx
+x'..''...xx.......xxxxx
+xx''..''..xxx...xxxxxxx
xxxxxxxxx@xxxxxxxxxxxxx
ENDMAP
@@ -709,6 +791,7 @@ TAGS: entry
FLAGS: no_rotate
ORIENT: float
SHUFFLE: {[(<
+SUBST: v:vx, c:vxc
CHANCE: 2
MAP
xxxxxxxxxxxxxxx@xxxxxxxxxxxxxxx
@@ -734,6 +817,7 @@ TAGS: entry
FLAGS: no_rotate
ORIENT: float
SHUFFLE: {[(<
+SUBST: v:vx, c:vxc
CHANCE: 2
MAP
xxxxxxxxxxxxxxx@xxxxxxxxxxxxxxx
@@ -759,6 +843,7 @@ TAGS: entry
FLAGS: no_rotate
ORIENT: float
SHUFFLE: {[(<
+SUBST: v:vx, c:vxc
CHANCE: 2
MAP
xxxxxxxxxxxxxxx@xxxxxxxxxxxxxxx
@@ -784,6 +869,7 @@ TAGS: entry
FLAGS: no_rotate
ORIENT: float
SHUFFLE: {[(<
+SUBST: v:vx, c:vxc
CHANCE: 2
MAP
xxxxxxxxxxxxxxx@xxxxxxxxxxxxxxx
@@ -809,6 +895,7 @@ TAGS: entry
FLAGS: no_rotate
ORIENT: float
SHUFFLE: {[(<
+SUBST: v:vx, c:vxc
CHANCE: 2
MAP
xxxxxxxxxxxxxxx@xxxxxxxxxxxxxxx
@@ -962,36 +1049,32 @@ ccccccccccc@ccccccccccc
ENDMAP
##############################################################################
-# the imperial orb
+# Moving archways
NAME: david_entry_009
-TAGS: entry
-FLAGS: no_rotate
-ORIENT: float
-SHUFFLE: {[
-MAP
-xxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxx...xxxxxxxxxx
-xxxxxxxxx..{..xxxxxxxxx
-xxxxxxxxx.....xxxxxxxxx
-xxxx...xxx...xxx...xxxx
-xx.......xx+xx.......xx
-x.........x.x.........x
-x....[....+.+....(....x
-x.........x.x.........x
-xx.......xx+xx.......xx
-xxxx...xxxx.xxxx...xxxx
-xxxxxxxx.......xxxxxxxx
-xxxxx.............xxxxx
-xxxx...............xxxx
-xxx.................xxx
-xxx........T........xxx
-xxx.......TTT.......xxx
-xxx.................xxx
-xxxx...............xxxx
-xxxxx.............xxxxx
-xxxxxxxx.......xxxxxxxx
-xxxxxxxxxxx@xxxxxxxxxxx
+TAGS: entry no_monster_gen
+ORIENT: float
+MONS: plant / fungus / nothing
+SHUFFLE: _wl'
+SUBST: l:wxl, _:xw~_, ':., +:+.
+SUBST: ~ = ~:2 .
+SUBST: _ = 1 . %:1
+SUBST: w = w W:3
+MAP
+xxx.......@.......xxx
+xxxx+xxx+xxx+xxx+xxxx
+xxx___xwwwxlllx'''xxx
+xxx___xwwwxlllx'''xxx
+xxx___xwwwxlllx'''xxx
+xxx___xwwwxlllx'''xxx
+xxx___xwwwxlllx'''xxx
+xxx___xwwwxlllx'''xxx
+xxxx+xxx+xxx+xxx+xxxx
+xxx...............xxx
+xxxx.............xxxx
+xxxxxxx.......xxxxxxx
+xxxxxxxxx[{(xxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxx
ENDMAP
##############################################################################
@@ -1207,32 +1290,33 @@ TAGS: entry no_monster_gen
ORIENT: float
FLAGS: no_rotate
MONS: fungus
-SHUFFLE: {[(
+SHUFFLE: {[(, b:bcv, UVW, XYZ
+SUBST: '=.x, U==, V=x, W=x, X==, Y=x, Z=x
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxx..xxxxxxxxxxxxxxxxx%xxxxxxxxxxxxx
-xxx...x.....x...xxxxxxxxxxx.0%%xxxxxxxxxxx
-xx..(....xx...x..xxxxxxxxxx.x.xxxxxxxxxxxx
-xx.....xxx..xxx..xxxxxxxxxx...xxxxxxxxxxxx
-xxx...xxxx=xxxxx..xx...xxxxx0xxxxxxxxxxxxx
-xxxxxxxxx=xxxxxx..x..x..xxx.xxxxxxxxxxxx..
-xxxxxxx....xxxxxx...xx..xxxx..xxxxxxx.....
-xxxxx...xx..xxxxxxxxx..xxxxxxx.xxxx.......
-xxxx..xxxx..xxxxxxxx..xxxxxxx0xxxx........
-xxxx..xxxxx..xxxxxx.....xxxx.xxxx.........
-xxxxx...xxxx..xxxx.......xxx0xxxx.........
-xxxx.....xxx..xxx...bbb...x=xxxx..........
-xxxx..{..xx..xxxx..bbbbb....xx...........@
-xxxxx...xxx..xxx...bbbbb..x....x..........
-xxxxxxxxxxxx..x.....bbb...xxx=xxx.........
-xxxxxxxxxxxxx....x.......xxx.xxxx.........
-xxxxxxxxxxxxxxx.xxx.....xxx..xxxxx........
+xxxxxxxxx''xxxxxxxxxxxxxxxxx%xxxxxxxxxxxxx
+xxx...x''...x...xxxxxxxxxxx.0%%xxxxxxxxxxx
+xx..(....xx..''..xxxxxxxxxx.x.xxxxxxxxxxxx
+xx.....xxx'.xxx..xxxx''xxxx...xxxxxxxxxxxx
+xxx...xxxx=xxxxx.'xx'..'xxxx0xxxxxxxxxxxxx
+xxxxxxx'x=xxxxxx'.x..x.'xxx.xxxxxxxxxxxx..
+xxxxx''...'xxxxxx'..xx..'xxx..xxxxxxx.....
+xxxxx'..x'..xxxxxx'x'..x'xxxxx.xxxx.......
+xxxx..'xxx..'xxxxxxx'.xxxxxxx0x.Wx........
+xxxx..xxxxx..'xxxxx.....xxxx.xxxx.........
+xxxxx...xx'x..'xxx.......xxx0xxxx.........
+xxxx.....x'x..'xx...bbb...xUxVxx..........
+xxxx..{..xx..x''x..bbbbb....x'...........@
+xxxxx...xx''.xxx...bbbbb..x....x..........
+xxxxxxxxxxxx.'x.....bbb...xxxYxxx.........
+xxxxxxxxxxxxx....x.......xXx.xxxx.........
+xxxxxxxxxxxxxxx'xxx.....xxx..xxxxx........
xxxxxxxxxxxxxx=xxxxxx..xxx..xxxxxxx.......
-xxxxxxxxxxxxx=xxxxxx..xxxx.xxxxxxxxxx.....
-xx...x..xxxxx..xxxxx...xx1.xxxxxxxxxxxxx..
-x..[.......x....xxxxx..xxx..xxxxxwxxwwxxxx
-x.....xxx....xx..xxx..xxxxx1...wwwwwxxwxxx
-xx...xxxxxxxxxxx.....xxxxxxxxx.wwwxxxxxxxx
+xxxxxx'xxxxxx=xxxxxx.''xxx.xxxxxxxxxx.....
+xx...x.'xxxxx'.xxxxx'...Z1.xxxxxxxxxxxxx..
+x..[.......'...'x'xxx..'xx..xxxxxwxxwwxxxx
+x.....xxx...'x'..xxx..'xxxx1...wwwwwxxwxxx
+xx...xxxx''x'xxx'..'.xxxxxxxxx.wwwxxxxxxxx
xxxxxxxxxxxxxxxxxx..xxxxxxxxxxwwxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
@@ -1598,7 +1682,7 @@ ENDMAP
NAME: david_entry_016_chase
TAGS: entry no_monster_gen no_pool_fixup
-MONS: kobold, hobgoblin
+MONS: kobold, hobgoblin / goblin / giant bat
ITEM: stone, dart
ORIENT: float
FLAGS: no_rotate
@@ -1625,6 +1709,7 @@ NAME: david_entry_017_fractal
TAGS: entry no_monster_gen
ORIENT: float
FLAGS: no_rotate
+KFEAT: X = teleport trap
SHUFFLE: {[(
MAP
xxxxx+xxxxx+xxxxxxxxxxx@x
@@ -1649,8 +1734,8 @@ xx+xxx..................x
xx.xx...................x
x..x....................x
xxx.....................x
-xx......................x
-@.......................x
+xx....................G.x
+@......................Xx
xxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
@@ -1726,7 +1811,7 @@ ENDMAP
NAME: david_021_tetris
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, bcvx
MAP
xxxxxxxxxxx.@.xxxxxxxxxxx
xxxxxxxxxxx...xxxxxxxxxxx
@@ -1759,9 +1844,9 @@ ENDMAP
NAME: david_022_central
TAGS: entry
-MONS: gnoll
+MONS: gnoll, jackal, worm
ORIENT: float
-SHUFFLE: {[(<
+SHUFFLE: {[(<, 123
MAP
xxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxx
xxxxxxxxxxx...........xxxxxxxxxxx
@@ -1881,8 +1966,7 @@ MONS: worm / giant beetle
ITEM: nothing / ring of hunger / protection from fire / protection from cold
ITEM: nothing / choko / pear / apple / sausage / banana / any scroll
CHANCE: 2
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -1921,8 +2005,7 @@ MONS: worm / giant beetle
ITEM: nothing / ring of hunger / protection from fire / protection from cold
ITEM: nothing / choko / pear / apple / sausage / banana / any scroll
CHANCE: 2
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -1961,8 +2044,7 @@ MONS: worm / giant beetle
ITEM: nothing / ring of hunger / protection from fire / protection from cold
ITEM: nothing / choko / pear / apple / sausage / banana / any scroll
CHANCE: 2
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -2001,8 +2083,7 @@ MONS: worm / giant beetle
ITEM: nothing / ring of hunger / protection from fire / protection from cold
ITEM: nothing / choko / pear / apple / sausage / banana / any scroll
CHANCE: 2
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -2040,8 +2121,7 @@ FLAGS: no_rotate
MONS: worm / giant beetle
ITEM: nothing / ring of hunger / protection from fire / protection from cold
CHANCE: 1
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -2079,8 +2159,7 @@ FLAGS: no_rotate
MONS: worm / giant beetle
ITEM: nothing / choko / pear / apple / sausage / banana / any scroll
CHANCE: 1
-SHUFFLE: {(
-SHUFFLE: cv
+SHUFFLE: {(, cvx
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxvxvx...............xvxvxxxxxx
@@ -2119,6 +2198,7 @@ TAGS: entry no_monster_gen
MONS: generate_awake jelly
ITEM: dart
ORIENT: float
+KFEAT: X = teleport trap
SHUFFLE: {[(
MAP
xxxxxxxxxxxxxxxxxxxxx....@.....
@@ -2126,10 +2206,10 @@ xxxxx......xxxxxxxxxx.........@
xxx............xxxxxx..........
xx................xxxxxxxxxxxxx
xx....vvvv.......xx.....xxxxxxx
-.....vv1dvv......x...{.....xxxx
-@....vddd>v..................xx
-.....vvddvv....x....vvv.......x
-xxx...vvvv....xx...vvvvv..(...x
+.....vv1dvvv.....x...{.....xxxx
+@....vddd+Xvv................xx
+.....vvddvvv...x....vvv.......x
+xxx...vvvvv...xx...vvvvv..(...x
xxx..........xx....vvvvv.....xx
xxx..........xx.....vvv......xx
xxxx........xx..............xxx
@@ -2145,11 +2225,12 @@ NAME: david_028_sounds_drone
TAGS: entry no_monster_gen
MONS: generate_awake boring beetle
FLAGS: no_rotate
+KFEAT: X = teleport trap
ORIENT: float
SHUFFLE: {[(<
MAP
xxx.....@....ccccc....@.....xxx
-xx...........cx>xc...........xx
+xx...........cxXxc...........xx
x............cxxxc............x
.............cxxxc.............
.............cxxxc.............
@@ -2157,7 +2238,7 @@ x............cxxxc............x
.............cxxxc.............
ccccccccccccccxxxcccccccccccccc
cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc
-c>xxxxxxxxxxxxx1xxxxxxxxxxxxx>c
+cXxxxxxxxxxxxxx1xxxxxxxxxxxxxXc
cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc
ccccccccccccccxxxcccccccccccccc
.............cxxxc.............
@@ -2165,7 +2246,7 @@ ccccccccccccccxxxcccccccccccccc
.............cxxxc.............
.............cxxxc.............
x............cxxxc............x
-xx...........cx>xc...........xx
+xx...........cxXxc...........xx
xxx.....@....ccccc....@.....xxx
ENDMAP
@@ -2176,25 +2257,26 @@ NAME: david_entry_029
TAGS: entry
ORIENT: float
SHUFFLE: [{
+SUBST: ':'.x, '=.x
MAP
xxxxxxxxxxxxxxxxxxxxx
-xxxxx..xx......xx..xx
-xxxx.......xxx..x...x
-xxxx..{...xx........x
-xxx......x....[....xx
-xxx...............xxx
-xxx............xxxxxx
-xx..........xxxxxxxxx
-xx.........xxxxxxxxx.
-x.......xxxxxxxxxxx..
-x.....xxxxxxxxxxxxx.@
-x..xxxxxxxxxxxxxx....
-x...xxxxxx....x...xxx
-x.......x..xx...xxxxx
-x...........xxxxxxxxx
-xx...(.xxx.......xxxx
-xxx.....xxxx.......xx
-xxxxxx...xxxxx......x
+xxxxx''xx''''''xx''xx
+xxxx''..'..xxx.'x..'x
+xxxx'.{...xx'......'x
+xxx'.....x''..[...'xx
+xxx'....'.......''xxx
+xxx'.........''xxxxxx
+xx'........'xxxxxxxxx
+xx'......''xxxxxxxxx.
+x'.....'xxxxxxxxxxx..
+x...''xxxxxxxxxxxxx.@
+x.'xxxxxxxxxxxxxx....
+x..'xxxxxx''.'x..'xxx
+x'...'''x'.xx..'xxxxx
+x'..........xxxxxxxxx
+xx'..(.xxx'....''xxxx
+xxx'....xxxx''...''xx
+xxxxxx'''xxxxx''...'x
xxxxxxxxxxxxxxx..@..x
ENDMAP
@@ -2205,23 +2287,24 @@ NAME: david_entry_030
TAGS: entry
ORIENT: float
SHUFFLE: {[(
-MAP
-xxxxxxx..@..xxxxx
-xxxxxx........xxx
-xxxx....xxxx..xxx
-xxx....xxxxx...xx
-xxx.(..xxxxxx..xx
-xx......xxxxx...x
-xx.......xxxxx...
-x....xx....xx...@
-...xxxxx........x
-@..xxxx......[..x
-....x..........xx
-x......{..xxx...x
-xx.......xxxx..xx
-xxxxx..xxxxxxx.xx
-xxxxx.x.xxxxx..xx
-xxxx...@..xx.@..x
+SUBST: ':'.x, '=.x
+MAP
+xxxxxxx'.@.'xxxxx
+xxxxxx'..'...'xxx
+xxxx'...xxxx..xxx
+xxx...'xxxxx'.'xx
+xxx.(.'xxxxxx..xx
+xx'....'xxxxx'..x
+xx...'...xxxxx'.'
+x..''xx'..'xx...@
+..'xxxxx.'.'...'x
+@.'xxxx'.....[.'x
+'..'x'....''...xx
+x'.....{.'xxx'.'x
+xx'''....xxxx'.xx
+xxxxx.'xxxxxxx.xx
+xxxxx.x'xxxxx.'xx
+xxxx'..@''xx.@.'x
ENDMAP
##############################################################################
@@ -2232,23 +2315,24 @@ TAGS: entry no_monster_gen
ORIENT: float
MONS: goblin, rat, giant bat
SHUFFLE: {[(
+SUBST: ?:?.w, ?=.w, ':'.x, '=.x
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxx.xx1..xxxxxxxx..33x
-xxxx.....xxx.xxx.x.x..xxxx
-xx....w...........x..xxx.x
-x...www.....www..xx...2x..
-x..www....w.wwww......xx.@
-xx......wwww.www..ww..x...
-xxx....wwww...wwwww..xx.xx
-..xx...www.[({.www..xx.xxx
-@..xx.wwwww...wwwww...xx.x
-..xx...wwwww.wwwww...x..xx
-x..xxx...wwww.ww......xxxx
-xx..x......www......xxxx.x
-xxx............xx..x.....x
-xxxx.....xxxxxxx......x.2x
-xxx..xxxxx...xxxxxx..xx1xx
+xxxxxxx?xx1.'xxxxxxxx'.33x
+xxxx'.??.xxx.xxx.x.x..xxxx
+xx'..?w.....?.....x..xxx'x
+x'.?www?.?.?www?.xx...2x.'
+x'?www?.??w.wwww?...?.xx.@
+xx.???.?wwww.www.?ww..x..'
+xxx'..?wwww??.wwwww?.xx.xx
+''xx..?www?[({?www?.xx.xxx
+@..xx?wwwww???wwwww?..xx'x
+..xx..?wwwww.wwwww?..x..xx
+x'.xxx.??wwww.ww.??...xxxx
+xx..x....??www.??...xxxx'x
+xxx...??....??.xx?.x.....x
+xxxx'...'xxxxxxx''...'x.2x
+xxx'.xxxxx'''xxxxxx''xx1xx
xxxxxxxxxx.@.xxxxxxxxxxxxx
ENDMAP
@@ -2259,20 +2343,21 @@ NAME: david_entry_032
TAGS: entry no_monster_gen
ORIENT: float
SHUFFLE: {[(
+SUBST: ?:?.w, ?=.w, ':'.x, '=.x
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xwwwwwwwww.................
-xwwwwww......w.............
-xwww......w.www......x.....
-xww......ww.w.ww....xx.....
-xw......ww[www..w..........
-xw..(..wwwwwwwww..........@
-xw.....ww{wwww..w.....x....
-xww......wwww..ww.....x....
-xww.........wwww...x.......
-xwww..............x....xx..
-xwwwwwwww..................
-xxxxxxxxxxxxxxxxx..@.......
+xwwwwwwwww?......'''....''.
+xwwwwww??...?w?......'.....
+xwww??....w.www??...'x'..'.
+xww??...?ww.w.ww.?..xx.....
+xw?....?ww[www..w.?..'.....
+xw?.(.?wwwwwwwww......'...@
+xw?....ww{wwww..w....'x.'..
+xww??...?wwww?.ww?....x.''.
+xwww??.....?wwww...x..'....
+xwwwwww??....???..'x....xx'
+xwwwwwwww??''...........'''
+xxxxxxxxxxxxxxxxx..@....'''
ENDMAP
##############################################################################
@@ -2326,18 +2411,19 @@ ENDMAP
NAME: david_entry_034
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, +'
+SUBST: ':'x+, '=x+
MAP
xxxxxxx.@.xxxxxxx
x.....x...x.....x
-x..(..x...+..[..x
+x..(..'...+..[..x
x.....xx.xx.....x
-xxx+xxxx.xxxxxxxx
+xxx+xxxx.xxxx'xxx
@....xx...xx....@
.....xx...xx.....
xxx+xxxx.xxxx+xxx
x.....xx.xx.....x
-x..{..x...x..]..x
+x..{..'...'..]..x
x.....x...x.....x
xxxxxxx.@.xxxxxxx
ENDMAP
@@ -2609,14 +2695,15 @@ NAME: david_entry_039
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: '=cx., "=+.=
MAP
xxxxxxxxxxxxxxxxxxxx
xccccccx.......x..c.
-xccccccc..ccx..x..x.
-xcc.(..c.....c..x...
-xcc.[..+..c..+.x...@
-xcc.{..c..cxxc....x.
-xccccccc..x.....xx..
+xccccccc..ccx'.x..x.
+xcc.(..c..'..c.'=''.
+xcc.[..+..c..+.x.."@
+xcc.{..c..cxxc.'..x.
+xccccccc..x....'xx'.
xcccccxxc...cc......
xxxxxxxxxxxxxxxxxxxx
ENDMAP
@@ -2647,19 +2734,21 @@ ENDMAP
NAME: david_entry_041
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, vcx
+SUBST: ? = x=
+SUBST: ' = x.
MAP
xxxxxxxxxxxxxxxx.@
-@...xxxxxx..xx.=..
-xxx..xxxx.xx..xx..
-xxxx..xxx=xxxxxx..
+@...xxxxxx.'xx.?..
+xxx'.xxxx.xx..xx..
+xxxx.'xxx?xxxxxx..
xxxxx.xxx.xxxxxx..
xx[x.......xxxxx..
-xx...vvvv...xxxx..
-x..vvvvvvv....xx..
-x..vvvvvv..xx..x..
-xx..vv....xxxx.x..
-x(x....xx{xxxx.=..
+xx...vvvv..'xxxx..
+x'.vvvvvvv....xx..
+x..vvvvvv..xx'.x..
+xx..vv....xxxx'x..
+x(x'...xx{xxxx.?..
xxxxxxxxxxxxxxxxxx
ENDMAP
@@ -2670,22 +2759,23 @@ NAME: david_entry_042
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: ':'.x, '=x.
MAP
xxxx@xxxxxxxxx
xxxx.xxxx...xx
-xx....xx..x..@
-x...x.......xx
-x.........xxxx
-x.........xxxx
-x..........xxx
-xx...xxx....xx
-xx..xxxxxx..xx
-xx..xxxxxxx..x
-xxx..xxxxxx..x
+xx'...xx..x..@
+x'..x..'....xx
+x'.......'xxxx
+x'........xxxx
+x'...''....xxx
+xx..'xxx'...xx
+xx.'xxxxxx..xx
+xx..xxxxxxx.'x
+xxx.'xxxxxx..x
xxx..xxxxxx.{x
xxxx..xxxx..xx
-xxxxx...xx..xx
-xxxxxxx.(.[.xx
+xxxxx...xx.'xx
+xxxxxxx.(.['xx
xxxxxxxxxxxxxx
ENDMAP
@@ -2696,18 +2786,19 @@ NAME: david_entry_043
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: ':'.x, '=x., ":".c, "=.c
MAP
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxx.....xxxxxxxxxxxxxx
-xxx..........xxxxxxxxxxx
-xx....ccc..[.....xxxxxxx
-x...cccccc....cc...xxx.@
-x.{.ccccc.......cc..x.x.
-x....cc.....xx...c...xx.
-xx......(..xxxx......xx.
-xx........xxxxxxxx..xxx.
-xx.....xxxxxxxxxxxx.xxx.
-xxx..xxxxxxxxxxxxxx.xxx.
+xxx'.."""....xxxxxxxxxxx
+xx'.."ccc".[.....xxxxxxx
+x...cccccc"...cc...xxx.@
+x.{.ccccc"..'.."cc..x.x.
+x....cc....'xx.."c".'xx.
+xx......(.'xxxx'....'xx.
+xx'..''...xxxxxxxx.'xxx.
+xx'..''xxxxxxxxxxxx.xxx.
+xxx''xxxxxxxxxxxxxx.xxx.
xxxxxxxxxxxxxxxxxxx@...@
ENDMAP
@@ -2779,7 +2870,7 @@ ORIENT: float
SHUFFLE: {[(
MAP
xx.(..x..xx.
-xx...xx...x.
+xx...xx...=.
.....xxx..xx
....xxx...x.
x...xx....x.
@@ -2797,7 +2888,7 @@ ENDMAP
NAME: david_entry_047
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, TVG
MAP
xxxxx.@.xxxxx
x...........x
@@ -2821,8 +2912,7 @@ TAGS: entry no_monster_gen
FLAGS: no_rotate
ORIENT: float
CHANCE: 5
-SHUFFLE: {[(
-SHUFFLE: cvba
+SHUFFLE: {[(, cvba
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx...xxxx..xxxxxx
@@ -2840,8 +2930,7 @@ TAGS: entry no_monster_gen
FLAGS: no_rotate
ORIENT: float
CHANCE: 5
-SHUFFLE: {[(
-SHUFFLE: cvba
+SHUFFLE: {[(, cvba
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx...xxxx..xxxxxx
@@ -2860,8 +2949,7 @@ ENDMAP
NAME: david_entry_049
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
-SHUFFLE: cv
+SHUFFLE: {[(, cv
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxx
xcxcxcxcxcxcxcxcxcxcxcxxcx
@@ -2881,22 +2969,23 @@ ENDMAP
NAME: david_entry_050
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, TcGv, XY
+SUBST: ':.x, X=+=x, Y=+=x
MAP
xxxxxxxxxxxxxxxxxx..@
-x.......xxxxxxxxxx...
-x.......xxxx...xxx...
-x..x+x.xxx...T...x...
-x..x.x.[xx.......x...
-xxxx.xxxxx..x+x..x...
-xxxx.xxxxxxxx.xxxxxxx
+x'''''''xxxxxxxxxx...
+x'.....'xxxx...xxx...
+x'.x+x.xxx'..T..'x...
+x..x.x.[xx.......Y...
+xxxx.xxxxx''x+x''x...
+xxxx.xxxxxxxx.xxxxxXx
@...................@
xxxxxx.xxxxxxxxxxx.xx
-xxxxxx+xxxxxx....x.xx
-xxxx.....xxxx.c..x.xx
-xxx.......xxx.{..+.xx
-xxx..xxx..xxx.c..xxxx
-xxxx..(..xxxx....xxxx
+xxxxxx+xxxxxx...'x.xx
+xxxx''.''xxxx.c..x.xx
+xxx'.....'xxx.{..+.xx
+xxx'.xxx.'xxx.c..xxxx
+xxxx..(..xxxx...'xxxx
xxxxxxxxxxxxxxxxxxxxx
ENDMAP
@@ -2979,6 +3068,7 @@ NAME: david_entry_051_d
TAGS: entry no_monster_gen
ORIENT: float
CHANCE: 1
+SHUFFLE: cvb
MAP
xxxxxxxxxxxxxxxxxxxx...@
xxxxxxx.......xxx[.=....
@@ -3004,8 +3094,10 @@ ENDMAP
NAME: david_entry_052
TAGS: entry
-MONS: rat
+MONS: rat, goblin, giant bat
ORIENT: float
+SHUFFLE: [{(
+SUBST: X = x=
MAP
xxxxxxxxxxxx..@
xx.1.%1xxxxx...
@@ -3013,7 +3105,7 @@ x%.1.....xxx(..
x1........xx...
xxx...xx..xx...
xxxxxxxxx.1x...
-xxxxxxxxxx+x=xx
+xxxxxxxxxx+xXxx
..[.xxxxxx....x
....xxxxxx.{..x
@...xxxxxxxx@xx
@@ -3024,9 +3116,10 @@ ENDMAP
NAME: david_entry_053
TAGS: entry no_monster_gen
-MONS: jackal
+MONS: jackal / worm
ORIENT: float
SHUFFLE: {(
+SUBST: l = l.
MAP
xxxxxxxxxxxxxxxxx@xxx
@.xx...xx..xx..xx.xxx
@@ -3051,6 +3144,7 @@ ENDMAP
NAME: david_entry_054
TAGS: entry
ORIENT: float
+SUBST: c:xc, T:TGv., %:%.T
MAP
.....................
.....................
@@ -3072,11 +3166,11 @@ ENDMAP
# Just another circle
NAME: david_entry_055_a
-TAGS: entry
+TAGS: entry no_monster_gen
ORIENT: float
FLAGS: no_rotate
CHANCE: 5
-SHUFFLE: {[(
+SHUFFLE: {[(, lw
MAP
xxxxxxxxxxxxxxxxxxxxxxx
xxxxxxx.........xxxxxxx
@@ -3098,10 +3192,10 @@ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
NAME: david_entry_055_b
-TAGS: entry
+TAGS: entry no_monster_gen
ORIENT: float
CHANCE: 5
-SHUFFLE: {[(
+SHUFFLE: {[(, lw
MAP
xxxxxxxxxxx@xxxxxxxxxxx
xxxxxxx.........xxxxxxx
@@ -3131,8 +3225,7 @@ ORIENT: float
CHANCE: 5
FLAGS: no_rotate
ITEM: nothing, nothing, nothing
-SHUFFLE: cbv
-SHUFFLE: def}
+SHUFFLE: cbvx, def}
MAP
..............................
...............cc.............
@@ -3160,7 +3253,7 @@ TAGS: entry
ORIENT: float
CHANCE: 5
FLAGS: no_rotate
-SHUFFLE: cbv
+SHUFFLE: cbvx
MAP
..........................
............cc............
@@ -3320,9 +3413,7 @@ NAME: david_entry_059
TAGS: entry
ORIENT: float
ITEM: nothing, nothing
-SHUFFLE: =+
-SHUFFLE: TV
-SHUFFLE: {[
+SHUFFLE: =+, TVG, {[
MAP
xx@...@xxxxxxxx
xx+xxx+xxxxxxxx
@@ -3345,10 +3436,7 @@ NAME: david_entry_060
TAGS: entry
ORIENT: float
ITEM: nothing, nothing
-SHUFFLE: =+
-SHUFFLE: cx
-SHUFFLE: de/{(
-SHUFFLE: {[(
+SHUFFLE: =+, cx, de/{(, {[(
MAP
@.............@
.....xx+xx.....
@@ -3371,50 +3459,54 @@ TAGS: entry no_monster_gen
ORIENT: northwest
SUBST: ?=l.
CHANCE: 6
+KFEAT: X = teleport trap
SHUFFLE: Cc
MAP
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxClllllllll?...@
-xxxxxxllllllll??.....
-xxxxxxlllllllll......
-xxxxxxlllllllll......
-xxxxxxlllllllll......
-xxxxxxllllllll?......
-xxxxxxllllllll.......
-xxxxxxlllllll?.......
-xxxxxx?ll?ll?.....{..
-xxxxxxl.??...........
-xxxxxx..............@
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxXlllllllllll....
+xxxxxxlClllllllll?...@
+xxxxxxlllllllll??.....
+xxxxxxllllllllll......
+xxxxxxllllllllll......
+xxxxxxllllllllll......
+xxxxxxlllllllll?......
+xxxxxxlllllllll.......
+xxxxxxllllllll?.......
+xxxxxxl?ll?ll?.....{..
+xxxxxxll.??...........
+xxxxxxl..............@
ENDMAP
NAME: david_entry_061_b_altar
TAGS: entry no_monster_gen
ORIENT: northwest
CHANCE: 4
+KFEAT: X = teleport trap
SHUFFLE: Cc
MAP
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxx
-xxxxxxCwwwwwwwwwww..@
-xxxxxxwwwwwwwwwww....
-xxxxxxwwwwwwwwwww....
-xxxxxxwwwwwwwwww.....
-xxxxxxwwwwwwwwww.....
-xxxxxxwwwwwwwww......
-xxxxxxwwwwwwwww......
-xxxxxxwwwwwwww.......
-xxxxxxwwwwwww.....{..
-xxxxxxwwwww..........
-xxxxxx..............@
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxx
+xxxxxxXwwwwwwwwwwwwww.
+xxxxxxwCwwwwwwwwwww..@
+xxxxxxwwwwwwwwwwww....
+xxxxxxwwwwwwwwwwww....
+xxxxxxwwwwwwwwwww.....
+xxxxxxwwwwwwwwwww.....
+xxxxxxwwwwwwwwww......
+xxxxxxwwwwwwwwww......
+xxxxxxwwwwwwwww.......
+xxxxxxwwwwwwww.....{..
+xxxxxxwwwwww..........
+xxxxxxw..............@
ENDMAP
##############################################################################
@@ -3423,7 +3515,7 @@ ENDMAP
NAME: david_entry_062
TAGS: entry no_monster_gen no_pool_fixup
ORIENT: float
-SHUFFLE: {[
+SHUFFLE: {[, lw
MAP
.......xxxxxx@0
@+xlllxx......@
@@ -3628,6 +3720,7 @@ TAGS: entry
ORIENT: float
CHANCE: 1
SHUFFLE: {[(
+SUBST: X : x:20 G:4 l:1
MAP
cccccccccccccccccccccccccccccccccccccccc
c[c..c...cc......c.....................c
@@ -3637,12 +3730,12 @@ c..cccc.cc..c..cc.......c..............c
c.cc...c.c..c......c...c....xxxxxxxx...c
cc.c.ccc..c...c..cc...c....xxxxT9T.x...c
ccc.ccc.c.c..c...c..c.....xxxxx....x...c
-c{ccc..cc.cc......cc......G.x$x.C..x...@
-c.c...c.cc.c..cc............+0x..9.x...c
+c{ccc..cc.cc......cc......G.x$X.C9.x...@
+c.c...c.cc.c..cc............+0x....x...c
cc.cccccc.c...c..c..cc......+0x....x...c
-cccc.c...c..c...c.........G.x$x.C.>x...c
+cccc.c...c..c...c.........G.x$X.C..x...c
c.cc..ccc.c.......c...c...xxxxx....x...c
-c..cc.c.c...cc...ccc...cc..xxxxT.T.x...c
+c..cc.c.c...cc...ccc...cc..xxxxT.T>x...c
cc..cc.cc.cc....c....c......xxxxxxxx...c
c(.c..c.cc...c......c..................c
cccccccccccccccccccccccccccccccccccccccc
@@ -3666,9 +3759,9 @@ ccc.ccc.c.c..c...c..c.....xxxxx1...x...c
c{ccc..cc.cc......cc......G.x$x.V..x...@
c.c...c.cc.c..cc............+0x....x...c
cc.cccccc.c...c..c..cc......+0x.1..x...c
-cccc.c...c..c...c.........G.x$x.V.>x...c
+cccc.c...c..c...c.........G.x$x.V..x...c
c.cc..ccc.c.......c...c...xxxxx....x...c
-c..cc.c.c...cc...ccc...cc..xxxxT.T.x...c
+c..cc.c.c...cc...ccc...cc..xxxxT.T>x...c
cc..cc.cc.cc....c....c......xxxxxxxx...c
c(.c..c.cc...c......c..................c
cccccccccccccccccccccccccccccccccccccccc
@@ -3718,9 +3811,9 @@ ccc.ccc.c.c..c...c..c.....xxxxx....x...c
c{ccc..cc.cc......cc......G.x$x.V..x...@
c.c...c.cc.c..cc............+0x...1x...c
cc.cccccc.c...c..c..cc......+0x1...x...c
-cccc.c...c..c...c.........G.x$x.V.>x...c
+cccc.c...c..c...c.........G.x$x.V..x...c
c.cc..ccc.c.......c...c...xxxxx....x...c
-c..cc.c.c...cc...ccc...cc..xxxxT.T.x...c
+c..cc.c.c...cc...ccc...cc..xxxxT.T>x...c
cc..cc.cc.cc....c....c......xxxxxxxx...c
c(.c..c.cc...c......c..................c
cccccccccccccccccccccccccccccccccccccccc
@@ -4035,7 +4128,7 @@ ENDMAP
NAME: matt_entry_002
TAGS: entry
ORIENT: float
-SHUFFLE: {[
+SHUFFLE: {[, TU
MAP
xxxxxxxxxx@xxxxxxxxxx
x..x.............x..x
@@ -4063,22 +4156,23 @@ NAME: matt_entry_003
TAGS: entry no_monster_gen
ORIENT: float
SHUFFLE: {[(
+SUBST: ':x., ":x., ?:x., _:x.
MAP
xxxxxxxxxx@xxxxxxxxxx
-xx.................xx
-x.x........x......x.x
+xx..........'......xx
+x.x......_.x......x.x
x..x......x......x..x
-x...x....x.x....x...x
+x...x....x.x."..x...x
x....x..x...x..x....x
-x.....xx.....xx.....x
+x.....xx...".xx.....x
x.....x...x...x.....x
-x..x.x...x.....x....@
+x..x.x.?.x.....x....@
@...x...x.(.[.x.x...x
-x....x...x.{.x......x
-x.....x...x.x.x.....x
+x..'.x.".x.{.x..._..x
+x.'...x...x.x.x.....x
x....x.x...x...x....x
x...x...x...x...x...x
-x..x.....x.......x..x
+x..x.....x...?...x..x
x.x.......x.......x.x
xx.................xx
xxxxxxxxxx@xxxxxxxxxx
@@ -4091,27 +4185,28 @@ NAME: matt_entry_004
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: ':'.x, '=x.
MAP
xxxxxxx@xxxxxxxxxxxxx@xxxxxxx
-x....x....x.................x
-x.....xxxx............x.....x
-x.................xx..x.....x
-x........x..........xx.xx...x
-x....x.......x.x.....x......x
-x...x.x..............x......x
-x....x.......x.x.........x..x
-x........xxx..{...x......x..x
-@........................x..x
-x........xxx...xx........x..x
-x....x........xx.x...[....x.@
-x........x....x.xx........x.x
-x.....x.......x.x........x..x
-x............xx.x...x....x..x
-x..x.....(...x.xx........x..x
-x......x.........xx......x..x
+x....x..'.x.................x
+x...'.xxxx...........'x.....x
+x'..''.''.........xx..x'....x
+x'...'...x'...'....'xx.xx...x
+x'...x'......x.x.....x..''..x
+x'.'x'x'.......'....'x......x
+x'..'x.......x'x.....''..x..x
+x'...'...xxx..{...x'....'x'.x
+@''.......'.....'....'..'x'.x
+x''......xxx...xx........x..x
+x....x.......'xx.x...[....x.@
+x...'....x''..x.xx........x.x
+x'....x....'..x'x..'''...x..x
+x...'.'....'.xx.x...x...'x.'x
+x..x.....(...x.xx.......'x.'x
+x..'..'x.........xx.....'x..x
x...x...........xx.x..x..x..x
-x........x......x.xx........x
-x................xx.........x
+x.......'x.'''..x.xx........x
+x.........'......xx.........x
xxxxxxxxxxx@xxxxxxxxxxxxxxxxx
ENDMAP
@@ -4245,6 +4340,7 @@ TAGS: entry
ORIENT: northwest
FLAGS: no_rotate
SHUFFLE: [({
+SUBST: ':'.x, '=x.
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -4252,18 +4348,18 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxx....xxxxxxxxxxxxxxx....xx..xxx...x.xxx...xxx..xxxxxxxxx
-xxxxxxxxxx..........xx.................................xx...xx...xx
-xxxxxxxx.....ccccc...xxx.....ccccc...........ccccc.............x..x
-xxxxxx....cccc...cccc.....cccc...cccc.....cccc...cccc.........xxx.@
-xxxxxx..ccc.........ccc+ccc.........ccc+ccc.........ccc........xxxx
-xxxxxx..c......{......+.+......[......+.+......(......c.........xxx
-xxxxxx..ccc.........ccc+ccc.........ccc+ccc.........ccc........xxxx
-xxxxxx....cccc...cccc.....cccc...cccc.....cccc...cccc...........xxx
-xxxxxx.......ccccc...........ccccc...........ccccc............xxxxx
-xxxxxx....................xx..........xxxx....................xxxxx
-xxxxxx.....xxx.............xx...xx.xxxxxxxxxx.x..........xxx...xxxx
-xxxxxx.xxxxxxxxxxxxxx..xxx.xxx...xxxxxxxxxxxxxxxxxx....xxxxxx...xxx
+xxxxxxxxxxxx....xxxxxxxxxxxxxxx....xx..xxx.''x.xxx..'xxx..xxxxxxxxx
+xxxxxxxxxx''........xx...''.........''...'.............xx...xx...xx
+xxxxxxxx'....ccccc...xxx.....ccccc......'....ccccc.............x..x
+xxxxxx....cccc...cccc.....cccc...cccc.....cccc...cccc.....''..xxx.@
+xxxxxx..ccc.........ccc+ccc.........ccc+ccc.........ccc....''..xxxx
+xxxxxx'.c......{......+.+......[......+.+......(......c...'.....xxx
+xxxxxx'.ccc.........ccc+ccc.........ccc+ccc.........ccc...''...xxxx
+xxxxxx....cccc...cccc.....cccc...cccc.....cccc...cccc......'..'.xxx
+xxxxxx.......ccccc......'....ccccc...........ccccc......'.....xxxxx
+xxxxxx'................'..xx..........xxxx..........'....'....xxxxx
+xxxxxx.''..xxx...''.....'..xx...xx.xxxxxxxxxx.x..'''..''.xxx''.xxxx
+xxxxxx'xxxxxxxxxxxxxx..xxx.xxx...xxxxxxxxxxxxxxxxxx....xxxxxx...xxx
xxxxxxxxxxxxxxxxxxxxxx@xxxxxxxx@xxxxxxxxxxxxxxxxxxxxxx@xxxxxxxx@xxx
ENDMAP
@@ -4275,9 +4371,7 @@ ORIENT: west
FLAGS:
MONS: rat, goblin, giant bat, kobold
ITEM: sausage / beef jerky, nothing, nothing
-SHUFFLE: {[(
-SHUFFLE: 234
-SHUFFLE: ef~
+SHUFFLE: {[(, 234, ef~
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxx+xxxxxxxxxxxx
@@ -4343,43 +4437,71 @@ ENDMAP
NAME: entry_elethiomel_004
TAGS: entry no_monster_gen
ORIENT: float
+SHUFFLE: {[(, WXYZ
+SUBST: W=., X=X., X=x=., Y=Y., Y=x=., Z=Z., Z=x=.
MAP
-xx.xxxxxxxxxxxxxxxxxxxxxxxxxx
+xx@xxxxxxxxxxxxxxxxxxxxxxxxxx
xx.x.......xxxxx...xx......xx
-xx.x.xxxxx.xxxxx.x.xxxxxxx.xx
-xx...x{..x...x...x...x(xxx...
+xx.xXxxxxx.xxxxx.x.xxxxxxx.xx
+xx...x{..x...x...x...x(xxx..@
xxxx.xxx.x.x.x.xxxxx.x.xxx.xx
-...x...x...x.....xxx...x...xx
+@..x...x...x.....xxx...x...xx
xx.xxx.xxxxxxxxx.xxxxxxx.xxxx
-xx.....xxxxx.x.....x.....x...
+xx.....xxxxx.x.....x.W...x..@
xxxx.xxxxxxx.x.xxx.x.xxxxx.xx
-xx...xxxxxxx...xxx...x.....xx
+xx...xxxxxxx...xxx...x...Z.xx
xx.xxxxxxxxx.x.xxx.xxx.xxx.xx
xx...xxxxx...x.....x...x...xx
xxxx.x[xxx.xxxxxxxxx.xxx.xxxx
-xxxx.................xxx...xx
-xxxxxxxxxxxxxxxxxxxxxxxxxx.xx
+xxxx.....Y...........xxx...xx
+xxxxxxxxxxxxxxxxxxxxxxxxxx@xx
ENDMAP
##############################################################
# It's quiet. Too quiet....
-NAME: entry_elethiomel_005
+NAME: entry_elethiomel_005_a
TAGS: entry no_monster_gen
ORIENT: float
-MONS: rat, hobgoblin, goblin
-SHUFFLE: {[(
+MONS: rat / nothing, hobgoblin / goblin / nothing
+SHUFFLE: {[(, '"/AB, !?/CD
+SUBST: ':., ":=, A:x, B:x, !:., ?:=, C:x, D:x
MAP
xxxxxxxxxx@xxxxxxxxxx
xxxxxxxxxx.xxxxxxxxxx
xxxxxxxccc+cccxxxxxxx
xxxxxxxc.G.G.cxxxxxxx
xxcccccc.....ccccccxx
-xc%.3.cc.....cc11.$cx
+xc%.2.cc.....cc11.$cx
xc%.2.=..G.G..=11..cx
xc%...cc.....cc11.$cx
xxcccccc.....ccccccxx
-......=..G.G..=......
+''''''"..G.G..?!!!!!!
+xxcccccc.....ccccccxx
+xxxxxxcG.....Gcxxxxxx
+xxxxxxc.[.{.(.cxxxxxx
+xxxxxxcccccccccxxxxxx
+xxxxxxxxxxxxxxxxxxxxx
+ENDMAP
+
+NAME: entry_elethiomel_005_b
+TAGS: entry no_monster_gen
+ORIENT: float
+MONS: rat / nothing, hobgoblin / goblin / nothing
+SHUFFLE: {[(, '"/AB, !?/CD
+SUBST: ':., ":=, A:x, B:x, !:., ?:=, C:x, D:x
+KFEAT: X = teleport trap
+MAP
+xxxxxxxxxx@xxxxxxxxxx
+xxxxxxxxxx.xxxxxxxxxx
+xxxxxxxccc+cccxxxxxxx
+xxxxxxxc.G.G.cxxxxxxx
+xxcccccc.....ccccccxx
+xc%.2.cc.....cc11.$cx
+xcX.2.c..G.G..c11.Xcx
+xc%...cc.....cc11.$cx
+xxcccccc.....ccccccxx
+''''''"..G.G..?!!!!!!
xxcccccc.....ccccccxx
xxxxxxcG.....Gcxxxxxx
xxxxxxc.[.{.(.cxxxxxx
@@ -4393,7 +4515,9 @@ ENDMAP
NAME: entry_elethiomel_006
TAGS: entry
ORIENT: float
-SHUFFLE: {[(
+SHUFFLE: {[(, XY/AB
+KFEAT: X = teleport trap
+SUBST: Y=x, A=., B==
MAP
xxxxxxx.xxxxxxx...xxxxxxx
xxxxxxx.xxxxxx...xxxxxxxx
@@ -4401,7 +4525,7 @@ xxxxxxx.xxxxx...xxxxxxxxx
xxxxx...xxxx...xxxxxxxxxx
xxxxx{....x...xxxxxxxxxxx
xxxxx........xxxxxxxxxxxx
-x]..=........xxxxxxxxxxxx
+x].XY........xxxxxxxxxxxx
xxxxx.[..................
xxxxx.......(.xxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
@@ -4414,6 +4538,7 @@ NAME: entry_elethiomel_007
TAGS: entry
ORIENT: float
SHUFFLE: {[(
+SUBST: ~ = ~ .:5
# Too bad there isn't a "rolling boulder" trap.
MAP
xxxxxxxxxx.xxxxxxxxxxxxxxx
@@ -4422,7 +4547,7 @@ xxxxxxxxxx.xxxxxxxxxxxxxxx
xxxxxxxxxx.xxxxxxxxxxxxxxx
xxxxxxxxxx.xxxxxxx.....xxx
xxxxxxx.......xx...~~~..xx
-.........{[(.....G.~%~...x
+.........{[(...+.G.~%~...x
xxxxxxx.......xx...~~~..xx
xxxxxxxxxx.xxxxxxx.....xxx
xxxxxxxxxx.xxxxxxxxxxxxxxx
@@ -4502,10 +4627,8 @@ DEPTH: 1-11
# Vaults tagged "dummy" are no-ops when the dungeon builder is looking for maps
# by depth.
TAGS: dummy
-
ORIENT: float
CHANCE: 100
-
MAP
x
ENDMAP
@@ -4566,30 +4689,30 @@ ENDMAP
##############################################################################
# Rubicon
-NAME: erik_rubicon_a
-DEPTH: 10-16
-ORIENT: float
-FLAGS: no_rotate
-CHANCE: 6
-ITEM: ring of levitation / potion of levitation / nothing, potion of levitation
-ITEM: nothing, nothing, nothing
-SHUFFLE: {[(
-SHUFFLE: wl
-SHUFFLE: )gh
-MAP
-xxxxccccccccwwwww.@wwww.@wwwwwww...@wwwwwww.@wwww@..wccccxxxxxx
-ccccwwwwwwwww..wwwww.wwwwwwww.wwwwwww.wwwwwwwwwwwwwwwwwwccccccc
+NAME: erik_rubicon_a
+DEPTH: 10-16
+ORIENT: float
+FLAGS: no_rotate
+TAGS: no_pool_fixup
+CHANCE: 6
+ITEM: ring of levitation / potion of levitation / nothing, potion of levitation
+ITEM: nothing, nothing, nothing
+SHUFFLE: {[(, )gh
+SUBST: ?:?.w, ?=w., w:lw, ':'.c, '=cx.
+MAP
+xxxxcccccccc????w.@??ww.@www???w...@???wwww.@ww??@..?ccccxxxxxx
+ccccwwwwwwwww..wwwww.wwwwwwww.wwwwwww.wwwwwwwwwwww??wwwwccccccc
cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwc
cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwc
ccwwwwwwwwwwwwwwwwwwwcccwwwwwwwwwcwwwwwwwwwwwwwwwwwwwwwwcccwccc
cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwc
cwwwwwwwwwwwwwwwwwwwwwccwwwwwwwwwcwcwwwwwwwwwwwwwwwwwwwwwwccccc
cwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwcwwwww.wwwwwwwwwwwwwwwwwwwwwwc
-ccwcwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwww.wwwwwwwccccc
-ccccccwwwwwww.wwwwwxwwwwww...wwwwwwwwwwwwwwwwwwwwwwwwwwcccccxxx
-xxxxcxx.........w..xx........wwwww...c......ww.....www..cxccxxx
-xxxxcx..(cc[......xx...x....x..wxx.xcc..cxcx...xxx.....chxxcxxx
-xxxxcx..cc{c..xx.....xx...cc..xx....xcc......xxx..x.xxc...cxxxx
+ccwcwwwwwwwwwwwwwwwxwwwwww???wwwwwwwww???wwwwwwwww.wwwwwwwccccc
+cccccc????w??.w????xw??w??...?wwww???w????w?w???w???w??cccccxxx
+xxxxcxx...''....?..xx........??w??...c''....??.....???..cxccxxx
+xxxxcx..(cc[.''..'xx...x.''.x..?xx.xcc..cxcx...xxx.'...chxxcxxx
+xxxxcx..cc{c..xx.....xx...cc..xx....xcc....''xxx..x.xxc...cxxxx
xxxxccx....e.xx....x..x.....c....cx..x...x......c......cxcxxxxx
xxxxxcxexxx.x.x.xx.x.xx.xcc.xx.xccxx....xx.x.xxxccxx.xcccxxxxxx
xxxxxccx.gxxx..x..xdx..x.xxxx.x...xx.xx...xx.xxxx)..xxcxxxxxxxx
@@ -4597,31 +4720,29 @@ xxxxxxcxxxxxxxx...xxxxxxxxxccccccc..xxxxccccccccxxxccccxxxxxxxx
xxxxxxcccccccccccccccccccccccccccccccccccxxxxxcccccccxxxxxxxxxx
ENDMAP
-NAME: erik_rubicon_b
-DEPTH: 10-16
-TAGS: no_pool_fixup
-ORIENT: float
-FLAGS: no_rotate
-CHANCE: 4
-ITEM: ring of levitation / potion of levitation / nothing, potion of levitation
-ITEM: nothing, nothing, nothing, nothing
-SHUFFLE: {[(
-SHUFFLE: fgW
-SHUFFLE: )hi
+NAME: erik_rubicon_b
+DEPTH: 10-16
+ORIENT: float
+FLAGS: no_rotate
+CHANCE: 4
+ITEM: ring of levitation / potion of levitation / nothing, potion of levitation
+ITEM: nothing, nothing, nothing, nothing
+SHUFFLE: {[(, fgW, )hi
+SUBST: ?:?.wW, ?=wW., ':'.c, '=c.
MAP
-xxxxccccccccwgwwf.@wgfw.@wwwgwfw...@gwfwwww.@wwww@..wccccxxxxxx
-ccccwwwwwwwww..fwwww.wwwwwwww.wwwwwww.wwwwwwwwwwwffggwwwccccccc
-cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwc
+xxxxcccccccc?gw?f.@wgf?.@w??g?fw...@gwfw???.@wwww@..?ccccxxxxxx
+ccccwwwwwww??..f????.ww???www.???ww??.wwwwwwwwwwwffgg?wwccccccc
+cwwwwwwwwwwww??wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww??wwwwwwwwwc
cwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwc
ccwwwwwwwwwwwwwwwgwwwcccwwwfwwwwwcwwwwgwwwwwwwwwwwwwwwwwcccwccc
cwwwwwwwwwwwwwwgwwwwwwwwwwwwfwwwwwwwwwwwwwfwwwwwwwwwwwwwwwwwwwc
-cwwwwwwwwwwwwwwwwwwwwwccwwwwwwwwwcwcwwwwwwwwwwwwwwwwwwwwwwccccc
+cwwwwwwwwwwwwwwwwwwwwwccwwwwwwwwwcwcwwww?wwwwwwwwwwwwwwwwwccccc
cwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwcwwwww.wwwwwwwwwwwwwwwwwwwwwwc
-ccwcwwwwwgwwwwfwwwwxwwwwwwwwwwwwwwwwwwwfgwwwgwwwww.wwwwwwwccccc
-ccccccwffwgwwfwwwwgxwwwwww...wwwwwwwwwfwgwwfwgwwwfgwwwgcccccxxx
-xxxxcxx.........w..xx........wwwww...c......ww.....wgg.xcxccxxx
-xxxxcx..(cc[.....xx....x....x..w...xcc..cxcx.x..x......cxhxcxxx
-xxxxxcc..c{c..x.x...c.xxx.x.xx....xx..cc..c.xx...cc..xxx...xxxx
+ccwcwwwwwg?wwwfwwwwxwwwwwwwwwwwwwwwwwwwfgwwwgwwwww.wwwwwwwccccc
+ccccccwffwg??fw?ww?gx??ww?..??wwwww??w?fwgw?fwgw??fg??gcccccxxx
+xxxxcxx...'''...?..xx.....''.?ww??...c.'....??...'.?gg.xcxccxxx
+xxxxcx..(cc[.'.'.xx..'.x.'..x..?...xcc..cxcx.x..x..''..cxhxcxxx
+xxxxxcc..c{c..x.x...c.xxx.x.xx.'.'xx..cc..c.xx''.cc..xxx...xxxx
xxxxccx....e.xx...x...x.....c...c....cc....x...x....x....cxxxxx
xxxxxcxexxxxx.x.xxxx.x..xcc.xx..cc.x....xx.x.x.xccxx.xcccxxxxxx
xxxxxccx..xi.x.x.xxdxxxx...x..xx..xxxxx...x).xx..xc.xxcxxxxxxxx
@@ -4635,7 +4756,7 @@ ENDMAP
NAME: erik_ogre
DEPTH: 4-9
ORIENT: float
-MONS: ogre / iron devil
+MONS: ogre / iron devil / w:5 nothing
ITEM: potion of heal wounds / speed / berserk rage
SHUFFLE: {(
MAP
@@ -4666,44 +4787,49 @@ ENDMAP
###################################
# Hellmouth (Lemuel)
# note that other than the imps, the demons here cannot fly
-NAME: hellmouth_1
-FLAGS: no_rotate
-MONS: imp / quasit / shadow imp, hellion / rotting devil / iron devil / hairy devil / hell hound
-ITEM: good_item demon blade / good_item demon whip / good_item demon trident / wand of draining / wand of fire / ring of fire / Necronomicon / book of demonology / scroll of torment
+NAME: hellmouth_1
+FLAGS: no_rotate
+MONS: imp / quasit / shadow imp, hellion / rotting devil / iron devil / hairy devil / hell hound
+ITEM: good_item demon blade / good_item demon whip / good_item demon trident / wand of draining
+ITEM: wand of fire / ring of fire / Necronomicon / book of demonology / scroll of torment
ORIENT: float
+SUBST: d=de, ?:?.l, ?=l.
MAP
xxxxxxxxxxxxxxxxxxx
xxxxxxxxlllxxxxxxxx
xxxxxxlllAlllxxxxxx
-xxxlllll.d.llll.xxx
-xlllllll121lllll..x
-x.lllllll1llll....x
-x...llllllll......x
-x....llllll.......x
-x.....lllll.......x
-xxx....lll......xxx
-xxxx...lll.....xxxx
-xxxxx..ll.....xxxxx
-xxxxx.lll.....xxxxx
-xxxxxxlll....xxxxxx
+xxxlllll.d.llll?xxx
+xlllllll121lllll?.x
+x?lllllll1llll?...x
+x.??llllllll?.....x
+x...?llllll?......x
+x....?lllll.......x
+xxx...?lll?.....xxx
+xxxx...lll?....xxxx
+xxxxx.?ll?....xxxxx
+xxxxx?lll.....xxxxx
+xxxxxxlll?...xxxxxx
xxxxxxxlll...xxxxxx
-xxxxxxxxll..xxxxxxx
-xxxxxxxxll..xxxxxxx
-xxxxxxxxl.@xxxxxxxx
+xxxxxxxxll?.xxxxxxx
+xxxxxxxxll?.xxxxxxx
+xxxxxxxxl?@xxxxxxxx
ENDMAP
###################################
# Hellmouth 2 (Lemuel)
# note that other than the imps, the demons here cannot fly
-NAME: hellmouth_2
-TAGS: no_monster_gen
-FLAGS: no_rotate
-MONS: imp / quasit / shadow imp / manes / lemure
-MONS: hellion / rotting devil / iron devil / hairy devil / hell hound
-ITEM: good_item demon blade / good_item demon whip / good_item demon trident / wand of draining / wand of fire / ring of fire / Necronomicon / book of demonology / scroll of torment
-ITEM: good_item demon blade / good_item demon whip / good_item demon trident
+NAME: hellmouth_2
+TAGS: no_monster_gen
+FLAGS: no_rotate
+MONS: imp / quasit / shadow imp / manes / lemure
+MONS: hellion / rotting devil / iron devil / hairy devil / hell hound
+ITEM: good_item demon blade / good_item demon whip / good_item demon trident / wand of draining
+ITEM: wand of fire / ring of fire / Necronomicon / book of demonology / scroll of torment
+ITEM: good_item demon blade / good_item demon whip / good_item demon trident / w:30 nothing
ORIENT: float
+SUBST: d=de, ?:?.l, ?=l.
+SUBST: b : b:30 c v .
MAP
.......bbbbbbbbbbbb.......
@@ -4711,15 +4837,15 @@ MAP
..bbb....llllllll....bbb..
.bb....llllllllllll....bb.
.b....llllllllllllll....b.
-.b....llllll..llllll....b.
-.b....lll........lll....b.
-.b....ll....111...ll....b.
-.+....l....11211d..l....b.
-.+....l....12A21|e.l....b.
-.b....ll...11211d.ll....b.
-.b....lll...111..lll....b.
-.b....llll......llll....b.
-.b....llllll..llllll....b.
+.b....llllll??llllll....b.
+.b...?lll??.....?lll?...b.
+.b...?ll?...111...ll?...b.
+.+...?l?...11211d..l?...b.
+.+...?l?...12A21|f.l?...b.
+.b...?ll...11211d.ll?...b.
+.b...?lll?..111..lll?...b.
+.b....llll?.....llll....b.
+.b....llllll??llllll....b.
.bb....llllllllllll....bb.
..bbb....llllllll....bbb..
....bbbb..........bbbb....
@@ -4728,28 +4854,28 @@ ENDMAP
###################################
# Hellmouth 3 (Lemuel)
-NAME: hellmouth_3
-MONS: weight:50 imp / quasit / shadow imp / manes / lemure, hell hound
-ITEM: good_item demon blade / good_item demon whip / good_item demon trident
+NAME: hellmouth_3
+MONS: weight:50 imp / quasit / shadow imp / manes / lemure, hell hound
+ITEM: good_item demon blade / good_item demon whip / good_item demon trident / nothing
ORIENT: float
-
+SUBST: ?:?.l, ?=l.
MAP
................l.............
..............................
-................l.............
-....ll..........l.............
-...lll..........l.............
-....l..........l..............
-.............lll..............
-..........lllllll.............
-........llllllllll............
-.......lll111111llll..........
-.......llll12Ad1lll...........
-........lll11111ll............
-.........lllll1ll.............
-...........llllll.............
-............llll......ll......
-.............ll........ll.....
+....??..........l?............
+...?ll?........?l?............
+..?lll?.........l.............
+...?l........??l?.............
+...........??lll?.............
+.........?lllllll?............
+.......?llllllllll??..........
+......?lll111111llll?.........
+......?llll12Ad1lll...........
+.......?lll11111ll?...........
+........?lllll1ll?............
+.........??llllll......?......
+...........?llll?.....ll?.....
+............?ll?.......ll?....
..............................
...................l..........
ENDMAP
@@ -4759,7 +4885,9 @@ ENDMAP
NAME: RatsNest
ORIENT: float
DEPTH: 4-8
-
+SHUFFLE: 23, 34
+MONS: rat / nothing, grey rat / nothing
+MONS: green rat / nothing, orange rat / nothing
MAP
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxx
@@ -4785,14 +4913,15 @@ xxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxx
ENDMAP
-MONS: rat, grey rat, green rat, orange rat
##############################################################################
# Beware the mummy's curse (Lemuel)
NAME: MiniTomb
ORIENT: float
DEPTH: 10-26
-
+MONS: large zombie / nothing, mummy, guardian mummy, greater mummy, large zombie
+MONS: mummy / nothing
+SHUFFLE: 2F, cbv
MAP
xxxxcccccxxxx
xxxxc$|$cxxxx
@@ -4808,7 +4937,7 @@ xxcccc=ccccxx
xxc.......cxx
xxc.......cxx
x$=.12321.=$x
-x$c.......c$x
+x$c..666..c$x
x3c.......c3x
xxcccc+ccccxx
xxxxxc.cxxxxx
@@ -4816,15 +4945,13 @@ xxxxxc.cxxxxx
xxxxxc.cxxxxx
xxxx.=.=.xxxx
xxxx$c.c$xxxx
-xxxx2c1c2xxxx
+xxxx6c1c6xxxx
xxxxxc1cxxxxx
xxxccc1cccxxx
xxccFc+cFccxx
xxcc@c@c@ccxx
ENDMAP
-MONS: large zombie, mummy, guardian mummy, greater mummy
-MONS: large zombie
#############################################################################
@@ -5615,9 +5742,8 @@ ENDMAP
NAME: david_greed
DEPTH: 10-26
-ITEM: nothing
-SHUFFLE: d|
-SHUFFLE: HS
+ITEM: nothing / any good_item
+SHUFFLE: d|, HS
MAP
xxxxxxxxx
xbbbbbbbx
@@ -5636,16 +5762,16 @@ ENDMAP
##############################################################################
# Defended altar
-NAME: david_defended_altar
-DEPTH: 6-20
-ITEM: nothing
-MONS: orc priest, deep elf priest / nothing
-SUBST: 1 : 1 2
+NAME: david_defended_altar
+DEPTH: 7-20
+ITEM: nothing
+SHUFFLE: 1I/2T
+MONS: orc priest, deep elf priest / w:30 nothing
MAP
.........
.ccccc...
.c1..c...
-.c1C.+.T.
+.c1C.+.I.
.c1..c...
.ccccc...
.........
@@ -6351,7 +6477,7 @@ NAME: fake_naga_vault
# room, and being hit by multiple mimics is un-fun.
DEPTH: 15-26
-
+MONS: mimic, guardian naga
MAP
xxxxxxxxx
x1111111x
@@ -6361,7 +6487,6 @@ x11.2.11x
xxxx+xxxx
ENDMAP
-MONS: mimic, guardian naga
#############################################################################
# Pandemonium lesser demon vaults
diff --git a/crawl-ref/source/direct.cc b/crawl-ref/source/direct.cc
index 6cbc6a4120..b260f14dc7 100644
--- a/crawl-ref/source/direct.cc
+++ b/crawl-ref/source/direct.cc
@@ -103,7 +103,9 @@ static command_type read_direction_key(bool just_looking = false)
{
flush_input_buffer( FLUSH_BEFORE_COMMAND );
- int key = unmangle_direction_keys(getchm(KC_TARGETING),KC_TARGETING);
+ const int key =
+ unmangle_direction_keys(
+ getchm(KC_TARGETING), KC_TARGETING, false, false);
switch ( key )
{
@@ -131,9 +133,9 @@ static command_type read_direction_key(bool just_looking = false)
case 'p': case 'f': case 't': return CMD_TARGET_PREV_TARGET;
case '-': return CMD_TARGET_CYCLE_BACK;
- case '+': case '=': return CMD_TARGET_CYCLE_FORWARD;
- case ';': case '/': return CMD_TARGET_OBJ_CYCLE_BACK;
- case '*': return CMD_TARGET_OBJ_CYCLE_FORWARD;
+ case '+': case '=': return CMD_TARGET_CYCLE_FORWARD;
+ case ';': case '/': return CMD_TARGET_OBJ_CYCLE_BACK;
+ case '*': case '\'': return CMD_TARGET_OBJ_CYCLE_FORWARD;
case 'b': return CMD_TARGET_DOWN_LEFT;
case 'h': return CMD_TARGET_LEFT;
@@ -1398,6 +1400,9 @@ static void describe_mons_enchantment(const monsters &mons,
case ENCH_POISON:
strcat(info, " is poisoned.");
break;
+ case ENCH_SICK:
+ strcat(info, " is sick.");
+ break;
case ENCH_ROT:
strcat(info, " is rotting away."); //jmf: "covered in sores"?
break;
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index caaea6892d..e45c2b5686 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -421,6 +421,9 @@ static void build_dungeon_level(int level_number, int level_type)
reset_level();
build_layout_skeleton(level_number, level_type, sr);
+ if (you.level_type == LEVEL_LABYRINTH)
+ return;
+
// Try to place minivaults that really badly want to be placed. Still
// no guarantees, seeing this is a minivault.
place_special_minivaults(level_number, level_type);
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 4223245ab6..af55054702 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -1185,6 +1185,8 @@ enum enchant_type
ENCH_SUBMERGED,
ENCH_SHORT_LIVED,
ENCH_PARALYSIS, // 20
+ ENCH_SICK,
+ ENCH_SLEEPY, // Monster can't wake until this wears off.
NUM_ENCHANTMENTS
};
@@ -1807,6 +1809,7 @@ enum mons_class_flags
M_NO_EXP_GAIN = (1<<31) // worth 0 xp
};
+// now saved in an unsigned long.
enum mon_resist_flags
{
MR_NO_FLAGS = 0,
@@ -1822,22 +1825,23 @@ enum mon_resist_flags
MR_RES_HELLFIRE = (1<< 3),
MR_RES_COLD = (1<< 4),
MR_RES_ASPHYX = (1<< 5),
+ MR_RES_ACID = (1<< 6),
// vulnerabilities
- MR_VUL_ELEC = (1<< 6),
- MR_VUL_POISON = (1<< 7),
- MR_VUL_FIRE = (1<< 8),
- MR_VUL_COLD = (1<< 9),
+ MR_VUL_ELEC = (1<< 7),
+ MR_VUL_POISON = (1<< 8),
+ MR_VUL_FIRE = (1<< 9),
+ MR_VUL_COLD = (1<<10),
// melee armour resists/vulnerabilities
// XXX: how to do combos (bludgeon/slice, bludgeon/pierce)
- MR_RES_PIERCE = (1<<10),
- MR_RES_SLICE = (1<<11),
- MR_RES_BLUDGEON = (1<<12),
+ MR_RES_PIERCE = (1<<11),
+ MR_RES_SLICE = (1<<12),
+ MR_RES_BLUDGEON = (1<<13),
- MR_VUL_PIERCE = (1<<13),
- MR_VUL_SLICE = (1<<14),
- MR_VUL_BLUDGEON = (1<<15)
+ MR_VUL_PIERCE = (1<<14),
+ MR_VUL_SLICE = (1<<15),
+ MR_VUL_BLUDGEON = (1<<16)
};
enum targ_mode_type
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 0f74a1a22b..e5ab195f50 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -149,6 +149,7 @@ public:
virtual void blink() = 0;
virtual void teleport(bool right_now = false, bool abyss_shift = false) = 0;
virtual void poison(actor *attacker, int amount = 1) = 0;
+ virtual void sicken(int amount) = 0;
virtual void paralyse(int strength) = 0;
virtual void slow_down(int strength) = 0;
virtual void confuse(int strength) = 0;
@@ -757,6 +758,7 @@ public:
int hunger_level() const { return hunger_state; }
void make_hungry(int nutrition, bool silent = true);
void poison(actor *agent, int amount = 1);
+ void sicken(int amount);
void paralyse(int str);
void slow_down(int str);
void confuse(int strength);
@@ -941,6 +943,7 @@ public:
bool alive() const;
coord_def pos() const;
bool swimming() const;
+ bool can_drown() const;
bool floundering() const;
size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;
int damage_type(int attk = -1);
@@ -986,6 +989,7 @@ public:
int melee_evasion(const actor *attacker) const;
void poison(actor *agent, int amount = 1);
+ void sicken(int strength);
void paralyse(int str);
void slow_down(int str);
void confuse(int strength);
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 05cd73127c..dc5c27120a 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -2727,8 +2727,7 @@ void melee_attack::mons_apply_attack_flavour(const mon_attack_def &attk)
break;
case AF_DISEASE:
- if (defender->atype() == ACT_PLAYER)
- disease_player( 50 + random2(100) );
+ defender->sicken( 50 + random2(100) );
break;
case AF_FIRE:
@@ -2768,10 +2767,11 @@ void melee_attack::mons_apply_attack_flavour(const mon_attack_def &attk)
special_damage = special_damage * 2 / 3;
if (needs_message && special_damage)
- mprf("%s %s %s!",
+ mprf("%s %s %s%s",
attacker->name(DESC_CAP_THE).c_str(),
attacker->conj_verb("shock").c_str(),
- defender->name(DESC_NOCAP_THE).c_str());
+ defender->name(DESC_NOCAP_THE).c_str(),
+ special_attack_punctuation().c_str());
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Shock damage: %d", special_damage);
diff --git a/crawl-ref/source/hiscores.cc b/crawl-ref/source/hiscores.cc
index 1ef0bb6e19..cd28adc53e 100644
--- a/crawl-ref/source/hiscores.cc
+++ b/crawl-ref/source/hiscores.cc
@@ -942,8 +942,8 @@ void scorefile_entry::init_death_cause(int dam, int dsrc,
{
const monsters *monster = &menv[death_source];
- if (monster->type > 0 || monster->type <= NUM_MONSTERS)
- {
+ if (monster->type >= 0 && monster->type < NUM_MONSTERS)
+ {
death_source = monster->type;
mon_num = monster->number;
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index 5eff2da5c6..b948c557e8 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -1296,7 +1296,7 @@ void game_options::add_message_colour_mapping(const std::string &field)
if (cmap.size() != 2)
return;
- const int col = str_to_colour( cmap[0] );
+ const int col = (cmap[0]=="mute") ? MSGCOL_MUTED : str_to_colour(cmap[0]);
if (col == -1)
return;
diff --git a/crawl-ref/source/libutil.cc b/crawl-ref/source/libutil.cc
index c7e057a9e0..010602dfca 100644
--- a/crawl-ref/source/libutil.cc
+++ b/crawl-ref/source/libutil.cc
@@ -58,7 +58,7 @@ static keycode_type numpad2vi(keycode_type key)
}
#endif
-int unmangle_direction_keys(int keyin, int km)
+int unmangle_direction_keys(int keyin, int km, bool fake_ctrl, bool fake_shift)
{
const KeymapContext keymap = static_cast<KeymapContext>(km);
#ifdef UNIX
@@ -69,13 +69,13 @@ int unmangle_direction_keys(int keyin, int km)
// will hopefully be easy.
/* can we say yuck? -- haranp */
- if (keyin == '*')
+ if (fake_ctrl && keyin == '*')
{
keyin = getchm(keymap);
// return control-key
keyin = CONTROL(toupper(numpad2vi(keyin)));
}
- else if (keyin == '/')
+ else if (fake_shift && keyin == '/')
{
keyin = getchm(keymap);
// return shift-key
diff --git a/crawl-ref/source/libutil.h b/crawl-ref/source/libutil.h
index c790705b7d..3cd5c6c5c9 100644
--- a/crawl-ref/source/libutil.h
+++ b/crawl-ref/source/libutil.h
@@ -24,7 +24,8 @@ void cursorxy(int x, int y);
// Converts a key to a direction key, converting keypad and other sequences
// to vi key sequences (shifted/control key directions are also handled). Non
// direction keys (hopefully) pass through unmangled.
-int unmangle_direction_keys(int keyin, int keymap = 0);
+int unmangle_direction_keys(int keyin, int keymap = 0,
+ bool fake_ctrl = true, bool fake_shift = true);
void lowercase(std::string &s);
void uppercase(std::string &s);
diff --git a/crawl-ref/source/makefile.dos b/crawl-ref/source/makefile.dos
index f56ea91ed8..4535c7df19 100644
--- a/crawl-ref/source/makefile.dos
+++ b/crawl-ref/source/makefile.dos
@@ -1,4 +1,4 @@
-# Make file for Dungeon Crawl (dos)
+# -*- Makefile -*- for Dungeon Crawl (dos)
#
# Modified for Crawl Reference by $Author$ on $Date$
diff --git a/crawl-ref/source/makefile.mgw b/crawl-ref/source/makefile.mgw
index 074f8783ae..f1bc19f861 100644
--- a/crawl-ref/source/makefile.mgw
+++ b/crawl-ref/source/makefile.mgw
@@ -1,4 +1,4 @@
-# Make file for Dungeon Crawl (Win32, MinGW)
+# -*- Makefile -*- for Dungeon Crawl (Win32, MinGW)
# makefile.obj includes a list of object files needed to build Crawl.
include makefile.obj
diff --git a/crawl-ref/source/makefile.unix b/crawl-ref/source/makefile.unix
index 95a50e7659..e1516fb05e 100644
--- a/crawl-ref/source/makefile.unix
+++ b/crawl-ref/source/makefile.unix
@@ -63,7 +63,7 @@ YCFLAGS := $(INCLUDES) $(CFOTHERS)
UTIL = util/
-LEX := lex
+LEX := flex
YACC := bison -y
YTABC := levcomp.tab.c
diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc
index b97ec2ea87..6a8a79802a 100644
--- a/crawl-ref/source/mapdef.cc
+++ b/crawl-ref/source/mapdef.cc
@@ -97,8 +97,8 @@ static std::string split_key_item(const std::string &s,
std::string *arg)
{
std::string::size_type
- norm = s.find("="),
- fixe = s.find(":");
+ norm = s.find("=", 1),
+ fixe = s.find(":", 1);
const std::string::size_type sep = norm < fixe? norm : fixe;
if (sep == std::string::npos)
@@ -468,6 +468,9 @@ void map_lines::apply_transforms()
{
for (int i = 0, size = transforms.size(); i < size; ++i)
transforms[i]->apply_transform(*this);
+
+ // Release the transforms so we don't try them again.
+ release_transforms();
}
void map_lines::normalise(char fillch)
diff --git a/crawl-ref/source/message.cc b/crawl-ref/source/message.cc
index 8872f7b226..5b4285a21f 100644
--- a/crawl-ref/source/message.cc
+++ b/crawl-ref/source/message.cc
@@ -310,7 +310,8 @@ void mpr(const char *inf, int channel, int param)
// checks whether a given message contains patterns relevant for
// notes, stop_running or sounds and handles these cases
-static void mpr_check_patterns(std::string message, int channel, int param)
+static void mpr_check_patterns(const std::string& message, int channel,
+ int param)
{
for (unsigned i = 0; i < Options.note_messages.size(); ++i)
{
@@ -354,7 +355,8 @@ static void mpr_check_patterns(std::string message, int channel, int param)
}
// adds a given message to the message history
-static void mpr_store_messages(std::string message, int channel, int param)
+static void mpr_store_messages(const std::string& message,
+ int channel, int param)
{
const int num_lines = get_message_window_height();
@@ -374,7 +376,7 @@ static void mpr_store_messages(std::string message, int channel, int param)
if (channel != MSGCH_EQUIPMENT)
{
// Put the message into Store_Message, and move the '---' line forward
- Store_Message[ Next_Message ].text = message.c_str();
+ Store_Message[ Next_Message ].text = message;
Store_Message[ Next_Message ].channel = channel;
Store_Message[ Next_Message ].param = param;
Next_Message++;
@@ -385,42 +387,50 @@ static void mpr_store_messages(std::string message, int channel, int param)
}
static bool need_prefix = false;
-static void base_mpr(const char *inf, int channel, int param)
+
+// Does the work common to base_mpr and formatted_mpr.
+// Returns the default colour of the message, or MSGCOL_MUTED if
+// the message should be suppressed.
+static int prepare_message(const std::string& imsg, int channel, int param)
{
if (suppress_messages)
- return;
+ return MSGCOL_MUTED;
int colour = channel_to_colour( channel, param );
- if (colour == MSGCOL_MUTED)
- return;
- std::string imsg = inf;
-
- mpr_check_patterns(imsg, channel, param);
-
- if (!Options.message_colour_mappings.empty())
+ const std::vector<message_colour_mapping>& mcm =
+ Options.message_colour_mappings;
+ typedef std::vector<message_colour_mapping>::const_iterator mcmci;
+
+ for ( mcmci ci = mcm.begin(); ci != mcm.end(); ++ci )
{
- std::string message = inf;
- for (int i = 0, size = Options.message_colour_mappings.size();
- i < size; ++i)
+ if (ci->message.is_filtered(channel, imsg))
{
- const message_colour_mapping &m =
- Options.message_colour_mappings[i];
- if (m.message.is_filtered(channel, message))
- {
- colour = m.colour;
- break;
- }
+ colour = ci->colour;
+ break;
}
}
- flush_input_buffer( FLUSH_ON_MESSAGE );
-
- const int num_lines = get_message_window_height();
+ if ( colour != MSGCOL_MUTED )
+ {
+ mpr_check_patterns(imsg, channel, param);
+ flush_input_buffer( FLUSH_ON_MESSAGE );
+ const int num_lines = get_message_window_height();
- if (New_Message_Count == num_lines - 1)
- more();
+ if (New_Message_Count == num_lines - 1)
+ more();
+ }
+ return colour;
+}
+
+static void base_mpr(const char *inf, int channel, int param)
+{
+ const std::string imsg = inf;
+ const int colour = prepare_message( imsg, channel, param );
+ if ( colour == MSGCOL_MUTED )
+ return;
+
if (need_prefix)
{
message_out( Message_Line, colour, "-", 1, false );
@@ -472,26 +482,12 @@ static void mpr_formatted_output(formatted_string fs, int colour)
// way to do this.
void formatted_mpr(const formatted_string& fs, int channel, int param)
{
- if (suppress_messages)
- return;
-
- int colour = channel_to_colour( channel, param );
+ const std::string imsg = fs.tostring();
+ const int colour = prepare_message(imsg, channel, param);
if (colour == MSGCOL_MUTED)
return;
- const std::string imsg = fs.tostring();
-
- mpr_check_patterns(imsg, channel, param);
-
- flush_input_buffer( FLUSH_ON_MESSAGE );
-
- const int num_lines = get_message_window_height();
-
- if (New_Message_Count == num_lines - 1)
- more();
-
mpr_formatted_output(fs, colour);
-
mpr_store_messages(imsg, channel, param);
}
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index ab8fdbfc3e..bf3d0b56a9 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -556,7 +556,7 @@
{
MONS_JELLY, 'J', LIGHTRED, "jelly",
M_SEE_INVIS | M_SPLITS | M_AMPHIBIOUS | M_ACID_SPLASH,
- MR_RES_POISON | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_ASPHYX | MR_RES_ACID,
0, 13, MONS_JELLY, MONS_JELLY, MH_NATURAL, -3,
{ {AT_HIT, AF_ACID, 8}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 3, 5, 5, 0 },
@@ -2876,7 +2876,7 @@
{
MONS_BROWN_OOZE, 'J', BROWN, "brown ooze",
M_NO_SKELETON | M_SEE_INVIS | M_ACID_SPLASH,
- MR_RES_POISON | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_ASPHYX | MR_RES_ACID,
0, 11, MONS_JELLY, MONS_BROWN_OOZE, MH_NATURAL, -7,
{ {AT_HIT, AF_ACID, 25}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 7, 3, 5, 0 },
@@ -2888,7 +2888,8 @@
{
MONS_AZURE_JELLY, 'J', LIGHTBLUE, "azure jelly",
M_NO_SKELETON | M_SEE_INVIS,
- MR_RES_POISON | MR_RES_COLD | MR_VUL_FIRE | MR_RES_ELEC | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_COLD | MR_VUL_FIRE | MR_RES_ELEC | MR_RES_ASPHYX
+ | MR_RES_ACID,
0, 11, MONS_JELLY, MONS_AZURE_JELLY, MH_NATURAL, -4,
{ {AT_HIT, AF_COLD, 12}, {AT_HIT, AF_COLD, 12}, {AT_HIT, AF_PLAIN, 12}, {AT_HIT, AF_PLAIN, 12} },
{ 15, 3, 5, 0 },
@@ -2900,7 +2901,7 @@
{
MONS_DEATH_OOZE, 'J', DARKGREY, "death ooze",
M_NO_SKELETON | M_SEE_INVIS | M_EVIL,
- MR_RES_POISON | MR_RES_COLD | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_COLD | MR_RES_ASPHYX | MR_RES_ACID,
0, 13, MONS_JELLY, MONS_DEATH_OOZE, MH_UNDEAD, -8,
{ {AT_HIT, AF_ROT, 32}, {AT_HIT, AF_PLAIN, 32}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 11, 3, 3, 0 },
@@ -2912,7 +2913,7 @@
{
MONS_ACID_BLOB, 'J', LIGHTGREEN, "acid blob",
M_NO_SKELETON | M_SEE_INVIS | M_SPECIAL_ABILITY | M_ACID_SPLASH,
- MR_RES_POISON | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_ASPHYX | MR_RES_ACID,
0, 12, MONS_JELLY, MONS_ACID_BLOB, MH_NATURAL, -7,
{ {AT_HIT, AF_ACID, 42}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 18, 3, 5, 0 },
@@ -2924,7 +2925,7 @@
{
MONS_ROYAL_JELLY, 'J', YELLOW, "royal jelly",
M_NO_SKELETON | M_SEE_INVIS | M_ACID_SPLASH,
- MR_RES_POISON | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_ASPHYX | MR_RES_ACID,
0, 20, MONS_JELLY, MONS_ROYAL_JELLY, MH_NATURAL, -7,
{ {AT_HIT, AF_ACID, 50}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 21, 0, 0, 111 },
@@ -3393,7 +3394,7 @@
{
MONS_OOZE, 'J', LIGHTGREY, "ooze",
M_NO_SKELETON | M_SEE_INVIS,
- MR_RES_POISON | MR_RES_ASPHYX,
+ MR_RES_POISON | MR_RES_ASPHYX | MR_RES_ACID,
0, 5, MONS_JELLY, MONS_OOZE, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 5}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0}, {AT_NONE, AF_PLAIN, 0} },
{ 3, 3, 5, 0 },
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index bb5e894e17..3b3415b31f 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -700,7 +700,7 @@ int mons_resist_magic( const monsters *mon )
// negative values get multiplied with mhd
if (u < 0)
- u = mon->hit_dice * -u;
+ u = mon->hit_dice * -u * 4 / 3;
u += scan_mon_inv_randarts( mon, RAP_MAGIC );
@@ -796,11 +796,17 @@ bool mons_res_asphyx( const monsters *mon )
|| mons_resist(mon, MR_RES_ASPHYX));
}
+int mons_res_acid( const monsters *mon )
+{
+ const unsigned long f = get_mons_resists(mon);
+ return ((f & MR_RES_ACID) != 0);
+}
+
int mons_res_poison( const monsters *mon )
{
int mc = mon->type;
- int u = 0, f = get_mons_resists(mon);
+ unsigned long u = 0, f = get_mons_resists(mon);
if (f & MR_RES_POISON)
u++;
@@ -2415,7 +2421,8 @@ monsters::monsters(const monsters &mon)
monsters &monsters::operator = (const monsters &mon)
{
- init_with(mon);
+ if (this != &mon)
+ init_with(mon);
return (*this);
}
@@ -2471,6 +2478,11 @@ bool monsters::floundering() const
&& !mons_flies(this));
}
+bool monsters::can_drown() const
+{
+ return (!mons_res_asphyx(this));
+}
+
size_type monsters::body_size(int /* psize */, bool /* base */) const
{
const monsterentry *e = seekmonster(type);
@@ -3275,6 +3287,7 @@ void monsters::timeout_enchantments(int levels)
case ENCH_STICKY_FLAME: case ENCH_ABJ: case ENCH_SHORT_LIVED:
case ENCH_SLOW: case ENCH_HASTE: case ENCH_FEAR:
case ENCH_INVIS: case ENCH_CHARM: case ENCH_SLEEP_WARY:
+ case ENCH_SICK: case ENCH_SLEEPY:
lose_ench_levels(*cur, levels);
break;
@@ -3289,6 +3302,9 @@ void monsters::timeout_enchantments(int levels)
default:
break;
}
+
+ if (!alive())
+ break;
}
}
@@ -3340,6 +3356,14 @@ void monsters::apply_enchantment(mon_enchant me, int spd)
}
break;
+ case ENCH_SICK:
+ {
+ const int lost = !spd? 1 : div_rand_round(10, spd);
+ if (lost > 0)
+ lose_ench_levels(me, lost);
+ break;
+ }
+
case ENCH_SUBMERGED:
{
// not even air elementals unsubmerge into clouds
@@ -3561,6 +3585,10 @@ void monsters::apply_enchantment(mon_enchant me, int spd)
del_ench(ENCH_SLEEP_WARY);
break;
+ case ENCH_SLEEPY:
+ del_ench(ENCH_SLEEPY);
+ break;
+
default:
break;
}
@@ -3585,6 +3613,21 @@ kill_category monsters::kill_alignment() const
return (attitude == ATT_FRIENDLY? KC_FRIENDLY : KC_OTHER);
}
+void monsters::sicken(int amount)
+{
+ if (holiness() != MH_NATURAL || (amount /= 2) < 1)
+ return;
+
+ if (!has_ench(ENCH_SICK)
+ && mons_near(this) && player_monster_visible(this))
+ {
+ // Yes, could be confused with poisoning.
+ mprf("%s looks sick.", name(DESC_CAP_THE).c_str());
+ }
+
+ add_ench(mon_enchant(ENCH_SICK, amount));
+}
+
/////////////////////////////////////////////////////////////////////////
// mon_enchant
@@ -3593,7 +3636,7 @@ static const char *enchant_names[] =
"none", "slow", "haste", "fear", "conf", "inv", "pois", "bers",
"rot", "summon", "abj", "backlit", "charm", "fire",
"gloshifter", "shifter", "tp", "wary", "submerged",
- "short lived", "paralysis", "bug"
+ "short lived", "paralysis", "sick", "sleep", "bug"
};
const char *mons_enchantment_name(enchant_type ench)
@@ -3628,6 +3671,10 @@ void mon_enchant::merge_killer(kill_category k)
void mon_enchant::cap_degree()
{
+ // Sickness is not capped.
+ if (ench == ENCH_SICK)
+ return;
+
// Hard cap to simulate old enum behaviour, we should really throw this
// out entirely.
const int max = ench == ENCH_ABJ? 6 : 4;
diff --git a/crawl-ref/source/mon-util.h b/crawl-ref/source/mon-util.h
index f35f9cce2f..1317bf983a 100644
--- a/crawl-ref/source/mon-util.h
+++ b/crawl-ref/source/mon-util.h
@@ -271,7 +271,7 @@ int mons_res_fire( const monsters *mon );
* called from: beam - monstuff - spells4
* *********************************************************************** */
int mons_res_poison( const monsters *mon );
-
+int mons_res_acid( const monsters *mon );
int mons_res_negative_energy( const monsters *mon );
bool mons_res_asphyx( const monsters *mon );
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index d4e3e67354..f299b36fed 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -384,6 +384,20 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
#ifdef DGL_MILESTONES
check_kill_milestone(monster, killer, i);
#endif
+
+ // Take note!
+ if (killer != KILL_RESET && killer != KILL_DISMISSED)
+ {
+ if ( MONST_INTERESTING(monster) ||
+ // XXX yucky hack
+ monster->type == MONS_PLAYER_GHOST ||
+ monster->type == MONS_PANDEMONIUM_DEMON )
+ {
+ take_note(Note(NOTE_KILL_MONSTER, monster->type, 0,
+ ptr_monam(monster, DESC_NOCAP_A, true)));
+ }
+ }
+
// From time to time Trog gives you a little bonus
if (killer == KILL_YOU && you.berserker)
@@ -784,15 +798,6 @@ void monster_die(monsters *monster, char killer, int i, bool silent)
if (killer != KILL_RESET && killer != KILL_DISMISSED)
{
- if ( MONST_INTERESTING(monster) ||
- // XXX yucky hack
- monster->type == MONS_PLAYER_GHOST ||
- monster->type == MONS_PANDEMONIUM_DEMON )
- {
- take_note(Note(NOTE_KILL_MONSTER, monster->type, 0,
- ptr_monam(monster, DESC_NOCAP_A, true)));
- }
-
you.kills.record_kill(monster, killer, pet_kill);
if (monster->has_ench(ENCH_ABJ))
@@ -2403,7 +2408,8 @@ static bool handle_potion(struct monsters *monster, bolt & beem)
{
bool imbibed = false;
- switch (mitm[monster->inv[MSLOT_POTION]].sub_type)
+ const int potion_type = mitm[monster->inv[MSLOT_POTION]].sub_type;
+ switch (potion_type)
{
case POT_HEALING:
case POT_HEAL_WOUNDS:
@@ -2423,6 +2429,14 @@ static bool handle_potion(struct monsters *monster, bolt & beem)
heal_monster(monster, 10 + random2avg(28, 3), false);
}
+ if (potion_type == POT_HEALING)
+ {
+ monster->del_ench(ENCH_POISON);
+ monster->del_ench(ENCH_SICK);
+ monster->del_ench(ENCH_CONFUSION);
+ monster->del_ench(ENCH_ROT);
+ }
+
imbibed = true;
}
break;
@@ -3273,9 +3287,15 @@ static bool handle_throw(struct monsters *monster, bolt & beem)
// ok, we'll try it.
setup_generic_throw( monster, beem );
+ // set fake damage for the tracer.
+ beem.damage = dice_def(10, 10);
+
// fire tracer
fire_tracer( monster, beem );
+ // clear fake damage (will be set correctly in mons_throw).
+ beem.damage = 0;
+
// good idea?
if (mons_should_fire( beem ))
{
@@ -3319,6 +3339,16 @@ static void monster_add_energy(monsters *monster)
// Do natural regeneration for monster.
static void monster_regenerate(monsters *monster)
{
+ if (monster->has_ench(ENCH_SICK))
+ return;
+
+ // Water/lava creatures out of their element cannot regenerate.
+ if (monster_habitat(monster->type) != DNGN_FLOOR
+ && !monster_habitable_grid(monster, grd(monster->pos())))
+ {
+ return;
+ }
+
// regenerate:
if (monster_descriptor(monster->type, MDSC_REGENERATES)
@@ -3714,6 +3744,43 @@ void handle_monsters(void)
}
} // end handle_monster()
+static bool monster_wants_weapon(const monsters *monster, const item_def &weap)
+{
+ if (is_fixed_artefact( weap ))
+ return (false);
+
+ if (is_random_artefact( weap ))
+ return (false);
+
+ // wimpy monsters (Kob, gob) shouldn't pick up halberds etc
+ // of course, this also block knives {dlb}:
+ if ((mons_species(monster->type) == MONS_KOBOLD
+ || mons_species(monster->type) == MONS_GOBLIN)
+ && property( weap, PWPN_HIT ) <= 0)
+ {
+ return (false);
+ }
+
+ // Nobody picks up giant clubs:
+ if (weap.sub_type == WPN_GIANT_CLUB
+ || weap.sub_type == WPN_GIANT_SPIKED_CLUB)
+ {
+ return (false);
+ }
+
+ const int brand = get_weapon_brand(weap);
+ const int holiness = monster->holiness();
+ if (brand == SPWPN_DISRUPTION && holiness == MH_UNDEAD)
+ return (false);
+
+ if (brand == SPWPN_HOLY_WRATH
+ && (holiness == MH_DEMONIC || holiness == MH_UNDEAD))
+ {
+ return (false);
+ }
+
+ return (true);
+}
//---------------------------------------------------------------
//
@@ -3836,28 +3903,9 @@ static bool handle_pickup(struct monsters *monster)
if (monster->inv[MSLOT_WEAPON] != NON_ITEM)
return (false);
- if (is_fixed_artefact( mitm[item] ))
+ if (!monster_wants_weapon(monster, mitm[item]))
return (false);
- if (is_random_artefact( mitm[item] ))
- return (false);
-
- // wimpy monsters (Kob, gob) shouldn't pick up halberds etc
- // of course, this also block knives {dlb}:
- if ((mons_species(monster->type) == MONS_KOBOLD
- || mons_species(monster->type) == MONS_GOBLIN)
- && property( mitm[item], PWPN_HIT ) <= 0)
- {
- return (false);
- }
-
- // Nobody picks up giant clubs:
- if (mitm[item].sub_type == WPN_GIANT_CLUB
- || mitm[item].sub_type == WPN_GIANT_SPIKED_CLUB)
- {
- return (false);
- }
-
monster->inv[MSLOT_WEAPON] = item;
if (get_weapon_brand(mitm[monster->inv[MSLOT_WEAPON]]) == SPWPN_PROTECTION)
@@ -4224,7 +4272,7 @@ void mons_check_pool(monsters *mons, int killer)
if (lev == 2 || (lev && !mons->paralysed()))
return;
- const int grid = grd(mons->pos());
+ int grid = grd(mons->pos());
if ((grid == DNGN_LAVA || grid == DNGN_DEEP_WATER)
&& !monster_habitable_grid(mons, grid))
{
@@ -4237,9 +4285,12 @@ void mons_check_pool(monsters *mons, int killer)
ptr_monam(mons, DESC_CAP_THE),
(grid == DNGN_LAVA ? "lava" : "water"));
+ if (grid == DNGN_LAVA && mons_res_fire(mons) > 0)
+ grid = DNGN_DEEP_WATER;
+
// Even fire resistant monsters perish in lava, but undead can survive
// deep water.
- if (grid == DNGN_LAVA || mons->holiness() != MH_UNDEAD)
+ if (grid == DNGN_LAVA || mons->can_drown())
{
if (message)
{
@@ -4270,7 +4321,15 @@ static void monster_move(struct monsters *monster)
if (monster->confused())
{
if (mmov_x || mmov_y || one_chance_in(15))
- do_move_monster(monster, mmov_x, mmov_y);
+ {
+ coord_def newpos = monster->pos() + coord_def(mmov_x, mmov_y);
+ if (in_bounds(newpos)
+ && (monster_habitat(monster->type) == DNGN_FLOOR
+ || monster_habitable_grid(monster, grd(newpos))))
+ {
+ do_move_monster(monster, mmov_x, mmov_y);
+ }
+ }
return;
}
@@ -5044,9 +5103,9 @@ bool message_current_target()
if (mons_near(montarget) && player_monster_visible(montarget))
{
- mprf( MSGCH_PROMPT, "You are currently targeting %s "
+ mprf( MSGCH_PROMPT, "Current target: %s "
"(use p/t/f to fire at it again.)",
- ptr_monam(montarget, DESC_NOCAP_THE) );
+ ptr_monam(montarget, DESC_PLAIN) );
return (true);
}
diff --git a/crawl-ref/source/mstuff2.cc b/crawl-ref/source/mstuff2.cc
index 9c52cb784d..9eafee035f 100644
--- a/crawl-ref/source/mstuff2.cc
+++ b/crawl-ref/source/mstuff2.cc
@@ -595,6 +595,9 @@ void mons_cast(struct monsters *monster, struct bolt &pbolt, int spell_cast)
break;
case MS_CANTRIP:
+ {
+ const bool friendly = mons_friendly(monster);
+ bool need_friendly_stub = false;
// Monster spell of uselessness, just prints a message.
// This spell exists so that some monsters with really strong
// spells (ie orc priest) can be toned down a bit. -- bwr
@@ -607,10 +610,16 @@ void mons_cast(struct monsters *monster, struct bolt &pbolt, int spell_cast)
MSGCH_MONSTER_ENCHANT );
break;
case 1:
- mpr( "You feel troubled." );
+ if (friendly)
+ need_friendly_stub = true;
+ else
+ mpr( "You feel troubled." );
break;
case 2:
- mpr( "You feel a wave of unholy energy pass over you." );
+ if (friendly)
+ need_friendly_stub = true;
+ else
+ mpr( "You feel a wave of unholy energy pass over you." );
break;
case 3:
simple_monster_message( monster, " looks stronger.",
@@ -626,14 +635,22 @@ void mons_cast(struct monsters *monster, struct bolt &pbolt, int spell_cast)
break;
case 6:
default:
- if (one_chance_in(20))
+ if (friendly)
+ need_friendly_stub = true;
+ else if (one_chance_in(20))
mpr( "You resist (whatever that was supposed to do)." );
else
mpr( "You resist." );
break;
}
+
+ if (need_friendly_stub)
+ simple_monster_message(monster, " shimmers for a moment.",
+ MSGCH_MONSTER_ENCHANT);
+
return;
}
+ }
fire_beam( pbolt );
} // end mons_cast()
@@ -834,8 +851,7 @@ void setup_dragon(struct monsters *monster, struct bolt &pbolt)
? draco_subspecies( monster ) : monster->type;
int scaling = 100;
- pbolt.name = ptr_monam( monster, DESC_PLAIN );
-
+ pbolt.name.clear();
switch (type)
{
case MONS_FIREDRAKE:
@@ -843,21 +859,21 @@ void setup_dragon(struct monsters *monster, struct bolt &pbolt)
case MONS_DRAGON:
case MONS_LINDWURM:
case MONS_XTAHUA:
- pbolt.name += "'s blast of flame";
+ pbolt.name += "blast of flame";
pbolt.flavour = BEAM_FIRE;
pbolt.colour = RED;
pbolt.aux_source = "blast of fiery breath";
break;
case MONS_ICE_DRAGON:
- pbolt.name += "'s blast of cold";
+ pbolt.name += "blast of cold";
pbolt.flavour = BEAM_COLD;
pbolt.colour = WHITE;
pbolt.aux_source = "blast of icy breath";
break;
case MONS_RED_DRACONIAN:
- pbolt.name += "'s searing breath";
+ pbolt.name += "searing blast";
#ifdef DEBUG_DIAGNOSTICS
mprf( MSGCH_DIAGNOSTICS, "bolt name: '%s'", pbolt.name.c_str() );
#endif
@@ -868,7 +884,7 @@ void setup_dragon(struct monsters *monster, struct bolt &pbolt)
break;
case MONS_WHITE_DRACONIAN:
- pbolt.name += "'s chilling breath";
+ pbolt.name += "chilling blast";
#ifdef DEBUG_DIAGNOSTICS
mprf( MSGCH_DIAGNOSTICS, "bolt name: '%s'", pbolt.name.c_str() );
#endif
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index 89f5ca9f7e..77e5a28acb 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -967,8 +967,8 @@ formatted_string describe_mutations()
if (you.experience_level > 14)
result += " continuously";
result += "." EOL;
- have_any = true;
}
+ have_any = true;
break;
case SP_MUMMY:
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 958086967a..196bf9e142 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -1792,7 +1792,7 @@ static void give_basic_mutations(unsigned char speci)
you.mutation[MUT_SLOW_METABOLISM] = 3;
break;
case SP_CENTAUR:
- you.mutation[MUT_FAST] = 1;
+ you.mutation[MUT_FAST] = 2;
you.mutation[MUT_DEFORMED] = 1;
you.mutation[MUT_FAST_METABOLISM] = 2;
break;
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 22f3339a03..abf7f089e0 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -4424,14 +4424,7 @@ void dec_haste_player( void )
void disease_player( int amount )
{
- if (you.is_undead || amount <= 0)
- return;
-
- mpr( "You feel ill." );
-
- const int tmp = you.disease + amount;
- you.disease = (tmp > 210) ? 210 : tmp;
- learned_something_new(TUT_YOU_SICK);
+ you.sicken(amount);
}
void dec_disease_player( void )
@@ -5214,3 +5207,15 @@ kill_category player::kill_alignment() const
{
return (KC_YOU);
}
+
+void player::sicken(int amount)
+{
+ if (is_undead || amount <= 0)
+ return;
+
+ mpr( "You feel ill." );
+
+ const int tmp = disease + amount;
+ disease = (tmp > 210) ? 210 : tmp;
+ learned_something_new(TUT_YOU_SICK);
+}
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 14909991a0..d185ed1733 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -603,7 +603,26 @@ static void do_god_gift()
} // end of gift giving
}
-void pray(void)
+std::string god_prayer_reaction()
+{
+ std::string result;
+ result += god_name(you.religion);
+ result += " is ";
+
+ result +=
+ (you.piety > 130) ? "exalted by your worship" :
+ (you.piety > 100) ? "extremely pleased with you" :
+ (you.piety > 70) ? "greatly pleased with you" :
+ (you.piety > 40) ? "most pleased with you" :
+ (you.piety > 20) ? "pleased with you" :
+ (you.piety > 5) ? "noncommittal"
+ : "displeased";
+
+ result += ".";
+ return result;
+}
+
+void pray()
{
const bool was_praying = (you.duration[DUR_PRAYER] != 0);
@@ -677,19 +696,7 @@ void pray(void)
simple_god_message(" demands penance!");
else
{
- strcpy(info, god_name(you.religion));
- strcat(info, " is ");
-
- strcat(info, (you.piety > 130) ? "exalted by your worship" :
- (you.piety > 100) ? "extremely pleased with you" :
- (you.piety > 70) ? "greatly pleased with you" :
- (you.piety > 40) ? "most pleased with you" :
- (you.piety > 20) ? "pleased with you" :
- (you.piety > 5) ? "noncommittal"
- : "displeased");
-
- strcat(info, ".");
- mpr( info, MSGCH_PRAY, you.religion );
+ mpr( god_prayer_reaction().c_str(), MSGCH_PRAY, you.religion );
if (you.piety > 130)
you.duration[DUR_PRAYER] *= 3;
diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h
index 0a8d565cca..5272a1383e 100644
--- a/crawl-ref/source/religion.h
+++ b/crawl-ref/source/religion.h
@@ -28,7 +28,8 @@ void gain_piety(char pgn);
void god_speaks( int god, const char *mesg );
void lose_piety(char pgn);
void offer_corpse(int corpse);
-void pray(void);
+std::string god_prayer_reaction();
+void pray();
void handle_god_time(void);
char god_colour(char god);
void god_pitch(unsigned char which_god);
diff --git a/crawl-ref/source/spells1.cc b/crawl-ref/source/spells1.cc
index 72c2748123..54062c881d 100644
--- a/crawl-ref/source/spells1.cc
+++ b/crawl-ref/source/spells1.cc
@@ -66,9 +66,7 @@ int blink(void)
// query for location {dlb}:
for (;;)
{
- mpr("Blink to where?", MSGCH_PROMPT);
-
- direction(beam, DIR_TARGET, TARG_ANY);
+ direction(beam, DIR_TARGET, TARG_ANY, false, "Blink to where?");
if (!beam.isValid || coord_def(beam.tx, beam.ty) == you.pos())
{
diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc
index b5a19d385c..7d450a8f7d 100644
--- a/crawl-ref/source/spells3.cc
+++ b/crawl-ref/source/spells3.cc
@@ -187,21 +187,10 @@ bool detect_curse(bool suppress_msg)
return (success);
} // end detect_curse()
-int cast_smiting(int power)
+int cast_smiting(int power, dist &beam)
{
bool success = false;
- struct dist beam;
- struct monsters *monster = 0; // NULL {dlb}
-
- mpr("Smite whom?", MSGCH_PROMPT);
-
- direction( beam, DIR_TARGET, TARG_ENEMY );
-
- if (!beam.isValid)
- {
- canned_msg(MSG_OK);
- return (-1);
- }
+ monsters *monster = 0; // NULL {dlb}
if (mgrd[beam.tx][beam.ty] == NON_MONSTER
|| beam.isMe)
@@ -276,11 +265,9 @@ int airstrike(int power, dist &beam)
return (success);
} // end airstrike()
-int cast_bone_shards(int power)
+int cast_bone_shards(int power, bolt &beam)
{
bool success = false;
- struct bolt beam;
- struct dist spelld;
if (you.equip[EQ_WEAPON] == -1
|| you.inv[you.equip[EQ_WEAPON]].base_type != OBJ_CORPSES)
@@ -291,9 +278,6 @@ int cast_bone_shards(int power)
mpr("The corpse collapses into a mass of pulpy flesh.");
else
{
- if (spell_direction(spelld, beam) == -1)
- return (-1);
-
// practical max of 100 * 15 + 3000 = 4500
// actual max of 200 * 15 + 3000 = 6000
power *= 15;
diff --git a/crawl-ref/source/spells3.h b/crawl-ref/source/spells3.h
index 8d8a77e1b0..067117f979 100644
--- a/crawl-ref/source/spells3.h
+++ b/crawl-ref/source/spells3.h
@@ -14,6 +14,7 @@
struct dist;
+struct bolt;
// updated 24may2000 {dlb}
/* ***********************************************************************
@@ -33,7 +34,7 @@ int airstrike(int power, dist &beam);
/* ***********************************************************************
* called from: spell
* *********************************************************************** */
-int cast_bone_shards(int power);
+int cast_bone_shards(int power, bolt &);
// updated 24may2000 {dlb}
@@ -61,7 +62,7 @@ bool cast_selective_amnesia(bool force);
/* ***********************************************************************
* called from: ability - spell
* *********************************************************************** */
-int cast_smiting(int power);
+int cast_smiting(int power, dist &);
// updated 24may2000 {dlb}
diff --git a/crawl-ref/source/spells4.cc b/crawl-ref/source/spells4.cc
index a57bdb0245..19a2ff0f22 100644
--- a/crawl-ref/source/spells4.cc
+++ b/crawl-ref/source/spells4.cc
@@ -866,6 +866,7 @@ static int sleep_monsters(int x, int y, int pow, int garbage)
if (menv[mnstr].has_ench(ENCH_SLEEP_WARY)) return 0;
menv[mnstr].behaviour = BEH_SLEEP;
+ menv[mnstr].add_ench(ENCH_SLEEPY);
menv[mnstr].add_ench(ENCH_SLEEP_WARY);
if (mons_class_flag( menv[mnstr].type, M_COLD_BLOOD ) && coinflip())
@@ -2356,6 +2357,7 @@ void cast_fragmentation(int pow) // jmf: ripped idea from airstrike
blast.set_target(beam);
blast.is_tracer = false;
blast.flavour = BEAM_FRAG;
+ blast.hit = AUTOMATIC_HIT;
// Number of dice vary... 3 is easy/common, but it can get as high as 6.
blast.damage = dice_def( 0, 5 + pow / 10 );
@@ -2972,11 +2974,9 @@ int cast_apportation(int pow)
return (done);
}
-void cast_sandblast(int pow)
+void cast_sandblast(int pow, bolt &beam)
{
bool big = true;
- struct dist spd;
- struct bolt beam;
// this type of power manipulation should be done with the others,
// currently over in it_use2.cc (ack) -- bwr
@@ -2988,19 +2988,11 @@ void cast_sandblast(int pow)
{
int wep = you.equip[EQ_WEAPON];
if (you.inv[wep].base_type == OBJ_MISSILES
- && (you.inv[wep].sub_type == MI_STONE || you.inv[wep].sub_type == MI_LARGE_ROCK))
+ && (you.inv[wep].sub_type == MI_STONE
+ || you.inv[wep].sub_type == MI_LARGE_ROCK))
big = true;
}
- if (spell_direction(spd, beam) == -1)
- return;
-
- if (spd.isMe)
- {
- canned_msg(MSG_UNTHINKING_ACT);
- return;
- }
-
if (big)
{
dec_inv_item_quantity( you.equip[EQ_WEAPON], 1 );
diff --git a/crawl-ref/source/spells4.h b/crawl-ref/source/spells4.h
index 92cc3ae0ae..d76921f82a 100644
--- a/crawl-ref/source/spells4.h
+++ b/crawl-ref/source/spells4.h
@@ -39,7 +39,7 @@ void cast_intoxicate(int pow);
void cast_mass_sleep(int pow);
void cast_passwall(int pow);
void cast_rotting(int pow);
-void cast_sandblast(int powc);
+void cast_sandblast(int powc, bolt &beam);
void cast_see_invisible(int pow);
void cast_shatter(int pow);
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index eb39ad7953..03efe0b96c 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -668,7 +668,7 @@ bool cast_a_spell(void)
random_uselessness( 2 + random2(7), 0 );
else
{
- const int cast_result = your_spells( spell );
+ const spret_type cast_result = your_spells( spell );
if (cast_result == SPRET_ABORT)
return (false);
@@ -852,7 +852,7 @@ static bool spell_is_uncastable(int spell)
// returns SPRET_SUCCESS if spell is successfully cast for purposes of
// exercising, SPRET_FAIL otherwise, or SPRET_ABORT if the player canceled
// the casting.
-int your_spells( int spc2, int powc, bool allow_fail )
+spret_type your_spells( int spc2, int powc, bool allow_fail )
{
int dem_hor = 0;
int dem_hor2 = 0;
@@ -880,11 +880,11 @@ int your_spells( int spc2, int powc, bool allow_fail )
testbits( flags, SPFLAG_GRID ) ? DIR_TARGET :
testbits( flags, SPFLAG_DIR ) ? DIR_DIR : DIR_NONE);
+ const char *prompt = get_spell_target_prompt(spc2);
if (dir == DIR_DIR)
- mpr("Which direction? ", MSGCH_PROMPT);
+ mpr(prompt? prompt : "Which direction? ", MSGCH_PROMPT);
- if (spell_direction( spd, beam, dir, targ,
- get_spell_target_prompt(spc2) ) == -1)
+ if (spell_direction( spd, beam, dir, targ, prompt ) == -1)
return (SPRET_ABORT);
if (testbits( flags, SPFLAG_NOT_SELF ) && spd.isMe)
@@ -939,7 +939,7 @@ int your_spells( int spc2, int powc, bool allow_fail )
&& you.piety >= 100 && random2(150) <= you.piety))
{
canned_msg(MSG_NOTHING_HAPPENS);
- return (0);
+ return SPRET_FAIL;
}
unsigned int sptype = 0;
@@ -1194,8 +1194,7 @@ int your_spells( int spc2, int powc, bool allow_fail )
break;
case SPELL_SMITING:
- if (cast_smiting(powc) == -1)
- return (SPRET_ABORT);
+ cast_smiting(powc, spd);
break;
case SPELL_REPEL_UNDEAD:
@@ -1416,8 +1415,7 @@ int your_spells( int spc2, int powc, bool allow_fail )
break;
case SPELL_BONE_SHARDS:
- if (cast_bone_shards(powc) == -1)
- return (SPRET_ABORT);
+ cast_bone_shards(powc, beam);
break;
case SPELL_BANISHMENT:
@@ -1710,8 +1708,16 @@ int your_spells( int spc2, int powc, bool allow_fail )
break;
case SPELL_SLEEP:
- zapping(ZAP_SLEEP, powc, beam);
+ {
+ const int sleep_power =
+ stepdown_value( powc * 9 / 10, 5, 35, 45, 50 );
+#ifdef DEBUG_DIAGNOSTICS
+ mprf(MSGCH_DIAGNOSTICS, "Sleep power stepdown: %d -> %d",
+ powc, sleep_power);
+#endif
+ zapping(ZAP_SLEEP, sleep_power, beam);
break;
+ }
case SPELL_MASS_SLEEP:
cast_mass_sleep(powc);
@@ -1796,7 +1802,7 @@ int your_spells( int spc2, int powc, bool allow_fail )
break;
case SPELL_SANDBLAST:
- cast_sandblast(powc);
+ cast_sandblast(powc, beam);
break;
case SPELL_ROTTING:
@@ -1853,7 +1859,7 @@ int your_spells( int spc2, int powc, bool allow_fail )
spellcasting_side_effects(spc2);
- return (true);
+ return (SPRET_SUCCESS);
} // end you_spells()
void exercise_spell( int spell, bool spc, bool success )
diff --git a/crawl-ref/source/spl-cast.h b/crawl-ref/source/spl-cast.h
index 30f5a49c2e..04557a95d7 100644
--- a/crawl-ref/source/spl-cast.h
+++ b/crawl-ref/source/spl-cast.h
@@ -14,6 +14,8 @@
#ifndef SPL_CAST_H
#define SPL_CAST_H
+#include "enum.h"
+
char list_spells( void );
int spell_fail( int spell );
int calc_spell_power( int spell, bool apply_intel, bool fail_rate_chk = false );
@@ -37,7 +39,7 @@ bool cast_a_spell( void );
/* ***********************************************************************
* called from: ability - debug - it_use3 - spell
* *********************************************************************** */
-int your_spells( int spc2, int powc = 0, bool allow_fail = true );
+spret_type your_spells( int spc2, int powc = 0, bool allow_fail = true );
// last updated 12may2000 {dlb}
/* ***********************************************************************
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index 758514fe91..f588cbdae8 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -291,7 +291,7 @@
},
{
- SPELL_PARALYZE, "Paralyze",
+ SPELL_PARALYZE, "Paralyse",
SPTYP_ENCHANTMENT,
SPFLAG_DIR_OR_TARGET,
4,
@@ -469,9 +469,9 @@
{
SPELL_SMITING, "Smiting",
SPTYP_HOLY,
- SPFLAG_NONE,
+ SPFLAG_TARGET | SPFLAG_NOT_SELF,
4,
- NULL
+ "Smite whom?"
},
{
@@ -677,7 +677,7 @@
1,
NULL
},
-
+
{
SPELL_VAMPIRIC_DRAINING, "Vampiric Draining",
SPTYP_NECROMANCY,
@@ -873,7 +873,7 @@
{
SPELL_BONE_SHARDS, "Bone Shards",
SPTYP_NECROMANCY,
- SPFLAG_NONE,
+ SPFLAG_DIR_OR_TARGET,
3,
NULL
},
diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc
index fc16f70628..b0465fb75c 100644
--- a/crawl-ref/source/spl-util.cc
+++ b/crawl-ref/source/spl-util.cc
@@ -685,7 +685,8 @@ char spell_direction( struct dist &spelld, struct bolt &pbolt,
targeting_type restrict, int mode,
const char *prompt )
{
- message_current_target();
+ if (restrict != DIR_DIR)
+ message_current_target();
direction( spelld, restrict, mode, false, prompt );
diff --git a/crawl-ref/source/stuff.cc b/crawl-ref/source/stuff.cc
index 31aa0de613..74c9250bdd 100644
--- a/crawl-ref/source/stuff.cc
+++ b/crawl-ref/source/stuff.cc
@@ -376,6 +376,14 @@ void end(int exit_code, bool print_error, const char *format, ...)
error += "\n";
fprintf(stderr, "%s", error.c_str());
}
+
+#if defined(WIN32CONSOLE) || defined(DOS)
+ if (exit_code)
+ {
+ fprintf(stderr, "Hit Enter to continue...\n");
+ getchar();
+ }
+#endif
exit(exit_code);
}
diff --git a/crawl-ref/source/util/levcomp.ypp b/crawl-ref/source/util/levcomp.ypp
index 83ae14bf5e..f917ad37e6 100644
--- a/crawl-ref/source/util/levcomp.ypp
+++ b/crawl-ref/source/util/levcomp.ypp
@@ -31,7 +31,7 @@ void yyerror(const char *e)
{
fprintf(stderr, "%s:%d: %s\n", lc_desfile.c_str(), yylineno, e);
// Bail bail bail.
- exit(1);
+ end(1);
}
%}
diff --git a/crawl-ref/source/version.h b/crawl-ref/source/version.h
index 0ba1443422..19b3b2deb7 100644
--- a/crawl-ref/source/version.h
+++ b/crawl-ref/source/version.h
@@ -37,7 +37,7 @@
#define CRAWL "Dungeon Crawl Stone Soup"
-#define VER_NUM "0.2.1"
+#define VER_NUM "0.2.2"
#define VER_QUAL ""
// last updated 07august2001 {mv}
diff --git a/crawl-ref/source/view.cc b/crawl-ref/source/view.cc
index 7542bb1428..9e1c719c5f 100644
--- a/crawl-ref/source/view.cc
+++ b/crawl-ref/source/view.cc
@@ -450,6 +450,9 @@ unsigned short dos_brand( unsigned short colour,
screen_buffer_t colour_code_map( int x, int y, bool item_colour,
bool travel_colour )
{
+ if (!is_terrain_known(x + 1, y + 1))
+ return (BLACK);
+
// XXX: Yes, the map array and the grid array are off by one. -- bwr
const unsigned short map_flags = env.map[x][y];
const int grid_value = grd[x + 1][y + 1];
@@ -697,6 +700,11 @@ bool check_awaken(int mons_aw)
struct monsters *monster = &menv[mons_aw];
const int mon_holy = mons_holiness(monster);
+ // Monsters put to sleep by ensorcelled hibernation will sleep
+ // at least one turn.
+ if (monster->has_ench(ENCH_SLEEPY))
+ return (false);
+
// berserkers aren't really concerned about stealth
if (you.berserker)
return (true);