summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/docs/aptitudes.txt68
-rw-r--r--crawl-ref/docs/develop/tiles_creation.txt499
-rw-r--r--crawl-ref/source/art-data.h4
-rw-r--r--crawl-ref/source/art-data.txt4
-rw-r--r--crawl-ref/source/artefact.cc5
-rw-r--r--crawl-ref/source/dat/descript/items.txt6
-rw-r--r--crawl-ref/source/dat/entry.des2
-rw-r--r--crawl-ref/source/dat/large.des2
-rw-r--r--crawl-ref/source/dat/sewer.des23
-rw-r--r--crawl-ref/source/dat/shoals.des11
-rw-r--r--crawl-ref/source/dat/trove.des2
-rw-r--r--crawl-ref/source/dat/wizlab.des102
-rw-r--r--crawl-ref/source/dgn-shoals.cc25
-rw-r--r--crawl-ref/source/dungeon.cc82
-rw-r--r--crawl-ref/source/dungeon.h6
-rw-r--r--crawl-ref/source/effects.cc13
-rw-r--r--crawl-ref/source/enum.h17
-rw-r--r--crawl-ref/source/ghost.cc2
-rw-r--r--crawl-ref/source/item_use.cc35
-rw-r--r--crawl-ref/source/itemprop-enum.h18
-rw-r--r--crawl-ref/source/itemprop.cc12
-rw-r--r--crawl-ref/source/makeitem.cc173
-rw-r--r--crawl-ref/source/message.cc3
-rw-r--r--crawl-ref/source/mon-act.cc5
-rw-r--r--crawl-ref/source/mon-data.h30
-rw-r--r--crawl-ref/source/mon-gear.cc3
-rw-r--r--crawl-ref/source/mon-pick.cc12
-rw-r--r--crawl-ref/source/mon-util.cc12
-rw-r--r--crawl-ref/source/monster.cc6
-rw-r--r--crawl-ref/source/mutation.cc8
-rw-r--r--crawl-ref/source/newgame.cc57
-rw-r--r--crawl-ref/source/ng-init.cc8
-rw-r--r--crawl-ref/source/player.h3
-rw-r--r--crawl-ref/source/quiver.cc8
-rw-r--r--crawl-ref/source/quiver.h2
-rw-r--r--crawl-ref/source/religion.cc2
-rw-r--r--crawl-ref/source/rltiles/UNUSED/hand_crossbow.png (renamed from crawl-ref/source/rltiles/item/weapon/hand_crossbow.png)bin657 -> 657 bytes
-rw-r--r--crawl-ref/source/rltiles/UNUSED/hand_crossbow2.png (renamed from crawl-ref/source/rltiles/item/weapon/hand_crossbow2.png)bin742 -> 742 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-corpse.txt11
-rw-r--r--crawl-ref/source/rltiles/dc-dngn.txt12
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_E.pngbin0 -> 1038 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_N.pngbin0 -> 1024 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_S.pngbin0 -> 1018 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_W.pngbin0 -> 1080 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NE.pngbin0 -> 959 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NW.pngbin0 -> 971 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SE.pngbin0 -> 955 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SW.pngbin0 -> 955 bytes
-rw-r--r--crawl-ref/source/rltiles/dc-item.txt2
-rw-r--r--crawl-ref/source/shopping.cc4
-rw-r--r--crawl-ref/source/skills.cc2
-rw-r--r--crawl-ref/source/skills2.cc68
-rw-r--r--crawl-ref/source/tags.h2
-rw-r--r--crawl-ref/source/tilepick.cc22
-rw-r--r--crawl-ref/source/tilereg.cc70
-rw-r--r--crawl-ref/source/tutorial.cc3
-rw-r--r--crawl-ref/source/wiz-mon.cc12
57 files changed, 1006 insertions, 472 deletions
diff --git a/crawl-ref/docs/aptitudes.txt b/crawl-ref/docs/aptitudes.txt
index 6a20fd5f68..f1631a552e 100644
--- a/crawl-ref/docs/aptitudes.txt
+++ b/crawl-ref/docs/aptitudes.txt
@@ -33,7 +33,7 @@ Evo - Evocations
Slg - Slings Ice - Ice Magic
Exp - Experience Bws - Bows Air - Air Magic
Crb - Crossbows Ear - Earth Magic
- Drt - Darts Poi - Poison Magic
+ Poi - Poison Magic
Arm Ddg Sth Stb Shd T&D Inv Evo Exp
@@ -73,41 +73,41 @@ Vampire 140 90 50 90 110 100 120 90 150
Arm Ddg Sth Stb Shd T&D Inv Evo Exp
- Fgt SBl LBl Axs M&F Pla Stv U C Thr Slg Bws Crb Drt
+ Fgt SBl LBl Axs M&F Pla Stv U C Thr Slg Bws Crb
---------------------------------------------------------------------
-Human 100 100 100 100 100 100 100 100 100 100 100 100 100
-High Elf 100 70 70 130 150 150 100 130 80 140 60 100 90
-Deep Elf 150 100 110 150 170 170 100 130 80 140 80 80 80
-Sludge Elf 80 110 110 130 140 140 100 80 70 100 100 100 100
-Mountain Dwarf 70 80 90 70 70 110 120 100 120 120 150 90 120
-Deep Dwarf 110 120 100 90 100 120 110 120 120 90 180 90 120
-Hill Orc 70 100 80 70 80 80 110 90 100 130 120 120 130
-Merfolk 80 70 90 140 150 50 130 90 100 150 140 140 100
-Halfling 120 60 100 120 150 160 130 140 60 50 70 90 50
-Kobold 80 60 140 110 100 150 110 100 60 70 90 80 50
-Spriggan 150 90 140 150 160 180 150 130 90 70 70 100 70
-Naga 100 100 100 100 100 100 120 100 120 120 120 120 120
-Centaur 100 120 110 110 110 110 110 100 60 80 60 90 80
-Ogre 70 200 180 180 90 110 120 110 80 180 180 180 180
-Troll 140 150 150 150 130 150 150 100 130 180 180 180 180
-Minotaur 70 70 70 70 70 70 70 80 90 90 90 90 90
-Kenku 100 80 80 80 80 80 80 80 90 100 80 80 90
-Draconian Red 90 100 100 100 100 100 100 100 120 120 120 120 120
- White 90 100 100 100 100 100 100 100 120 120 120 120 120
- Green 90 100 100 100 100 100 100 100 120 120 120 120 120
- Yellow 90 100 100 100 100 100 100 100 120 120 120 120 120
- Grey 90 100 100 100 100 100 100 100 120 120 120 120 120
- Black 90 100 100 100 100 100 100 100 120 120 120 120 120
- Purple 90 100 100 100 100 100 100 100 120 120 120 120 120
- Mottled 90 100 100 100 100 100 100 100 120 120 120 120 120
- Pale 90 100 100 100 100 100 100 100 120 120 120 120 120
-Demigod 110 110 110 110 110 110 110 110 110 110 110 110 110
-Demonspawn 100 110 110 110 110 110 110 110 110 110 110 110 110
-Mummy 100 140 140 140 140 140 140 140 140 140 140 140 140
-Ghoul 80 110 110 110 110 110 110 80 130 130 130 130 130
-Vampire 110 90 100 110 140 110 140 90 140 140 140 140 140
+Human 100 100 100 100 100 100 100 100 100 100 100 100
+High Elf 100 70 70 130 150 150 100 130 80 140 60 100
+Deep Elf 150 100 110 150 170 170 100 130 80 140 80 110
+Sludge Elf 80 110 110 130 140 140 100 80 70 100 100 100
+Mountain Dwarf 70 80 90 70 70 110 120 100 120 120 150 90
+Deep Dwarf 110 120 100 90 100 120 110 120 120 90 180 90
+Hill Orc 70 100 80 70 80 80 110 90 100 130 120 120
+Merfolk 80 70 90 140 150 50 130 90 100 150 140 140
+Halfling 120 60 100 120 150 160 130 140 60 50 70 90
+Kobold 80 60 140 110 100 150 110 100 60 70 90 80
+Spriggan 150 90 140 150 160 180 150 130 90 70 70 100
+Naga 100 100 100 100 100 100 120 100 120 120 120 120
+Centaur 100 120 110 110 110 110 110 100 60 80 60 90
+Ogre 70 200 180 180 90 110 120 110 80 180 180 180
+Troll 140 150 150 150 130 150 150 100 130 180 180 180
+Minotaur 70 70 70 70 70 70 70 80 90 90 90 90
+Kenku 100 80 80 80 80 80 80 80 90 100 80 80
+Draconian Red 90 100 100 100 100 100 100 100 120 120 120 120
+ White 90 100 100 100 100 100 100 100 120 120 120 120
+ Green 90 100 100 100 100 100 100 100 120 120 120 120
+ Yellow 90 100 100 100 100 100 100 100 120 120 120 120
+ Grey 90 100 100 100 100 100 100 100 120 120 120 120
+ Black 90 100 100 100 100 100 100 100 120 120 120 120
+ Purple 90 100 100 100 100 100 100 100 120 120 120 120
+ Mottled 90 100 100 100 100 100 100 100 120 120 120 120
+ Pale 90 100 100 100 100 100 100 100 120 120 120 120
+Demigod 110 110 110 110 110 110 110 110 110 110 110 110
+Demonspawn 100 110 110 110 110 110 110 110 110 110 110 110
+Mummy 100 140 140 140 140 140 140 140 140 140 140 140
+Ghoul 80 110 110 110 110 110 110 80 130 130 130 130
+Vampire 110 90 100 110 140 110 140 90 140 140 140 140
---------------------------------------------------------------------
- Fgt SBl LBl Axs M&F Pla Stv U C Thr Slg Bws Crb Drt
+ Fgt SBl LBl Axs M&F Pla Stv U C Thr Slg Bws Crb
Spc Coj Enc Sum Nec Trl Trm Fir Ice Air Ear Poi
diff --git a/crawl-ref/docs/develop/tiles_creation.txt b/crawl-ref/docs/develop/tiles_creation.txt
index 1c86d59ca4..8aeb643a62 100644
--- a/crawl-ref/docs/develop/tiles_creation.txt
+++ b/crawl-ref/docs/develop/tiles_creation.txt
@@ -1,106 +1,441 @@
A short guide to Tiles creation
===============================
-This is a short guide to creating tiles. We assume that you've got some kind of
-image editing software (such as Photoshop or the GIMP) as well as some basic
-knowledge of how to use it. While the fancier functions can occasionally come
-in useful, the simple tools for drawing, selection and erasing of pixels will
-usually suffice.
+This document aims to give a simultaneously short and detailed explanation
+about everything you need to know if you want to design tiles for Dungeon Crawl
+Stonesoup. You can also find this text, and potentially a more up-to-date
+version of it, at:
+http://crawl.develz.org/wiki/doku.php?id=dcss:help:tiles_creation
-You may want to download the latest source or even the trunk version. Either
+
+Table of Contents
+=================
+1. The Tools
+2. Grabbing the source
+3. Basic design principles
+ 3.1 Format and size
+ 3.2 Icons
+ 3.3 Proportions
+ 3.4 Perspective
+ 3.5 Colouring
+ 3.6 Outline
+ 3.7 Shading
+ 3.8 Transparency
+4. Creating tiles
+ 4.1 Reuse existing tiles
+ 4.2 Pixel art tutorials
+ 4.3 Wielded weapons
+ 4.4 Semi-transparency
+5. Modifying the code base
+ 5.1 Defining tiles
+ 5.2 Making Crawl use the tiles
+ 5.3 Artefact tiles
+ 5.4 Dynamic weapons
+ 5.5 Variant tiles
+6. Compiling the game
+7. Tiles suggestions
+8. Submitting your tiles
+
+
+1. The Tools
+============
+
+First, you'll need some image editing software such as Photoshop or
+the GIMP (http://www.gimp.org/downloads/) as well as some basic knowledge of
+how to use it.
+
+While the fancier functions and filters can occasionally come in useful, the
+simpler tools for drawing and selection will usually suffice. Before starting,
+try to acquaint yourself with the different-sized "pencils" and erasers,
+different-shaped selection tools, the paint bucket used for filling larger
+areas, and the colour selection.
+
+Also, while a drawing tablet is certainly useful, it is by no means required.
+
+
+2. Grabbing the source
+======================
+
+You may want to download the source package or even the trunk version. Either
way, the source/rltiles/ directory contains all tiles used in the game, and
some more that are currently unused. While you can create new tiles without
having access to existing ones, it can be useful to have them around for
-comparison. Also, you'll probably want to compile them into the game to test
-your creations. (You don't have to, though.) For compiling the game, see
-INSTALL.txt.
-If you're going to change anything in the main code you'll probably want to
+comparison.
+
+You can download the latest source from the usual release site:
+http://sourceforge.net/projects/crawl-ref/files/
+
+To download the development version, you'll need to install and use git.
+See docs/develop/git/quickstart.txt for further instructions.
+
+Also, you'll probably want to compile your tiles into the game to test your
+creations. (You don't have to, though.)
+It is recommended that you first try to get the game compiled without any
+changes. See INSTALL.txt for instructions.
+
+If you're going to change anything in the main code you might also want to
create a patch. See docs/patch_guide.txt for help with that.
-Crawl's tiles are png files in a format of 32x32 pixels. Larger tiles such
+
+3. Basic design principles
+==========================
+
+3.1 Format and size
+-------------------
+
+Stonesoup's tiles are png files in a format of 32x32 pixels. Larger tiles such
as for the pandemonium demons are possible, but require additional coding and
-should be used sparingly. The tile background should be transparent, but if
-your image software doesn't support png files with transparent background you
-can also submit a png or bmp with the background coloured differently from the
-rest of the tile, so we can easily remove it later.
-
-
-1.) Before setting out to draw a new tile, you may want to check out the
- UNUSED/ directory in case there's already a tile that could be used for
- this purpose.
-
-2.) When creating new tiles you often don't need to start from zero. A lot of
- the time existing tiles can be repurposed to other uses. If you tweak them
- enough no-one will even notice you cheated.
- For example, the spell tile deaths_door.png is basically a modified version
- of the reaper, with the hour glass copied over from the slowing potion's
- i-slowing.png that was then changed significantly.
-
-3.) For items and monsters don't forget to add a shadow. You can use standard
- black for this.
-
-4.) New randart weapons and armour items need not only a tile for the item
- itself but also a smaller variant for the player doll to wield or wear.
- To define the new artefact tiles, you'll need to modify two files:
- source/art-data.txt, and rltiles/dc-player.txt, with the details nicely
- described in art-data.txt.
- If you have perl installed, run "perl art-data.pl" from source/util. If you
- made any mistakes in modifying the two files the script will complain.
-
- If an artefact doesn't get a special equipment tile the base type's tile
- will be used instead.
-
-5.) Otherwise, add the tile to the relevant dc-xxxx.txt file and use the same
- (uppercase) definition in the matching tileidx_xxxx() function in
- tilepick.cc. Note that the latter is not necessary if you are adding tiles
- for the player doll.
-
- Tiles are assumed to have been placed within the rltiles/ directory
- structure. You can use a relative path for the tile definition, or you can
- use the %sdir command to change the current default relative path.
-
- Use the %rim property to control whether Crawl needs to draw a black
- outline around your tile or whether it already has one. To change the rim
- property for your tile, use e.g.:
- %rim 1
- new_tile NEW_TILE
- %rim 0
-
-6.) For humanoid monsters' tiles you may want to add a line in
- get_weapon_offset() in tilemcache.cc to allow it to be drawn with a wielded
- weapon.
-
-7.) New monsters may also need a unique corpse tile. In that case you'll also
- need to modify dc-corpse.txt and add a tile in _tileidx_corpse() of
- tilepick.cc.
+should be used sparingly.
+
+Background tiles (walls and floor) should cover the entire square, whereas
+foreground images can use the whole area but are usually smaller. Also keep
+in mind that hiding the background often equals a loss of information, and
+that especially for monsters we might also need to fit some status icons into
+the tile.
+
+In the inventory area, items and spells are getting displayed with a two-pixel
+coloured border around them. Tiles may overlap this border, but it looks a bit
+odd if they do, so it's better to keep their size at 28x28 pixels.
+
+3.2 Icons
+---------
+
+Subtype icons for potions need to fit inside the label, so may be at most
+14x15 pixels large. It seems prudent to apply the same size restrictions to
+other subtype or brand icons.
+
+For status effect icons, you need to take into account that we might need to
+display several of them at the same time, so these icons should have a customary
+size of up to 8x8 or 10x10 pixels, though they don't need to be square, of
+course. Larger icons are of course possible, but should be used sparingly as
+there's always the danger that they might not fit.
+
+Icon tiles are always placed on top of the base tile, beginning at its top left
+corner for icons smaller than 32x32 pixels, and then moved by an offset that
+is hardcoded for the status effects, numbers etc.
+
+3.3 Proportions
+---------------
+
+Humans and other creatures are proportioned more or less realistically, with the
+entire body usually equaling about five times the height of its head. The less
+humanoid the creature, the less important this becomes, but really //cartoonish//
+monster tiles would stand out against the others.
+
+The height of monsters is independent of monster size, i.e. a dragon, goblin and
+curse toe may all fill their respective tiles. Similarly, the greater size of
+pandemonium lords does not reflect their body size, but rather is supposed to
+underline their being special monsters.
+
+The same holds for items, which is why armour and weapon tiles usually come in two
+varieties: a large version for the inventory display and a smaller one for the
+player doll (and, in the case of weapons, monsters).
+
+3.4 Perspective
+---------------
+
+Any item or monster should fit into the allocated space in its entirety, legs
+and all. This restriction may only be loosened if the chopped portions are
+never visible to the player, for example because they are always covered by
+water or lava.
+
+Ideally, both monsters and items should be depicted at a slight angle from the
+front or side, so you can see both its face and profile.
+
+3.5 Colouring
+-------------
+
+In theory, tiles can use any colour within the spectrum of visible colours.
+However, very small gradients are almost unnoticeable, so try to pick sensible
+colours that are easy to see even on dark background. It is generally
+recommended to pick two or, rarely, three base colours and use gradients for
+further differentiation.
+
+Avoid really dark colours as they tend to blend into the background for most
+level types. Also, for monsters take into account on which textures you'll
+usually be encountering the tile, and try to choose colours that are easy to
+make out against such background.
+
+At the same time, try to avoid garish colours or contrasts, as they can be
+quite distracting in a game.
+
+3.6 Outline
+-----------
+
+All tiles that don't fill the entire square should get a black outline. You can
+add it manually or tell Crawl to do it later when creating the tile maps. In
+particular, this means that for non-outlined tiles there should be a border of
+at least 1 pixel around the entire tile.
+
+3.7 Shading
+-----------
+
+Item and monster tiles should always include a shadow on the ground, which you
+can draw using standard black.
+
+The imaginary light source is always above and in front of the depicted object,
+so that most of it is properly lighted and the shadow falls (for animals) in
+direction of its tail or backside.
+
+For creatures directly facing the player as well as inanimate items and
+features the default light source origin is in front of it and to the upper
+left, so that the resulting shadow falls slightly behind the tile and to its
+lower right.
+
+Icons may use shading to make them look more 3dimensional, but they don't have
+to, and they don't get a shadow of their own.
+
+3.8 Transparency
+----------------
+
+Foreground tiles should have a transparent background, so they can be properly
+drawn on top of the background tile, but if your image software doesn't support
+png files with transparent background you can also submit a png or bmp with the
+background coloured differently from the rest of the tile, so we can easily
+make it transparent later-on.
+
+
+4. Creating tiles
+=================
+
+4.1 Reuse existing tiles
+------------------------
+
+Whenever you're faced with the task of creating a new tile, consider whether
+you can reuse an existing tile, either because it is currently not seeing use
+(check out the rltiles/UNUSED directory for this) or because it can easily be
+tweaked by adding details or changing its colour. Flipping or rotating (part
+of) a tile can make a huge difference already, and sometimes a combinition of
+parts taken from different existing tiles can be used to great effect.
+
+For human monsters, usually uniques, in addition the in-game doll editor
+(reachable via the '-' command) can be used to create good-looking tiles. If
+you do this, please use non-standard equipment for your player doll, so the
+odds of the player running into a look-alike are low.
+4.2 Pixel art tutorials
+-----------------------
+
+We really recommend the following tutorials to anyone interested in tiles
+design:
+
+ * http://www.derekyu.com/?page_id=219
+ A well-written introduction to the techniques of pixel art.
+
+ * http://gamesprites.wikicomplete.info/tutorial:sprite-art-101-basic-depth
+ A simple little tutorial on shading and depth perception.
+
+ * http://gas13.ru/v3/tutorials/sywtbapa_almighty_grass_tile.php
+ A detailed explanation of how to create the perfect pixels. Several
+ chapters dealing with scenery and sprite design. Also covers the elusive
+ difference between art and _good_ art. Makes me want to go back and redo
+ all my tiles designs. (jpeg)
+
+4.3 Wielded weapons
+-------------------
+
+Humanoid monsters, in particular uniques, will usually be facing to the left
+with their right hand outstretched so they can be displayed wielding their
+current weapon, which is added into the tile dynamically.
+(For this to look good, the hand needs to be or at least include a rectangle of
+2x3 pixels, which can be a bit tricky sometimes.)
+
+If the monster is a spellcaster or has a predefined weapon it is guaranteed to
+wield you can ignore this step and get by without a weapon or add a static one.
+Even for melee-centric monsters this is not necessary, but displaying the
+wielded weapon is a really nice perk to playing the tiles version and should be
+used whenever possible.
+
+4.4 Semi-transparency
+---------------------
+
+For some features or monsters you might need part or the entirety of the tile
+to be see-though semi-transparent. Examples include ghosts, the water/lava
+masks, or clouds.
+
+I usually do this by means of the eraser, set the size to the maximum possible
+and the opacity to around 34%, and then "erase" the entire area I want to be
+semi-transparent, having previously selected it.
+
+
+5. Modifying the code base
+==========================
+
+If you are uncomfortable with changing the code or compiling the game, you can
+simply submit your creations and leave the rest to us. :)
+
+5.1 Defining tiles
+------------------
+
+Tiles are assumed to have been placed within the rltiles/ directory structure.
+You can use a relative path for the tile definition, or you can use the %sdir
+command to change the current default relative path.
+
+The definition files are as follows:
+ * dc-corpse.txt: Define corpse tiles that are created automatically based on
+ the corresponding monster tiles.
+ * dc-demon.txt: Define tiles used for the pandemonium lords.
+ * dc-dngn.txt: Define wall, floor and dungeon feature tiles. All tiles
+ defined herein are collapsed into dngn.png and dngn.html.
+ * dc-gui.txt: Includes some other files, whose tiles are included in
+ gui.png and gui.html.
+ * dc-item.txt: Define mundane item tiles.
+ * dc-main.txt: Includes some other files, whose tiles are included in
+ main.png and main.html.
+ * dc-misc.txt: Define tiles for clouds, special effects and status icons.
+ * dc-mon.txt: Define monster tiles excepting pandemonium lords.
+ * dc-player.txt: Define player doll and equipment tiles. All tiles defined
+ here and in included files form player.png and player.html.
+ * dc-spells.txt: Define spell tiles.
+ * dc-unrand.txt: Auto-generated file defining artefact tiles.
+
+Remember that new monsters may also need a new corpse tile if they don't share
+their genus with an already existing monster, in which case you'll need to
+declare the same monster tile in both dc-mon.txt and dc-corpse.txt.
+
+If you are unsure how to add your tile, you can simply check how similar tiles
+are defined, and add yours below, following their example.
+
+Use the %rim property to control whether Crawl needs to draw a black outline
+around your tile or whether it already has one. To change the rim property for
+your tile, use e.g.:
+ %rim 1
+ new_tile NEW_TILE
+ %rim 0
+
+5.2 Making Crawl use the tiles
+------------------------------
+
+If your tile doesn't replace an existing one, you might have to modify the
+code, which is to say tilepick.cc.
+
+Jewellery, potions, scrolls and staves use a hard-coded item order, so you
+really shouldn't have to change anything in the code.
+
+For all others search the file, as necessary, for:
+ * tileidx_armour_base
+ * tileidx_cloud
+ * tileidx_corpse
+ * tileidx_feature
+ * tileidx_food
+ * tileidx_misc
+ * tileidx_missile
+ * tileidx_monster_base
+ * tileidx_rune
+ * tileidx_player (transformations, only)
+ * tileidx_shop
+ * tileidx_spell
+ * tileidx_trap
+ * tileidx_weapon_base
+
+There's probably a TODO comment next to the monster, item, feature or spell in
+question. If not, you will need to add a case/return statement similar to the
+others at the end of the switch loop. This is likely because the object is
+completely new, in which case you're probably the one to add it, so you should
+know the required enum. If you don't know, you can try to find out or simply
+submit the tile and leave the code modifications to the devteam. :)
+
+For the tile enum, use the same (uppercase) definition as defined in the
+dc-xxxx.txt file, while copying the prefix from the other tiles.
+
+5.3 Artefact tiles
+------------------
+
+New randart weapons and armour items need not only a tile for the item
+itself but also a smaller variant for the player doll to wield or wear.
+To define the new artefact tiles, you'll need to modify two files:
+source/art-data.txt, and rltiles/dc-player.txt, with the details nicely
+described in art-data.txt.
+
+If you have perl installed, run "perl art-data.pl" from source/util. If you
+made any mistakes in modifying the two files the script will complain.
+
+If an artefact doesn't get a special equipment tile the base type's tile
+will be used instead.
+
+For the base items you'll need to modify dc-item.txt or dc-unrand.txt as well
+as tilepick.cc, as defined above. For the doll equipment, however, this is
+handled by the perl script and won't be necessary.
+
+5.4 Dynamic weapons
+-------------------
+
+For humanoid monsters' tiles you may want to add a line in get_weapon_offset()
+of tilemcache.cc to allow it to be drawn with a wielded weapon.
+
+The best course of action is probably to start out with adding the monster to
+the first list of monsters with an offset of 0 along either axis, then compile
+to check how it looks. You can use the wizmode &m command to create the monster
+and, if it happens to be unarmed, use 'x' to target the monster, then use the
+&g command to give it a weapon from your inventory. If the monster refuses to
+take your weapon this might be because it is incapable of using weapons, in
+which case you can skip this entire step, or because it can only use weapons it
+was created with, in which case you'll need to make sure it does get a weapon
+in mon-gear.cc and repeat the &m command until you get a version of it wielding
+something. Once you've got this set up, you can just save and restore without
+taking any further steps until you are satisfied with the result.
+
+If the weapon doesn't appear to be held in the monster's hand, add a new case
+block just for your monster and take a guess at the number of pixels the weapon
+needs to move the left/right and up/down to fit. You'll probably have to
+recompile a couple of times, tweaking the offset values each time, until you
+get it right.
+
+5.5 Variant tiles
+-----------------
+
+If your tile is one more variant of a tile that already has several versions,
+you shouldn't need to take any further steps, and the tile should already be
+picked randomly from time to time. The same applies to animated feature tiles.
+
+If you are animating something other than a feature that used to be static,
+more code will be necessary, but this is something that is probably better left
+to the devteam.
+
+
+6. Compiling the game
+=====================
When compiling the game you may need to delete or rename the relevant tile
section's png file, i.e. main.png (for items), player.png (for player, doll
equipment, and monsters), dngn.png (for dungeon features) or gui.png (for
spells), to make the changes take effect. The first step during the compilation
will be to rebuild this file, so you can check right away whether your new tile
-was added correctly. Changes in dc-xxxx.txt automatically cause the relevant
-image files to be recreated.
+was added correctly.
+
+Changes in dc-xxxx.txt automatically cause the relevant image files to be
+recreated.
+
+See INSTALL.txt for compilation instructions. It is recommended that you first
+try to get the game compiled without any changes. If you face any problems,
+don't hesitate to send an email to our crawl-ref-discuss mailing list or the
+rec.games.roguelike.misc newsgroup.
-In case you'd like to draw some tiles but have run out of ideas, here's an
-incomplete (and possibly outdated) list of suggestions:
+7. Tiles suggestions
+====================
-* tiles of the various runes
-* zombie/skeleton tiles taking into account the monster type
-* tiles for abilities
-* alternative tiles for dungeon features to allow for "animations"
-* equipment tiles for the player doll
-* improvement of existing tiles
-etc.
+In case you'd like to draw some tiles but have run out of ideas, check out the
+following links:
-You can also check the SourceForge Feature Requests for tracker items
-containing the "\o/" emblem in the title. At least one of them will be a call
-for more tiles.
+http://crawl.develz.org/wiki/doku.php?id=dcss:brainstorm:tiles:tiles_missing_for_0.6
+http://crawl.develz.org/wiki/doku.php?id=dcss:brainstorm:tiles:tiles_improvement
+http://crawl.develz.org/wiki/doku.php?id=dcss:brainstorm:tiles:tiles_missing_for_wizlabs
-Please submit your new tiles as a new item on our feature request or patches
-tracker, or send one of the tiles developers (ennewalker, evktalo, j-p-e-g) an
-email containing your tiles.
+(Should these links be invalid, check this document's online version:
+ http://crawl.develz.org/wiki/doku.php?id=dcss:help:tiles_creation)
+
+Also, if you have any further suggestions, feel free to add them.
+
+
+8. Submitting your tiles
+========================
+
+Please submit your new tiles as a new item in the Graphics category of our
+Mantis tracker (http://crawl.develz.org/mantis/bug_report_page.php), or send an
+email containing your tiles to one of the tiles developers
+(ennewalker, evktalo, jpeg).
Thanks a lot for your support!
+
+The Dungeon Crawl DevTeam
diff --git a/crawl-ref/source/art-data.h b/crawl-ref/source/art-data.h
index 29f93896bf..ae161b0bbb 100644
--- a/crawl-ref/source/art-data.h
+++ b/crawl-ref/source/art-data.h
@@ -672,7 +672,7 @@
/* UNRAND_SNIPER */
{
"hand crossbow \"Sniper\"", "black crossbow",
- OBJ_WEAPONS, WPN_HAND_CROSSBOW, +10, +0, ETC_DARK, 0,
+ OBJ_WEAPONS, WPN_CROSSBOW, +10, +0, ETC_DARK, 0,
UNRAND_FLAG_NONE,
{
SPWPN_VENOM, 0, 0, 0, 0, 0,
@@ -682,7 +682,7 @@
0, 0, 0, 0, 0, 0,
},
- "A hand crossbow made of some black material.",
+ "A crossbow made of some black material.",
"",
"",
NULL, NULL, NULL, { NULL }, NULL,
diff --git a/crawl-ref/source/art-data.txt b/crawl-ref/source/art-data.txt
index 792b3fcf45..4d142615a1 100644
--- a/crawl-ref/source/art-data.txt
+++ b/crawl-ref/source/art-data.txt
@@ -588,14 +588,14 @@ DESC_END: This powerful staff used to belong to the leader of the Guild of
NAME: hand crossbow "Sniper"
APPEAR: black crossbow
-OBJ: OBJ_WEAPONS/WPN_HAND_CROSSBOW
+OBJ: OBJ_WEAPONS/WPN_CROSSBOW
PLUS: +10/+0
COLOUR: ETC_DARK
TILE: urand_sniper
TILE_EQ: sniper
BRAND: SPWPN_VENOM
BOOL: seeinv
-DESC: A hand crossbow made of some black material.
+DESC: A crossbow made of some black material.
NAME: longbow "Piercer"
APPEAR: very long metal bow
diff --git a/crawl-ref/source/artefact.cc b/crawl-ref/source/artefact.cc
index 71ae7b27cd..228dc51339 100644
--- a/crawl-ref/source/artefact.cc
+++ b/crawl-ref/source/artefact.cc
@@ -773,11 +773,8 @@ void static _get_randart_properties(const item_def &item,
proprt[ARTP_BRAND] = SPWPN_NORMAL;
}
- if (atype == WPN_CROSSBOW && one_chance_in(5)
- || atype == WPN_HAND_CROSSBOW && one_chance_in(10))
- {
+ if (atype == WPN_CROSSBOW && one_chance_in(5))
proprt[ARTP_BRAND] = SPWPN_ELECTROCUTION;
- }
}
}
diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt
index 2b1dc4c4ea..4c528ae6d2 100644
--- a/crawl-ref/source/dat/descript/items.txt
+++ b/crawl-ref/source/dat/descript/items.txt
@@ -461,7 +461,7 @@ It causes massive damage when used for backstabbing.
%%%%
dart
-A small throwing weapon. It can also be fired from a hand crossbow.
+A small throwing weapon.
%%%%
deck of changes
@@ -644,10 +644,6 @@ hand axe
A small axe designed for either hand combat or throwing.
%%%%
-hand crossbow
-
-A small crossbow, for firing darts.
-%%%%
helm
A piece of metal headgear.
diff --git a/crawl-ref/source/dat/entry.des b/crawl-ref/source/dat/entry.des
index 46b5c365b1..fbba5e61eb 100644
--- a/crawl-ref/source/dat/entry.des
+++ b/crawl-ref/source/dat/entry.des
@@ -4520,7 +4520,7 @@ SHUFFLE: 12
MONS: centaur / centaur warrior / yaktaur / yaktaur captain
MONS: ettin / frost giant / hill giant / stone giant / fire giant
MONS: rat / green rat / orange rat / grey rat / quokka
-MONS: giant cockroach / giant ant / soldier ant
+MONS: giant ant / soldier ant
MONS: spiny worm / ant larva / worm
MONS: giant lizard / lindwurm / gila monster / komodo dragon
MAP
diff --git a/crawl-ref/source/dat/large.des b/crawl-ref/source/dat/large.des
index 7106d7313a..fda26b17bb 100644
--- a/crawl-ref/source/dat/large.des
+++ b/crawl-ref/source/dat/large.des
@@ -633,7 +633,7 @@ ENDMAP
NAME: hourglass_vault
ORIENT: southeast
DEPTH: D:12-26
-TAGS: no_rotate
+TAGS: no_rotate no_hmirror
MAP
xxxxxxxxxxxxxx@xxxxxxxxxxxxxxxx
xxxxxx.................xxxxxxxx
diff --git a/crawl-ref/source/dat/sewer.des b/crawl-ref/source/dat/sewer.des
index 3df5fc5afb..d4674e5e1a 100644
--- a/crawl-ref/source/dat/sewer.des
+++ b/crawl-ref/source/dat/sewer.des
@@ -180,20 +180,21 @@ SHUFFLE: deef
ITEM: potion of heal wounds / potion of healing
ITEM: potion of healing / potion of healing q:2 w:5 / \
potion of heal wounds / potion of heal wounds q:2 w:5
-ITEM: potion of restore abilities w:7 / potion of cure mutation / \
+KITEM: f = potion of levitation q:2, \
+ potion of restore abilities w:7 / potion of cure mutation / \
potion of gain intelligence / potion of gain strength / \
potion of gain dexterity
+KFEAT: f = shallow_water
MONS: rat / grey rat / green rat w:2 / nothing w:3
MAP
- xxxxxxxxxxxxxx
- cccCCCCCCCCCCCCxxx xxxxx
- cwXvvvvvvvvvvvCCCxxxx xxCCCxxx
- cwccCCCCCCCCCvvVCCCCxxxxxxC*CCCx
- cwwcxxxxxxxxCCCvvvvCCCCxxCCvvvCx
- ccwc xxxCCCCvvvvCCCCvvvvCx
- cwcc xxxxCCCCvvvvvvvvvCx
- ccwwc xxxxCCCCCCCCCCCx
- cwwwc xxxxxxxxxxxxx
+ cccCCCCCCCCCCCC
+ cwXvvvvvvvvvvvCCC CCC
+ cwccCCCCCCCCCvvVCCCC C*CCC
+ cwwc CCCvvvvCCCC CCvvvC
+ ccwc CCCCvvvvCCCCvvvvC
+ cwcc CCCCvvvvvvvvvC
+ ccwwc CCCCCCCCCCC
+ cwwwc
cwwwc
cwwwc
cWwwc
@@ -558,4 +559,4 @@ OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
-ENDMAP \ No newline at end of file
+ENDMAP
diff --git a/crawl-ref/source/dat/shoals.des b/crawl-ref/source/dat/shoals.des
index c89fea0aad..de2f6bfc3d 100644
--- a/crawl-ref/source/dat/shoals.des
+++ b/crawl-ref/source/dat/shoals.des
@@ -243,14 +243,15 @@ NAME: shoalhut_rune
TAGS: shoal_rune water_ok no_dump allow_dup
SHUFFLE: ABCD
SUBST: A:x, B:x, C:x=, D=+
+SUBST: 0 = 0.
LROCKTILE: wall_vines
MAP
xxCxx
-xx.1.xx
-x.1.1.x
-B1.O.1D
-x.1.1.x
-xx.1.xx
+xx.0.xx
+x.0.0.x
+B0.O.0D
+x.0.0.x
+xx.0.xx
xxAxx
ENDMAP
diff --git a/crawl-ref/source/dat/trove.des b/crawl-ref/source/dat/trove.des
index 224cc528d8..abfa17dd61 100644
--- a/crawl-ref/source/dat/trove.des
+++ b/crawl-ref/source/dat/trove.des
@@ -500,7 +500,7 @@ MONS: dragon skeleton
ITEM: animal skin good_item / any armour good_item
ITEM: gold dragon hide / storm dragon hide / dragon hide / troll hide / any armour good_item
ITEM: arrow good_item / dart good_item / bolt good_item / any missile good_item
-ITEM: bow good_item / crossbow good_item / hand crossbow good_item / any weapon good_item
+ITEM: bow good_item / crossbow good_item / any weapon good_item
SHUFFLE: 123
SHUFFLE: defg
: trove_setup_features(_G)
diff --git a/crawl-ref/source/dat/wizlab.des b/crawl-ref/source/dat/wizlab.des
index 03a12ccc13..97d0669555 100644
--- a/crawl-ref/source/dat/wizlab.des
+++ b/crawl-ref/source/dat/wizlab.des
@@ -884,12 +884,12 @@ ENDMAP
###############################################################################
# Borgnjor's Mortuary
#
-NAME: wizlab_borgnjor
-ORIENT: encompass
+#NAME: wizlab_borgnjor
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Borgnjor's Mortuary")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Borgnjor's Mortuary")
+#MAP
+#ENDMAP
##############################################################################
# Cigotuvi's Fleshworks (by Mu.)
@@ -1068,42 +1068,42 @@ ENDMAP
###############################################################################
# Lee's Rapid Deconstructor
#
-NAME: wizlab_lee
-ORIENT: encompass
+#NAME: wizlab_lee
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Lee's Rapid Deconstructor")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Lee's Rapid Deconstructor")
+#MAP
+#ENDMAP
###############################################################################
# Lehudib's Crystal Spire
#
-NAME: wizlab_lehudib
-ORIENT: encompass
+#NAME: wizlab_lehudib
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Lehudib's Crystal Spire")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Lehudib's Crystal Spire")
+#MAP
+#ENDMAP
###############################################################################
# Maxwell's Forge
#
-NAME: wizlab_maxwell
-ORIENT: encompass
+#NAME: wizlab_maxwell
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Maxwell's Forge")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Maxwell's Forge")
+#MAP
+#ENDMAP
###############################################################################
# Olgreb's Toxic Laboratory
#
-NAME: wizlab_olgreb
-ORIENT: encompass
+#NAME: wizlab_olgreb
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Olgreb's Toxic Laboratory")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Olgreb's Toxic Laboratory")
+#MAP
+#ENDMAP
###############################################################################
# Ozocubu's Refrigerator
@@ -1209,22 +1209,22 @@ ENDMAP
###############################################################################
# Cekugob's Oubliette
#
-NAME: wizlab_cekugob
-ORIENT: encompass
-TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Cekugob's Oubliette")
-MAP
-ENDMAP
+#NAME: wizlab_cekugob
+#ORIENT: encompass
+#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
+#: wizlab_setup(_G, "Cekugob's Oubliette")
+#MAP
+#ENDMAP
###############################################################################
# Zonguldrok's Shrine
#
-NAME: wizlab_zonguldrok
-ORIENT: encompass
+#NAME: wizlab_zonguldrok
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Zonguldrok's Shrine")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Zonguldrok's Shrine")
+#MAP
+#ENDMAP
###############################################################################
# Wucad Mu's Monastery
@@ -1387,32 +1387,32 @@ ENDMAP
###############################################################################
# Boton's Bayou
#
-NAME: wizlab_botono
-ORIENT: encompass
+#NAME: wizlab_botono
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Botono's Bayou")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Botono's Bayou")
+#MAP
+#ENDMAP
###############################################################################
# Ukta's Hut
#
-NAME: wizlab_ukta
-ORIENT: encompass
+#NAME: wizlab_ukta
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "Ukta's Hut")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "Ukta's Hut")
+#MAP
+#ENDMAP
###############################################################################
# The Alchemist's Tower
#
-NAME: wizlab_alchemist
-ORIENT: encompass
+#NAME: wizlab_alchemist
+#ORIENT: encompass
#TAGS: wizlab no_item_gen no_monster_gen no_rotate allow_dup
-: wizlab_setup(_G, "The Alchemist's Tower")
-MAP
-ENDMAP
+#: wizlab_setup(_G, "The Alchemist's Tower")
+#MAP
+#ENDMAP
###############################################################################
# Random and semi-random Wizard vaults
diff --git a/crawl-ref/source/dgn-shoals.cc b/crawl-ref/source/dgn-shoals.cc
index 57025a67d4..7a0764f8e7 100644
--- a/crawl-ref/source/dgn-shoals.cc
+++ b/crawl-ref/source/dgn-shoals.cc
@@ -153,10 +153,12 @@ static coord_def _random_point(int offset = 0)
}
static void _shoals_island_center(const coord_def &c, int n_perturb, int radius,
- int bounce_low, int bounce_high)
+ int bounce_low, int bounce_high,
+ bool make_atoll = false)
{
for (int i = 0; i < n_perturb; ++i) {
- coord_def p = _random_point_from(c, random2(1 + radius));
+ const int thisrad = make_atoll? radius : random2(1 + radius);
+ coord_def p = _random_point_from(c, thisrad);
if (!p.origin())
shoals_heights(p) += random_range(bounce_low, bounce_high);
}
@@ -193,7 +195,7 @@ static void _shoals_build_island()
_shoals_island_center(c, N_PERTURB_ISLAND_CENTER,
random_range(ISLAND_CENTER_RADIUS_LOW,
ISLAND_CENTER_RADIUS_HIGH),
- 40, 60);
+ 40, 60, one_chance_in(5));
const int additional_heights = random2(4);
for (int i = 0; i < additional_heights; ++i) {
const int addition_offset = random_range(2, 10);
@@ -204,7 +206,7 @@ static void _shoals_build_island()
N_PERTURB_OFFSET_HIGH),
random_range(PERTURB_OFFSET_RADIUS_LOW,
PERTURB_OFFSET_RADIUS_HIGH),
- 25, 35);
+ 25, 35, one_chance_in(5));
}
}
@@ -392,16 +394,20 @@ static void _shoals_furniture(int margin)
{
if (at_branch_bottom())
{
+ unwind_var<dungeon_feature_set> vault_exc(dgn_Vault_Excavatable_Feats);
+ dgn_Vault_Excavatable_Feats.insert(DNGN_STONE_WALL);
+
const coord_def c = _pick_shoals_island();
// Put all the stairs on one island.
grd(c) = DNGN_STONE_STAIRS_UP_I;
grd(c + coord_def(1, 0)) = DNGN_STONE_STAIRS_UP_II;
grd(c - coord_def(1, 0)) = DNGN_STONE_STAIRS_UP_III;
+ dgn_excavate(c, dgn_random_direction());
const coord_def p = _pick_shoals_island_distant_from(c);
// Place the rune
const map_def *vault = random_map_for_tag("shoal_rune");
- dgn_ensure_vault_placed(dgn_place_map(vault, false, true, p),
+ dgn_ensure_vault_placed(dgn_place_map(vault, false, false, p),
false);
const int nhuts = std::min(8, int(_shoals_islands.size()));
@@ -934,9 +940,12 @@ static bool _shoals_tide_sweep_actors_clear(coord_def c)
return true;
}
coord_def evacuation_point(_shoals_escape_place_from(c, victim, NULL));
- // The tide moves on even if we cannot evacuate the tile!
- if (!evacuation_point.origin())
- victim->move_to_pos(evacuation_point);
+ // The tide no longer drowns monster/player if it cannot push them
+ // out of the way.
+ if (evacuation_point.origin())
+ return false;
+
+ victim->move_to_pos(evacuation_point);
return true;
}
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 5cae7491fe..d432d479ae 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -248,6 +248,7 @@ FixedVector<unique_item_status_type, MAX_UNRANDARTS> temp_unique_items;
std::set<std::string> Level_Unique_Maps;
std::set<std::string> Level_Unique_Tags;
+dungeon_feature_set dgn_Vault_Excavatable_Feats;
std::string dgn_Build_Method;
std::string dgn_Layout_Type;
@@ -309,7 +310,7 @@ bool builder(int level_number, int level_type)
unwind_bool levelgen(Generating_Level, true);
// N tries to build the level, after which we bail with a capital B.
- int tries = 20;
+ int tries = 50;
while (tries-- > 0)
{
#ifdef DEBUG_DIAGNOSTICS
@@ -845,6 +846,9 @@ void dgn_register_place(const vault_placement &place, bool register_vault)
{
_mask_vault(place, MMT_VAULT | MMT_NO_DOOR);
}
+
+ if (!place.map.has_tag("transparent"))
+ _mask_vault(place, MMT_OPAQUE);
}
if (place.map.has_tag("no_monster_gen"))
@@ -859,9 +863,6 @@ void dgn_register_place(const vault_placement &place, bool register_vault)
if (place.map.has_tag("no_wall_fixup"))
_mask_vault(place, MMT_NO_WALL);
- if (!place.map.has_tag("transparent"))
- _mask_vault(place, MMT_OPAQUE);
-
// Now do per-square by-symbol masking.
for (int y = place.pos.y + place.size.y - 1; y >= place.pos.y; --y)
for (int x = place.pos.x + place.size.x - 1; x >= place.pos.x; --x)
@@ -971,6 +972,12 @@ static bool _valid_dungeon_level(int level_number, int level_type)
return (true);
}
+static void _dgn_init_vault_excavatable_feats()
+{
+ dgn_Vault_Excavatable_Feats.clear();
+ dgn_Vault_Excavatable_Feats.insert(DNGN_ROCK_WALL);
+}
+
void dgn_reset_level()
{
dgn_level_vetoed = false;
@@ -987,6 +994,8 @@ void dgn_reset_level()
level_clear_vault_memory();
dgn_colour_grid.reset(NULL);
+ _dgn_init_vault_excavatable_feats();
+
can_create_vault = true;
use_random_maps = true;
dgn_check_connectivity = false;
@@ -3359,6 +3368,25 @@ static int _place_monster_vector(std::vector<monster_type> montypes,
for (int i = 0; i < num_to_place; i++)
{
mg.cls = montypes[random2(montypes.size())];
+
+ if (player_in_branch( BRANCH_COCYTUS ) &&
+ mons_class_can_be_zombified(mg.cls))
+ {
+ static const monster_type lut[3][2] =
+ {
+ { MONS_SKELETON_SMALL, MONS_SKELETON_LARGE },
+ { MONS_ZOMBIE_SMALL, MONS_ZOMBIE_LARGE },
+ { MONS_SIMULACRUM_SMALL, MONS_SIMULACRUM_LARGE },
+ };
+
+ mg.base_type = mg.cls;
+ int s = mons_skeleton(mg.cls) ? 2 : 0;
+ mg.cls = lut[random_choose_weighted(s, 0, 8, 1, 1, 2, 0)]
+ [mons_zombie_size(mg.base_type) == Z_BIG];
+ }
+
+ else
+ mg.base_type = MONS_NO_MONSTER;
if (place_monster(mg) != -1)
++result;
}
@@ -3421,6 +3449,15 @@ static void _place_aquatic_monsters(int level_number, char level_type)
else if (one_chance_in(20))
swimming_things[i] = MONS_KRAKEN;
}
+ else if (player_in_branch( BRANCH_COCYTUS ))
+ {
+ // Eels are useless when zombified
+ if (swimming_things[i] == MONS_ELECTRIC_EEL)
+ {
+ swimming_things[i] = one_chance_in(4) ? MONS_KRAKEN :
+ MONS_WATER_ELEMENTAL;
+ }
+ }
}
// Don't place sharks in the Swamp.
@@ -3433,9 +3470,6 @@ static void _place_aquatic_monsters(int level_number, char level_type)
if (level_number >= 25 && one_chance_in(5))
swimming_things[0] = MONS_WATER_ELEMENTAL;
- if (player_in_branch(BRANCH_COCYTUS))
- swimming_things[3] = MONS_WATER_ELEMENTAL;
-
_place_monster_vector(swimming_things, level_number,
std::min(random2avg(9, 2)
+ (random2(water_spaces) / 10), 15));
@@ -3835,12 +3869,22 @@ static coord_def _dig_away_dir(const vault_placement &place,
return (dig_dir);
}
-static void _dig_away_from(vault_placement &place, const coord_def &pos)
+// Returns true if the feature can be ovewritten by floor when digging a path
+// from a vault to its surroundings.
+bool dgn_vault_excavatable_feat(dungeon_feature_type feat)
{
- coord_def dig_dir = _dig_away_dir(place, pos);
- coord_def dig_at = pos;
- bool dug = false;
+ return (dgn_Vault_Excavatable_Feats.find(feat) !=
+ dgn_Vault_Excavatable_Feats.end());
+}
+
+coord_def dgn_random_direction()
+{
+ return Compass[random2(8)];
+}
+void dgn_excavate(coord_def dig_at, coord_def dig_dir)
+{
+ bool dug = false;
for (int i = 0; i < GXM; i++)
{
dig_at += dig_dir;
@@ -3851,12 +3895,13 @@ static void _dig_away_from(vault_placement &place, const coord_def &pos)
break;
}
- if (grd(dig_at) == DNGN_ROCK_WALL)
+ const dungeon_feature_type dig_feat(grd(dig_at));
+ if (dgn_vault_excavatable_feat(dig_feat))
{
grd(dig_at) = DNGN_FLOOR;
dug = true;
}
- else if (grd(dig_at) == DNGN_FLOOR && i > 0)
+ else if (dig_feat == DNGN_FLOOR && i > 0)
{
// If the floor square has at least two neighbouring
// non-solid squares, we're done.
@@ -3877,6 +3922,13 @@ static void _dig_away_from(vault_placement &place, const coord_def &pos)
}
}
+static void _dig_away_from(vault_placement &place, const coord_def &pos)
+{
+ coord_def dig_dir = _dig_away_dir(place, pos);
+ coord_def dig_at = pos;
+ dgn_excavate(dig_at, dig_dir);
+}
+
static void _dig_vault_loose( vault_placement &place,
std::vector<coord_def> &targets )
{
@@ -4162,9 +4214,7 @@ static bool _build_secondary_vault(int level_number, const map_def *vault,
no_exits, where))
{
const vault_placement &vp = Level_Vaults[ Level_Vaults.size() - 1 ];
- if (!player_in_branch(BRANCH_SHOALS))
- _connect_vault(vp);
-
+ _connect_vault(vp);
return (true);
}
return (false);
diff --git a/crawl-ref/source/dungeon.h b/crawl-ref/source/dungeon.h
index 38a9aef6d9..9eb1cf0eb2 100644
--- a/crawl-ref/source/dungeon.h
+++ b/crawl-ref/source/dungeon.h
@@ -275,6 +275,9 @@ void dgn_replace_area(int sx, int sy, int ex, int ey,
dungeon_feature_type feature,
unsigned mmask = 0, bool needs_update = false);
+void dgn_excavate(coord_def dig_at, coord_def dig_dir);
+coord_def dgn_random_direction();
+
bool dgn_ensure_vault_placed(bool vault_success,
bool disable_further_vaults);
@@ -297,4 +300,7 @@ std::string dump_vault_maps();
bool dgn_square_travel_ok(const coord_def &c);
+typedef std::set<dungeon_feature_type> dungeon_feature_set;
+extern dungeon_feature_set dgn_Vault_Excavatable_Feats;
+
#endif
diff --git a/crawl-ref/source/effects.cc b/crawl-ref/source/effects.cc
index a4a765177e..f43c3843ed 100644
--- a/crawl-ref/source/effects.cc
+++ b/crawl-ref/source/effects.cc
@@ -898,9 +898,7 @@ void direct_effect(monsters *source, spell_type spell,
pbolt.flavour = BEAM_MISSILE;
pbolt.aux_source = "by the air";
- damage_taken = 8 + random2(random2(4)
- + (random2(12 * source->hit_dice) / 6)
- + (random2(12 * source->hit_dice) / 7));
+ damage_taken = 10 + 2 * source->hit_dice;
// Apply "bonus" against flying/levitating characters after AC
// has been checked.
@@ -911,7 +909,8 @@ void direct_effect(monsters *source, spell_type spell,
}
// Previous method of damage calculation (in line with player
- // airstrike) favoured high-AC player characters.
+ // airstrike) had absurd variance.
+ damage_taken = random2avg(damage_taken, 3);
damage_taken -= random2(defender->armour_class());
break;
@@ -1382,7 +1381,7 @@ static int _acquirement_weapon_subtype()
int count = 0;
int skill = SK_FIGHTING;
- for (int i = SK_SHORT_BLADES; i <= SK_DARTS; i++)
+ for (int i = SK_SHORT_BLADES; i <= SK_CROSSBOWS; i++)
{
if (is_invalid_skill(i))
continue;
@@ -1453,7 +1452,7 @@ static missile_type _acquirement_missile_subtype()
int count = 0;
int skill = SK_THROWING;
- for (int i = SK_SLINGS; i <= SK_DARTS; i++)
+ for (int i = SK_SLINGS; i <= SK_THROWING; i++)
{
if (you.skills[i])
{
@@ -1479,7 +1478,7 @@ static missile_type _acquirement_missile_subtype()
: MI_DART);
break;
- case SK_DARTS:
+ case SK_THROWING:
// Assuming that blowgun in inventory means that they
// may want needles for it (but darts might also be
// wanted). Maybe expand this... see above comment.
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index a3eca5e4b2..58487ff6a9 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -180,17 +180,6 @@ enum attribute_type
NUM_ATTRIBUTES
};
-enum quiver_type
-{
- QUIVER_THROW, // no launcher wielded -> darts, stones, ...
- QUIVER_BOW, // wielded bow -> arrows
- QUIVER_SLING, // wielded sling -> stones, sling bullets
- QUIVER_CROSSBOW, // wielded crossbow -> bolts
- QUIVER_HAND_CROSSBOW, // wielded hand crossbow -> darts
- QUIVER_BLOWGUN, // wielded blowgun -> needles
- NUM_QUIVER
-};
-
enum beam_type // beam[].flavour
{
BEAM_NONE, // 0
@@ -2637,8 +2626,8 @@ enum skill_type
SK_SLINGS,
SK_BOWS,
SK_CROSSBOWS,
- SK_DARTS,
- SK_THROWING,
+ // was darts, now unused
+ SK_THROWING = 11,
SK_ARMOUR,
SK_DODGING,
SK_STEALTH,
@@ -3124,7 +3113,6 @@ enum zap_type
ZAP_PARALYSIS,
ZAP_FIRE,
ZAP_COLD,
- ZAP_PRIMAL_WAVE,
ZAP_CONFUSION,
ZAP_INVISIBILITY,
ZAP_DIGGING,
@@ -3182,6 +3170,7 @@ enum zap_type
ZAP_SLIME,
ZAP_PORKALATOR,
ZAP_SLEEP,
+ ZAP_PRIMAL_WAVE,
ZAP_IOOD,
NUM_ZAPS
};
diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc
index 69014f76d6..55ae7ffc26 100644
--- a/crawl-ref/source/ghost.cc
+++ b/crawl-ref/source/ghost.cc
@@ -850,7 +850,7 @@ void ghost_demon::announce_ghost(const ghost_demon &g)
void ghost_demon::find_extra_ghosts( std::vector<ghost_demon> &gs, int n )
{
- for (monster_iterator mi; mi; ++mi)
+ for (monster_iterator mi; mi && n > 0; ++mi)
{
if (mi->type == MONS_PLAYER_GHOST && mi->ghost.get())
{
diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc
index 07aa928eb4..b755aa296e 100644
--- a/crawl-ref/source/item_use.cc
+++ b/crawl-ref/source/item_use.cc
@@ -1691,7 +1691,7 @@ static int _item_to_skill_level(const item_def *item)
{
skill_type type = range_skill(*item);
- if (type == SK_DARTS || type == SK_SLINGS)
+ if (type == SK_SLINGS)
return (you.skills[type] + you.skills[SK_THROWING]);
return (2 * you.skills[type]);
@@ -2327,10 +2327,6 @@ void throw_noise(actor* act, const bolt &pbolt, const item_def &ammo)
level = 1;
msg = "You hear a whirring sound.";
break;
- case WPN_HAND_CROSSBOW:
- level = 3;
- msg = "You hear a small twanging sound.";
- break;
case WPN_BOW:
level = 5;
msg = "You hear a twanging sound.";
@@ -2699,9 +2695,9 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
// Blowguns take a _very_ steady hand; a lot of the bonus
// comes from dexterity. (Dex bonus here as well as below.)
- case SK_DARTS:
+ case SK_THROWING:
baseHit -= 2;
- exercise(SK_DARTS, (coinflip()? 2 : 1));
+ exercise(SK_THROWING, (coinflip()? 2 : 1));
exHitBonus += (effSkill * 3) / 2 + you.dex / 2;
// No extra damage for blowguns.
@@ -2747,19 +2743,12 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
dice_mult = dice_mult * (22 + random2(1 + effSkill)) / 22;
- if (lnchType == WPN_HAND_CROSSBOW)
- {
- exHitBonus -= 2;
- dice_mult = dice_mult * 26 / 30;
- }
- break;
-
default:
break;
}
// Slings and Darts train Throwing a bit.
- if (launcher_skill == SK_SLINGS || launcher_skill == SK_DARTS)
+ if (launcher_skill == SK_SLINGS)
{
if (coinflip())
exercise(SK_THROWING, 1);
@@ -2813,7 +2802,6 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
{
switch (lnchType)
{
- case WPN_HAND_CROSSBOW:
case WPN_CROSSBOW:
if (returning && !one_chance_in(1 + skill_bump(SK_CROSSBOWS)))
did_return = true;
@@ -2828,7 +2816,7 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
did_return = true;
break;
case WPN_BLOWGUN:
- if (returning && !one_chance_in(1 + skill_bump(SK_DARTS)))
+ if (returning && !one_chance_in(1 + skill_bump(SK_THROWING)))
did_return = true;
break;
default:
@@ -2934,13 +2922,12 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
break;
case MI_DART:
- exHitBonus = you.skills[SK_DARTS] * 2;
- exHitBonus += (you.skills[SK_THROWING] * 2) / 3;
- exDamBonus = you.skills[SK_DARTS] / 3;
- exDamBonus += you.skills[SK_THROWING] / 5;
+ // Darts also using throwing skills, now.
+ exHitBonus += skill_bump(SK_THROWING);
+ exDamBonus += you.skills[SK_THROWING] * 3 / 5;
// exercise skills
- exercise(SK_DARTS, 1 + random2avg(3, 2));
+ exercise(SK_THROWING, 1 + random2avg(3, 2));
break;
case MI_JAVELIN:
@@ -3038,8 +3025,8 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
// Throwing needles is now seriously frowned upon; it's difficult
// to grip a fiddly little needle, and not penalising it cheapens
// blowguns.
- exHitBonus -= (30 - you.skills[SK_DARTS]) / 3;
- baseHit -= (30 - you.skills[SK_DARTS]) / 3;
+ exHitBonus -= (30 - you.skills[SK_THROWING]) / 3;
+ baseHit -= (30 - you.skills[SK_THROWING]) / 3;
dprf("Needle base hit = %d, exHitBonus = %d",
baseHit, exHitBonus);
}
diff --git a/crawl-ref/source/itemprop-enum.h b/crawl-ref/source/itemprop-enum.h
index 44ef53c65c..9947f0cbbd 100644
--- a/crawl-ref/source/itemprop-enum.h
+++ b/crawl-ref/source/itemprop-enum.h
@@ -396,49 +396,49 @@ enum stave_type
enum weapon_type
{
- WPN_CLUB, // 0
+ WPN_CLUB,
WPN_WHIP,
WPN_HAMMER,
WPN_MACE,
WPN_FLAIL,
- WPN_MORNINGSTAR, // 5
+ WPN_MORNINGSTAR,
WPN_SPIKED_FLAIL,
WPN_DIRE_FLAIL,
WPN_EVENINGSTAR,
WPN_GREAT_MACE,
- WPN_DAGGER, // 10
+ WPN_DAGGER,
WPN_QUICK_BLADE,
WPN_SHORT_SWORD,
WPN_SABRE,
WPN_FALCHION,
- WPN_LONG_SWORD, // 15
+ WPN_LONG_SWORD,
WPN_SCIMITAR,
WPN_GREAT_SWORD,
WPN_HAND_AXE,
WPN_WAR_AXE,
- WPN_BROAD_AXE, // 20
+ WPN_BROAD_AXE,
WPN_BATTLEAXE,
WPN_EXECUTIONERS_AXE,
WPN_SPEAR,
WPN_TRIDENT,
- WPN_HALBERD, // 25
+ WPN_HALBERD,
WPN_GLAIVE,
WPN_BARDICHE,
WPN_BLOWGUN,
- WPN_HAND_CROSSBOW,
- WPN_CROSSBOW, // 30
+ WPN_CROSSBOW,
+ // Was hand crossbows, they are gone.
WPN_BOW,
WPN_LONGBOW,
WPN_MAX_RACIAL = WPN_LONGBOW,
WPN_ANKUS,
WPN_DEMON_WHIP,
- WPN_GIANT_CLUB, // 35
+ WPN_GIANT_CLUB,
WPN_GIANT_SPIKED_CLUB,
WPN_KNIFE,
diff --git a/crawl-ref/source/itemprop.cc b/crawl-ref/source/itemprop.cc
index 88b579114d..9856f7260d 100644
--- a/crawl-ref/source/itemprop.cc
+++ b/crawl-ref/source/itemprop.cc
@@ -337,14 +337,11 @@ static weapon_def Weapon_prop[NUM_WEAPONS] =
// - slings get a bonus from dex, not str (as tension is meaningless)
// - str weight is used for speed and applying dex to skill
{ WPN_BLOWGUN, "blowgun", 0, 2, 10, 20, 0,
- SK_DARTS, HANDS_HALF, SIZE_LITTLE, MI_NEEDLE, false,
+ SK_THROWING, HANDS_HALF, SIZE_LITTLE, MI_NEEDLE, false,
DAMV_NON_MELEE, 0 },
{ WPN_SLING, "sling", 0, 2, 11, 20, 1,
SK_SLINGS, HANDS_ONE, SIZE_LITTLE, MI_STONE, false,
DAMV_NON_MELEE, 10 },
- { WPN_HAND_CROSSBOW, "hand crossbow", 3, 4, 15, 70, 5,
- SK_CROSSBOWS, HANDS_HALF, SIZE_SMALL, MI_DART, false,
- DAMV_NON_MELEE, 10 },
{ WPN_CROSSBOW, "crossbow", 5, 4, 15, 150, 8,
SK_CROSSBOWS, HANDS_TWO, SIZE_MEDIUM, MI_BOLT, false,
DAMV_NON_MELEE, 10 },
@@ -430,7 +427,7 @@ void init_properties()
{
// Compare with enum comments, to catch changes.
COMPILE_CHECK(NUM_ARMOURS == 37, c1);
- COMPILE_CHECK(NUM_WEAPONS == 56, c2);
+ COMPILE_CHECK(NUM_WEAPONS == 55, c2);
COMPILE_CHECK(NUM_MISSILES == 9, c3);
COMPILE_CHECK(NUM_FOODS == 22, c4);
@@ -743,7 +740,6 @@ void set_equip_race( item_def &item, unsigned long flags )
&& item.sub_type != WPN_LONG_SWORD)
|| weapon_skill(item) == SK_POLEARMS
|| item.sub_type == WPN_BLOWGUN
- || item.sub_type == WPN_HAND_CROSSBOW
|| item.sub_type == WPN_BOW
|| item.sub_type == WPN_LONGBOW)
{
@@ -776,7 +772,6 @@ void set_equip_race( item_def &item, unsigned long flags )
{
case OBJ_WEAPONS:
if (item.sub_type == WPN_QUICK_BLADE
- || item.sub_type == WPN_HAND_CROSSBOW
|| item.sub_type == WPN_LONGBOW)
return;
break;
@@ -1248,7 +1243,6 @@ int weapon_rarity( int w_type )
return (5);
case WPN_BROAD_AXE:
- case WPN_HAND_CROSSBOW:
case WPN_SPIKED_FLAIL:
case WPN_WHIP:
return (4);
@@ -1666,7 +1660,7 @@ skill_type range_skill( const item_def &item )
{
switch (item.sub_type)
{
- case MI_DART: return (SK_DARTS);
+ case MI_DART: return (SK_THROWING);
case MI_JAVELIN: return (SK_POLEARMS);
default: break;
}
diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc
index 442b500112..ca8a67ba06 100644
--- a/crawl-ref/source/makeitem.cc
+++ b/crawl-ref/source/makeitem.cc
@@ -12,6 +12,7 @@
#include "externs.h"
#include "options.h"
#include "makeitem.h"
+#include "message.h"
#include "artefact.h"
#include "colour.h"
@@ -81,7 +82,7 @@ static int _newwave_weapon_colour(const item_def &item)
case SK_CROSSBOWS:
item_colour = LIGHTBLUE;
break;
- case SK_DARTS:
+ case SK_THROWING:
item_colour = WHITE;
break;
case SK_SLINGS:
@@ -1128,11 +1129,6 @@ static item_status_flag_type _determine_weapon_race(const item_def& item,
rc = ISFLAG_DWARVEN;
break;
- case WPN_HAND_CROSSBOW:
- if (one_chance_in(3))
- rc = ISFLAG_ELVEN;
- break;
-
case WPN_BLOWGUN:
if (one_chance_in(6))
rc = ISFLAG_ELVEN;
@@ -1408,7 +1404,6 @@ static brand_type _determine_weapon_brand(const item_def& item, int item_level)
case WPN_SLING:
- case WPN_HAND_CROSSBOW:
if (coinflip())
break;
// **** possible intentional fall through here ****
@@ -1429,15 +1424,10 @@ static brand_type _determine_weapon_brand(const item_def& item, int item_level)
rc = SPWPN_PROTECTION;
else if (tmp < 980)
rc = SPWPN_VORPAL;
- else
- rc = SPWPN_SPEED;
- if ((item.sub_type == WPN_HAND_CROSSBOW
- || item.sub_type == WPN_CROSSBOW)
- && one_chance_in(5))
- {
+ if (item.sub_type == WPN_CROSSBOW && one_chance_in(5))
rc = SPWPN_ELECTROCUTION;
- }
+
break;
}
@@ -1819,6 +1809,10 @@ static item_status_flag_type _determine_missile_race(const item_def& item,
return rc;
}
+// Current list is based on dpeg's original post to the Wiki, found at the
+// page: <http://crawl.develz.org/wiki/doku.php?id=DCSS%3Aissue%3A41>.
+// Remember to update the code in is_missile_brand_ok if adding or altering
+// brands that are applied to missiles. {due}
static special_missile_type _determine_missile_brand(const item_def& item,
int item_level)
{
@@ -1829,57 +1823,132 @@ static special_missile_type _determine_missile_brand(const item_def& item,
const bool force_good = (item_level == MAKE_GOOD_ITEM);
special_missile_type rc = SPMSL_NORMAL;
- // All needles are either poison or curare.
- if (item.sub_type == MI_NEEDLE)
- rc = got_curare_roll(item_level) ? SPMSL_CURARE : SPMSL_POISONED;
- else
+ // "Normal weight" of SPMSL_NORMAL.
+ int nw = force_good ? 0 : random2(2000 - 55 * item_level);
+
+ switch (item.sub_type)
{
- const int temp_rand =
- (force_good ? random2(150) : random2(2000 - 55 * item_level));
-
- if (temp_rand < 30)
- rc = SPMSL_FLAME;
- else if (temp_rand < 60)
- rc = SPMSL_FROST;
- else if (temp_rand < 80)
- rc = SPMSL_POISONED;
- else if (temp_rand < 90)
- rc = SPMSL_PENETRATION;
- else if (temp_rand < 100)
- rc = SPMSL_REAPING;
- else if (temp_rand < 110)
- rc = SPMSL_SILVER;
- // Make steel rarer at lower levels. {due}
- else if (temp_rand < 120 && (you.your_level > 10 || one_chance_in(3)))
- rc = SPMSL_STEEL;
- else if (temp_rand < 130)
- rc = SPMSL_DISPERSAL;
- else if (temp_rand < 150)
- rc = SPMSL_EXPLODING;
- else
- rc = SPMSL_NORMAL;
+ case MI_NEEDLE:
+ rc = got_curare_roll(item_level) ? SPMSL_CURARE : SPMSL_POISONED;
+ break;
+ case MI_DART:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_FLAME, 30, SPMSL_FROST,
+ 20, SPMSL_POISONED, 12, SPMSL_REAPING,
+ 12, SPMSL_SILVER, 12, SPMSL_STEEL,
+ 12, SPMSL_DISPERSAL, 20, SPMSL_EXPLODING,
+ nw, SPMSL_NORMAL,
+ 0));
+ break;
+ case MI_ARROW:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_FLAME, 30, SPMSL_FROST,
+ 20, SPMSL_POISONED, 10, SPMSL_CHAOS,
+ 10, SPMSL_REAPING, 10, SPMSL_DISPERSAL,
+ nw, SPMSL_NORMAL,
+ 0));
+ break;
+ case MI_BOLT:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_FLAME, 30, SPMSL_FROST,
+ 20, SPMSL_POISONED, 10, SPMSL_PENETRATION,
+ 10, SPMSL_CHAOS, 10, SPMSL_SILVER,
+ 10, SPMSL_STEEL, nw, SPMSL_NORMAL,
+ 0));
+ break;
+ case MI_JAVELIN:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_RETURNING, 30, SPMSL_PENETRATION,
+ 20, SPMSL_STEEL, 20, SPMSL_SILVER,
+ 10, SPMSL_CHAOS, nw, SPMSL_NORMAL,
+ 0));
+ break;
+ case MI_STONE:
+ // deliberate fall through
+ case MI_LARGE_ROCK:
+ // Stones get no brands. Slings may be branded.
+ rc = SPMSL_NORMAL;
+ break;
+ case MI_SLING_BULLET:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_FLAME, 30, SPMSL_FROST,
+ 20, SPMSL_POISONED, 10, SPMSL_CHAOS,
+ 10, SPMSL_STEEL, 10, SPMSL_SILVER,
+ 20, SPMSL_EXPLODING, nw, SPMSL_NORMAL,
+ 0));
+ break;
+ case MI_THROWING_NET:
+ rc = static_cast<special_missile_type>(
+ random_choose_weighted(30, SPMSL_STEEL, 30, SPMSL_SILVER,
+ 20, SPMSL_CHAOS, nw, SPMSL_NORMAL,
+ 0));
+ break;
}
- // Javelins can be returning.
- if (item.sub_type == MI_JAVELIN && one_chance_in(25))
- rc = SPMSL_RETURNING;
-
// Orcish ammo gets poisoned a lot more often.
if (get_equip_race(item) == ISFLAG_ORCISH && one_chance_in(3))
rc = SPMSL_POISONED;
- // Unbrand throwing nets.
- if (item.sub_type == MI_THROWING_NET)
- rc = SPMSL_NORMAL;
+ bool missile_brand_ok = is_missile_brand_ok(item.sub_type, rc);
+ if (!missile_brand_ok)
+ {
+ ASSERT(false);
+ }
- ASSERT(is_missile_brand_ok(item.sub_type, rc));
return rc;
}
bool is_missile_brand_ok(int type, int brand)
{
- // No checks for now...
- return (true);
+ // Stones can never be branded.
+ if ((type == MI_STONE || type == MI_LARGE_ROCK) && brand != SPMSL_NORMAL)
+ return (false);
+
+ // In contrast, needles should always be branded.
+ if (type == MI_NEEDLE && (brand == SPMSL_POISONED || brand == SPMSL_CURARE))
+ return (true);
+
+ // Everything else doesn't matter.
+ if (brand == SPMSL_NORMAL)
+ return (true);
+
+ // Not a missile?
+ if (type == 0)
+ return (true);
+
+ // Specifics
+ switch (brand)
+ {
+ case SPMSL_FLAME:
+ return (type == MI_SLING_BULLET || type == MI_ARROW
+ || type == MI_BOLT || type == MI_DART);
+ case SPMSL_FROST:
+ return (type == MI_SLING_BULLET || type == MI_ARROW
+ || type == MI_BOLT || type == MI_DART);
+ case SPMSL_POISONED:
+ return (type == MI_SLING_BULLET || type == MI_ARROW
+ || type == MI_BOLT || type == MI_DART);
+ case SPMSL_RETURNING:
+ return (type == MI_JAVELIN);
+ case SPMSL_CHAOS:
+ return (type == MI_SLING_BULLET || type == MI_ARROW
+ || type == MI_BOLT || type == MI_DART
+ || type == MI_JAVELIN || type == MI_THROWING_NET);
+ case SPMSL_PENETRATION:
+ return (type == MI_JAVELIN || type == MI_BOLT);
+ case SPMSL_REAPING: // deliberate fall through
+ case SPMSL_DISPERSAL:
+ return (type == MI_ARROW || type == MI_DART);
+ case SPMSL_EXPLODING:
+ return (type == MI_SLING_BULLET || type == MI_DART);
+ case SPMSL_STEEL: // deliberate fall through
+ case SPMSL_SILVER:
+ return (type == MI_BOLT || type == MI_SLING_BULLET
+ || type == MI_JAVELIN || type == MI_THROWING_NET);
+ }
+
+ // Assume yes, if we've gotten this far.
+ return (false);
}
static void _generate_missile_item(item_def& item, int force_type,
diff --git a/crawl-ref/source/message.cc b/crawl-ref/source/message.cc
index a6adba6847..8fcb1d1b56 100644
--- a/crawl-ref/source/message.cc
+++ b/crawl-ref/source/message.cc
@@ -587,6 +587,9 @@ void mpr_comma_separated_list(const std::string prefix,
std::string out = prefix;
unsigned width = get_number_of_cols() - 1;
+ if (Options.delay_message_clear)
+ width--;
+
for (int i = 0, size = list.size(); i < size; i++)
{
std::string new_str = list[i];
diff --git a/crawl-ref/source/mon-act.cc b/crawl-ref/source/mon-act.cc
index 8112618b0f..092fb0aaa7 100644
--- a/crawl-ref/source/mon-act.cc
+++ b/crawl-ref/source/mon-act.cc
@@ -1219,11 +1219,6 @@ static bool _mons_throw(struct monsters *monster, struct bolt &pbolt,
hitMult = 70;
damMult = 30;
break;
- case WPN_HAND_CROSSBOW:
- baseHit = 2;
- hitMult = 50;
- damMult = 20;
- break;
case WPN_SLING:
baseHit = 10;
hitMult = 40;
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 7523989417..b3c35c66f4 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -1110,7 +1110,7 @@ static monsterentry mondata[] = {
MONS_MERFOLK, 'm', BLUE, "merfolk",
M_WARM_BLOOD | M_SPEAKS,
MR_NO_FLAGS,
- 500, 10, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -3,
+ 500, 4, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -3,
{ {AT_HIT, AF_PLAIN, 14}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 9, 2, 4, 0 },
4, 12, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
@@ -1122,9 +1122,9 @@ static monsterentry mondata[] = {
MONS_MERFOLK_IMPALER, 'm', LIGHTBLUE, "merfolk impaler",
M_WARM_BLOOD,
MR_NO_FLAGS,
- 500, 10, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -3,
- { {AT_HIT, AF_PLAIN, 34}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
- { 16, 4, 3, 0 },
+ 500, 8, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -3,
+ { {AT_HIT, AF_PLAIN, 24}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 12, 5, 4, 0 },
// Impalers prefer light armour, and are dodging experts.
0, 23, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, ATTACK_ENERGY(6),
@@ -1135,9 +1135,9 @@ static monsterentry mondata[] = {
MONS_MERFOLK_JAVELINEER, 'm', LIGHTGREY, "merfolk javelineer",
M_WARM_BLOOD | M_ARCHER,
MR_NO_FLAGS,
- 500, 10, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -4,
- { {AT_SHOOT, AF_PLAIN, 16}, {AT_HIT, AF_PLAIN, 20}, AT_NO_ATK, AT_NO_ATK },
- { 15, 4, 2, 0 },
+ 500, 8, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -4,
+ { {AT_SHOOT, AF_PLAIN, 16}, {AT_HIT, AF_PLAIN, 17}, AT_NO_ATK, AT_NO_ATK },
+ { 13, 5, 2, 0 },
0, 15, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, MISSILE_ENERGY(8),
MONUSE_MAGIC_ITEMS, MONEAT_NOTHING, SIZE_MEDIUM
@@ -1147,7 +1147,7 @@ static monsterentry mondata[] = {
MONS_MERFOLK_AQUAMANCER, 'm', GREEN, "merfolk aquamancer",
M_WARM_BLOOD | M_SPELLCASTER | M_ACTUAL_SPELLS,
MR_NO_FLAGS,
- 500, 10, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -4,
+ 500, 8, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -4,
{ {AT_HIT, AF_PLAIN, 15}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 15, 3, 3, 0 },
0, 12, MST_MERFOLK_AQUAMANCER, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
@@ -1171,7 +1171,7 @@ static monsterentry mondata[] = {
MONS_SIREN, 'm', LIGHTCYAN, "siren",
M_SPELLCASTER | M_WARM_BLOOD | M_SPEAKS,
MR_NO_FLAGS,
- 500, 12, MONS_MERMAID, MONS_SIREN, MH_NATURAL, -7,
+ 500, 10, MONS_MERMAID, MONS_SIREN, MH_NATURAL, -7,
{ {AT_HIT, AF_PLAIN, 10}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 13, 5, 3, 0 },
4, 12, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
@@ -3310,7 +3310,7 @@ static monsterentry mondata[] = {
{
MONS_JELLYFISH, 'J', CYAN, "jellyfish",
- M_NO_FLAGS,
+ M_NO_SKELETON,
MR_RES_POISON,
1000, 10, MONS_JELLYFISH, MONS_JELLYFISH, MH_NATURAL, -3,
{ {AT_STING, AF_POISON_STR, 1}, {AT_HIT, AF_PLAIN, 1}, AT_NO_ATK,
@@ -3322,9 +3322,11 @@ static monsterentry mondata[] = {
},
// A shark goes into a battle frenzy when it smells blood.
+// Technically they have skeletons, but Crawl needs skeletons made
+// of bone or similar materials (e.g. chitin)
{
MONS_SHARK, ';', WHITE, "shark",
- M_COLD_BLOOD | M_BLOOD_SCENT,
+ M_NO_SKELETON | M_COLD_BLOOD | M_BLOOD_SCENT,
MR_NO_FLAGS,
2000, 12, MONS_SHARK, MONS_SHARK, MH_NATURAL, -3,
{ {AT_BITE, AF_PLAIN, 15}, {AT_BITE, AF_PLAIN, 8}, AT_NO_ATK, AT_NO_ATK },
@@ -3337,11 +3339,11 @@ static monsterentry mondata[] = {
// A kraken and its tentacles get a random colour from ETC_KRAKEN.
{
MONS_KRAKEN, 'X', BLACK, "kraken",
- M_COLD_BLOOD | M_SPELLCASTER,
+ M_NO_SKELETON | M_COLD_BLOOD | M_SPELLCASTER,
MR_NO_FLAGS,
- 3500, 20, MONS_KRAKEN, MONS_KRAKEN, MH_NATURAL, -3,
+ 3500, 5, MONS_KRAKEN, MONS_KRAKEN, MH_NATURAL, -3,
{ {AT_BITE, AF_PLAIN, 50}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
- { 20, 10, 10, 0 },
+ { 16, 10, 6, 0 },
20, 0, MST_KRAKEN, CE_POISONOUS, Z_BIG, S_SILENT,
I_ANIMAL, HT_WATER, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_HUGE
diff --git a/crawl-ref/source/mon-gear.cc b/crawl-ref/source/mon-gear.cc
index 640a875051..0dbae25aab 100644
--- a/crawl-ref/source/mon-gear.cc
+++ b/crawl-ref/source/mon-gear.cc
@@ -383,8 +383,7 @@ static item_make_species_type _give_weapon(monsters *mon, int level,
item.base_type = OBJ_WEAPONS;
item.sub_type = random_choose_weighted(
22, WPN_LONG_SWORD, 22, WPN_SHORT_SWORD, 17, WPN_SCIMITAR,
- 17, WPN_BOW, 17, WPN_HAND_CROSSBOW,
- 5, WPN_LONGBOW,
+ 17, WPN_BOW, 5, WPN_LONGBOW,
0);
break;
diff --git a/crawl-ref/source/mon-pick.cc b/crawl-ref/source/mon-pick.cc
index 7692517c68..3ed21bafb6 100644
--- a/crawl-ref/source/mon-pick.cc
+++ b/crawl-ref/source/mon-pick.cc
@@ -1718,9 +1718,6 @@ int mons_shoals_level(int mcls)
case MONS_CYCLOPS: // will have a sheep band
case MONS_SIREN:
case MONS_HARPY:
- case MONS_MERFOLK_IMPALER:
- case MONS_MERFOLK_AQUAMANCER:
- case MONS_MERFOLK_JAVELINEER:
mlev += 3;
break;
@@ -1728,6 +1725,9 @@ int mons_shoals_level(int mcls)
case MONS_OKLOB_PLANT:
case MONS_SHARK:
case MONS_KRAKEN:
+ case MONS_MERFOLK_IMPALER:
+ case MONS_MERFOLK_AQUAMANCER:
+ case MONS_MERFOLK_JAVELINEER:
mlev += 4;
break;
@@ -1755,18 +1755,18 @@ int mons_shoals_rare(int mcls)
case MONS_GIANT_BAT:
case MONS_BUTTERFLY:
case MONS_CENTAUR:
- case MONS_MERFOLK_IMPALER:
- case MONS_MERFOLK_JAVELINEER:
return 35;
case MONS_SIREN:
case MONS_YAKTAUR:
- case MONS_MERFOLK_AQUAMANCER:
+ case MONS_MERFOLK_IMPALER:
+ case MONS_MERFOLK_JAVELINEER:
return 25;
case MONS_CYCLOPS:
case MONS_CENTAUR_WARRIOR:
case MONS_HARPY:
+ case MONS_MERFOLK_AQUAMANCER:
return 20;
case MONS_STONE_GIANT:
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 82dce8d5a0..008ce07a2c 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -1057,6 +1057,14 @@ mon_attack_def downscale_zombie_attack(const monsters *mons,
mon_attack_def mons_attack_spec(const monsters *mon, int attk_number)
{
int mc = mon->type;
+
+ if (mc == MONS_KRAKEN_TENTACLE
+ && !invalid_monster_index(mon->number))
+ {
+ // Use the zombie, etc info from the kraken
+ mon = &menv[mon->number];
+ }
+
const bool zombified = mons_is_zombified(mon);
if (attk_number < 0 || attk_number > 3 || mon->has_hydra_multi_attack())
@@ -1074,7 +1082,7 @@ mon_attack_def mons_attack_spec(const monsters *mon, int attk_number)
return (mon_attack_def::attk(0, AT_NONE));
}
- if (zombified)
+ if (zombified && mc != MONS_KRAKEN_TENTACLE)
mc = mons_zombie_base(mon);
ASSERT(smc);
@@ -2582,7 +2590,7 @@ static bool _ms_los_spell(spell_type monspell)
// True, the tentacles _are_ summoned, but they are restricted to
// water just like the kraken is, so it makes more sense not to
// count them here.
- if (SPELL_KRAKEN_TENTACLES)
+ if (monspell == SPELL_KRAKEN_TENTACLES)
return (false);
if (monspell == SPELL_SMITING
diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc
index 1e88b10f33..e79967096c 100644
--- a/crawl-ref/source/monster.cc
+++ b/crawl-ref/source/monster.cc
@@ -182,15 +182,15 @@ static bool _player_near_water()
for (adjacent_iterator ai(you.pos()); ai; ++ai)
if (feat_is_water(grd(*ai)))
return (true);
+
return (false);
}
bool monsters::wants_submerge() const
{
// Krakens never retreat when food (the player) is in range.
- if (mons_base_type(this) == MONS_KRAKEN)
- if (_player_near_water())
- return (false);
+ if (mons_base_type(this) == MONS_KRAKEN && _player_near_water())
+ return (false);
// If we're in distress, we usually want to submerge.
if (env.cgrid(pos()) != EMPTY_CLOUD
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index b7934cca2a..241fee02be 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -2853,6 +2853,7 @@ try_again:
int slow_dig = 0;
int regen = 0;
int slots_lost = 0;
+ int breath_weapons = 0;
std::set<const facet_def *> facets_used;
@@ -2887,6 +2888,10 @@ try_again:
if (m == MUT_REGENERATION)
regen = 1;
+ if (m == MUT_SPIT_POISON || m == MUT_BREATHE_POISON
+ || m == MUT_BREATHE_FLAMES)
+ breath_weapons++;
+
if (m == MUT_CLAWS && i == 2 || m == MUT_HORNS && i == 0)
++slots_lost;
}
@@ -2904,6 +2909,9 @@ try_again:
if (slow_dig && regen)
goto try_again;
+ if (breath_weapons > 1)
+ goto try_again;
+
return ret;
}
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 2d4dbd4a04..2abb8108d0 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -1748,7 +1748,7 @@ static void _newgame_make_item(int slot, equipment_type eqslot,
static bool _give_wanderer_weapon(int & slot, int wpn_skill, int plus)
{
// Darts skill also gets you some needles.
- if (wpn_skill == SK_DARTS)
+ if (wpn_skill == SK_THROWING)
{
// Plus is set if we are getting a good item. In that case, we
// get curare here.
@@ -1801,7 +1801,7 @@ static bool _give_wanderer_weapon(int & slot, int wpn_skill, int plus)
you.inv[slot].sub_type = WPN_QUARTERSTAFF;
break;
- case SK_DARTS:
+ case SK_THROWING:
you.inv[slot].sub_type = WPN_BLOWGUN;
break;
@@ -1810,7 +1810,7 @@ static bool _give_wanderer_weapon(int & slot, int wpn_skill, int plus)
break;
case SK_CROSSBOWS:
- you.inv[slot].sub_type = WPN_HAND_CROSSBOW;
+ you.inv[slot].sub_type = WPN_CROSSBOW;
break;
}
@@ -2312,7 +2312,7 @@ void _wanderer_good_equipment(skill_type & skill, int & slot)
case SK_POLEARMS:
case SK_BOWS:
case SK_CROSSBOWS:
- case SK_DARTS:
+ case SK_THROWING:
case SK_STAVES:
case SK_SHORT_BLADES:
_give_wanderer_weapon(slot, skill, 3);
@@ -2493,7 +2493,7 @@ void _wanderer_decent_equipment(skill_type & skill,
case SK_POLEARMS:
case SK_BOWS:
case SK_CROSSBOWS:
- case SK_DARTS:
+ case SK_THROWING:
case SK_STAVES:
case SK_SHORT_BLADES:
_give_wanderer_weapon(slot, skill, 0);
@@ -2586,39 +2586,23 @@ static void _wanderer_cover_equip_holes(int & slot)
}
}
- // The player gets a stack of darts if they have a hand
- // crossbow/darts skill but no blowgun.
- bool need_darts = false;
+ // The player needs a stack of bolts if they have a crossbow.
+ bool need_bolts = false;
for (int i = 0; i < slot; ++i)
{
if (you.inv[i].base_type == OBJ_WEAPONS
- && you.inv[i].sub_type == WPN_HAND_CROSSBOW)
+ && you.inv[i].sub_type == WPN_CROSSBOW)
{
- need_darts = true;
+ need_bolts = true;
break;
}
}
- if (!need_darts && you.skills[SK_DARTS])
+ if (need_bolts)
{
- need_darts = true;
-
- for (int i = 0; i < slot; ++i)
- {
- if (you.inv[i].base_type == OBJ_WEAPONS
- && you.inv[i].sub_type == WPN_BLOWGUN)
- {
- need_darts = false;
- break;
- }
- }
- }
-
- if (need_darts)
- {
- _newgame_make_item(slot, EQ_NONE, OBJ_MISSILES, MI_DART, -1,
- 8 + roll_dice(2, 8));
+ _newgame_make_item(slot, EQ_NONE, OBJ_MISSILES, MI_BOLT, -1,
+ 15 + random2avg(21, 5));
slot++;
}
@@ -2653,7 +2637,7 @@ static void _create_wanderer(void)
// Regardless of roles, players get a couple levels in these skills.
const skill_type util_skills[] =
- { SK_DARTS, SK_STABBING, SK_TRAPS_DOORS, SK_STEALTH,
+ { SK_THROWING, SK_STABBING, SK_TRAPS_DOORS, SK_STEALTH,
SK_SHIELDS, SK_EVOCATIONS, SK_INVOCATIONS };
int util_size = sizeof(util_skills) / sizeof(skill_type);
@@ -4275,7 +4259,7 @@ bool _give_items_skills()
you.skills[SK_DODGING] = 2;
you.skills[SK_SPELLCASTING] = 2;
you.skills[SK_TRANSLOCATIONS] = 3;
- you.skills[SK_DARTS] = 1;
+ you.skills[SK_THROWING] = 1;
weap_skill = 3;
break;
@@ -4411,7 +4395,7 @@ bool _give_items_skills()
you.inv[0].sub_type = WPN_CLUB;
weap_skill = 1;
- you.skills[SK_DARTS] = 1;
+ you.skills[SK_THROWING] = 1;
you.skills[SK_ENCHANTMENTS] = 4;
you.skills[SK_SPELLCASTING] = 1;
you.skills[SK_DODGING] = 2;
@@ -4540,12 +4524,9 @@ bool _give_items_skills()
case JOB_THIEF:
_newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD);
- _newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_HAND_CROSSBOW);
-
- _newgame_make_item(2, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
- _newgame_make_item(3, EQ_CLOAK, OBJ_ARMOUR, ARM_CLOAK);
-
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1, 20);
+ _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
+ _newgame_make_item(2, EQ_CLOAK, OBJ_ARMOUR, ARM_CLOAK);
+ _newgame_make_item(3, EQ_NONE, OBJ_MISSILES, MI_DART, -1, 20);
// Spriggans used to get a rod of striking, but now that anyone
// can get one when playing an Artificer, this is no longer
@@ -4585,7 +4566,7 @@ bool _give_items_skills()
you.skills[SK_DODGING] = 1;
you.skills[SK_STEALTH] = 3;
you.skills[SK_STABBING] = 2;
- you.skills[SK_DARTS] = 2;
+ you.skills[SK_THROWING] = 2;
break;
case JOB_HUNTER:
diff --git a/crawl-ref/source/ng-init.cc b/crawl-ref/source/ng-init.cc
index 588d42b505..9d1c55b901 100644
--- a/crawl-ref/source/ng-init.cc
+++ b/crawl-ref/source/ng-init.cc
@@ -46,6 +46,12 @@ static unsigned char _random_potion_description()
return static_cast<unsigned char>(desc);
}
+// [dshaligram] FIXME: This is to push more playtesting towards Shoals,
+// should be removed before release.
+#ifdef DGAMELAUNCH
+#define SHOALS_TESTING
+#endif
+
// Determine starting depths of branches.
void initialise_branch_depths()
{
@@ -55,12 +61,14 @@ void initialise_branch_depths()
branches[BRANCH_LAIR].startdepth = random_range(8, 13);
branches[BRANCH_HIVE].startdepth = random_range(11, 16);
branches[BRANCH_SLIME_PITS].startdepth = random_range(5, 8);
+#ifndef SHOALS_TESTING
if ( coinflip() )
{
branches[BRANCH_SWAMP].startdepth = random_range(2, 5);
branches[BRANCH_SHOALS].startdepth = -1;
}
else
+#endif
{
branches[BRANCH_SWAMP].startdepth = -1;
branches[BRANCH_SHOALS].startdepth = random_range(2, 5);
diff --git a/crawl-ref/source/player.h b/crawl-ref/source/player.h
index 9c64409023..e9b59b2364 100644
--- a/crawl-ref/source/player.h
+++ b/crawl-ref/source/player.h
@@ -9,6 +9,7 @@
#define PLAYER_H
#include "actor.h"
+#include "quiver.h"
#include "itemprop-enum.h"
#include "species.h"
@@ -142,7 +143,7 @@ public:
int berserk_penalty; // penalty for moving while berserk
FixedVector<unsigned long, NUM_ATTRIBUTES> attribute;
- FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiver
+ FixedVector<unsigned char, NUM_AMMO> quiver; // default items for quiver
FixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value;
undead_state_type is_undead;
diff --git a/crawl-ref/source/quiver.cc b/crawl-ref/source/quiver.cc
index f31b7b76dd..e9a24c534c 100644
--- a/crawl-ref/source/quiver.cc
+++ b/crawl-ref/source/quiver.cc
@@ -162,8 +162,7 @@ void choose_item_for_quiver()
t == AMMO_BLOWGUN ? "blowgun" :
t == AMMO_SLING ? "sling" :
t == AMMO_BOW ? "bow" :
- t == AMMO_CROSSBOW ? "crossbow"
- : "hand crossbow");
+ "crossbow");
return;
}
else if (slot == you.equip[EQ_WEAPON]
@@ -202,8 +201,7 @@ void choose_item_for_quiver()
t == AMMO_BLOWGUN ? "blowguns" :
t == AMMO_SLING ? "slings" :
t == AMMO_BOW ? "bows" :
- t == AMMO_CROSSBOW ? "crossbows"
- : "hand crossbows");
+ "crossbows");
}
// Notification that item was fired with 'f'.
@@ -606,8 +604,6 @@ static ammo_t _get_weapon_ammo_type(const item_def* weapon)
return AMMO_BOW;
case WPN_CROSSBOW:
return AMMO_CROSSBOW;
- case WPN_HAND_CROSSBOW:
- return AMMO_HAND_CROSSBOW;
default:
return AMMO_THROW;
}
diff --git a/crawl-ref/source/quiver.h b/crawl-ref/source/quiver.h
index 3bf6154af0..02a9f3d6b4 100644
--- a/crawl-ref/source/quiver.h
+++ b/crawl-ref/source/quiver.h
@@ -19,7 +19,7 @@ enum ammo_t
AMMO_BOW, // wielded bow -> arrows
AMMO_SLING, // wielded sling -> stones, sling bullets
AMMO_CROSSBOW, // wielded crossbow -> bolts
- AMMO_HAND_CROSSBOW, // wielded hand crossbow -> darts
+ // Used to be hand crossbows
AMMO_BLOWGUN, // wielded blowgun -> needles
NUM_AMMO
};
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 99c2375cc0..573a7d0f27 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -1177,7 +1177,7 @@ static bool _need_missile_gift()
&& random2( you.piety ) > 70
&& one_chance_in(8)
&& you.skills[ best_missile_skill ] >= 8
- && (launcher || best_missile_skill == SK_DARTS));
+ && (launcher || best_missile_skill == SK_THROWING));
}
static void _get_pure_deck_weights(int weights[])
diff --git a/crawl-ref/source/rltiles/item/weapon/hand_crossbow.png b/crawl-ref/source/rltiles/UNUSED/hand_crossbow.png
index 92071c1040..92071c1040 100644
--- a/crawl-ref/source/rltiles/item/weapon/hand_crossbow.png
+++ b/crawl-ref/source/rltiles/UNUSED/hand_crossbow.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/item/weapon/hand_crossbow2.png b/crawl-ref/source/rltiles/UNUSED/hand_crossbow2.png
index 821a9cd5bc..821a9cd5bc 100644
--- a/crawl-ref/source/rltiles/item/weapon/hand_crossbow2.png
+++ b/crawl-ref/source/rltiles/UNUSED/hand_crossbow2.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-corpse.txt b/crawl-ref/source/rltiles/dc-corpse.txt
index f947bf65b0..5e5301f9a2 100644
--- a/crawl-ref/source/rltiles/dc-corpse.txt
+++ b/crawl-ref/source/rltiles/dc-corpse.txt
@@ -84,6 +84,17 @@ giant_mosquito CORPSE_GIANT_MOSQUITO
yellow_wasp CORPSE_YELLOW_WASP
red_wasp CORPSE_RED_WASP
+## Aquatics (';')
+%back dc-misc/blood_red
+big_fish CORPSE_BIG_FISH
+giant_goldfish CORPSE_GIANT_GOLDFISH
+electric_eel CORPSE_ELECTRIC_EEL
+#lava_fish CORPSE_LAVA_FISH
+shark CORPSE_SHARK
+kraken_head CORPSE_KRAKEN /*'x'*/
+%back dc-misc/blood_green
+jellyfish CORPSE_JELLYFISH /*'J'*/
+
## Beetles ('B')
giant_beetle CORPSE_GIANT_BEETLE
boring_beetle CORPSE_BORING_BEETLE
diff --git a/crawl-ref/source/rltiles/dc-dngn.txt b/crawl-ref/source/rltiles/dc-dngn.txt
index f306cfd048..ef8e062e57 100644
--- a/crawl-ref/source/rltiles/dc-dngn.txt
+++ b/crawl-ref/source/rltiles/dc-dngn.txt
@@ -994,6 +994,18 @@ dngn_shoals_shallow_water_disturbance1 SHOALS_SHALLOW_WATER_DISTURBANCE
dngn_shoals_shallow_water_disturbance2
dngn_shoals_shallow_water_disturbance3
+# corner waves (diagonals)
+shallow_water_wave_corner_NE WAVE_CORNER_NE
+shallow_water_wave_corner_NW WAVE_CORNER_NW
+shallow_water_wave_corner_SE WAVE_CORNER_SE
+shallow_water_wave_corner_SW WAVE_CORNER_SW
+
+# orthogonal waves
+shallow_water_wave_N WAVE_N
+shallow_water_wave_S WAVE_S
+shallow_water_wave_E WAVE_E
+shallow_water_wave_W WAVE_W
+
%sdir dc-dngn/gateways
dngn_entrance DNGN_UNSEEN_ENTRANCE
%rim 1
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_E.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_E.png
new file mode 100644
index 0000000000..d0d4a5eb24
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_E.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_N.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_N.png
new file mode 100644
index 0000000000..75d75529c3
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_N.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_S.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_S.png
new file mode 100644
index 0000000000..e043b1f083
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_S.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_W.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_W.png
new file mode 100644
index 0000000000..8cdb9890ec
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_W.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NE.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NE.png
new file mode 100644
index 0000000000..ba4bd301a5
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NE.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NW.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NW.png
new file mode 100644
index 0000000000..e86b45a553
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_NW.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SE.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SE.png
new file mode 100644
index 0000000000..3f1db4464e
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SE.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SW.png b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SW.png
new file mode 100644
index 0000000000..a187598d4c
--- /dev/null
+++ b/crawl-ref/source/rltiles/dc-dngn/water/shallow_water_wave_corner_SW.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dc-item.txt b/crawl-ref/source/rltiles/dc-item.txt
index 8d775bcb29..af4d8b3c83 100644
--- a/crawl-ref/source/rltiles/dc-item.txt
+++ b/crawl-ref/source/rltiles/dc-item.txt
@@ -104,8 +104,6 @@ bow WPN_BOW
bow2
crossbow WPN_CROSSBOW
crossbow2
-hand_crossbow WPN_HAND_CROSSBOW
-hand_crossbow2
##Pole
quarterstaff WPN_QUARTERSTAFF
diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc
index 2b5d582316..ac20af1433 100644
--- a/crawl-ref/source/shopping.cc
+++ b/crawl-ref/source/shopping.cc
@@ -954,10 +954,6 @@ unsigned int item_value( item_def item, bool ident )
case WPN_BLESSED_SCIMITAR:
valued += 50;
- case WPN_HAND_CROSSBOW:
- valued += 51;
- break;
-
case WPN_HALBERD:
valued += 52;
break;
diff --git a/crawl-ref/source/skills.cc b/crawl-ref/source/skills.cc
index 608ebca844..2d28a5201d 100644
--- a/crawl-ref/source/skills.cc
+++ b/crawl-ref/source/skills.cc
@@ -295,7 +295,7 @@ static int _exercise2(int exsk)
// practise. Increasing the "deg"ree of exercise would make
// missile weapons too easy earlier on, so, instead, we're
// giving them a special case here.
- if (exsk != SK_DARTS && exsk != SK_BOWS && exsk != SK_CROSSBOWS
+ if (exsk != SK_THROWING && exsk != SK_BOWS && exsk != SK_CROSSBOWS
|| skill_change > you.exp_available)
{
int fraction = (spending_limit * 10) / skill_change;
diff --git a/crawl-ref/source/skills2.cc b/crawl-ref/source/skills2.cc
index 534220621d..c736033772 100644
--- a/crawl-ref/source/skills2.cc
+++ b/crawl-ref/source/skills2.cc
@@ -153,7 +153,7 @@ const int spec_skills[NUM_SPECIES][40] =
100, // SK_SLINGS
100, // SK_BOWS
100, // SK_CROSSBOWS
- 100, // SK_DARTS
+ 100, // unused (was darts)
100, // SK_THROWING
100, // SK_ARMOUR
100, // SK_DODGING
@@ -195,7 +195,7 @@ const int spec_skills[NUM_SPECIES][40] =
140, // SK_SLINGS
60, // SK_BOWS
100, // SK_CROSSBOWS
- 90, // SK_DARTS
+ 90, // unused (was darts)
80, // SK_THROWING
110, // SK_ARMOUR
90, // SK_DODGING
@@ -236,8 +236,8 @@ const int spec_skills[NUM_SPECIES][40] =
100, // SK_STAVES
140, // SK_SLINGS
80, // SK_BOWS
- 80, // SK_CROSSBOWS
- 80, // SK_DARTS
+ 110, // SK_CROSSBOWS
+ 80, // unused (was darts)
80, // SK_THROWING
140, // SK_ARMOUR
70, // SK_DODGING
@@ -279,7 +279,7 @@ const int spec_skills[NUM_SPECIES][40] =
100, // SK_SLINGS
100, // SK_BOWS
100, // SK_CROSSBOWS
- 100, // SK_DARTS
+ 100, // unused (was darts)
70, // SK_THROWING
140, // SK_ARMOUR
70, // SK_DODGING
@@ -321,7 +321,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
150, // SK_BOWS
90, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
60, // SK_ARMOUR
110, // SK_DODGING
@@ -363,7 +363,7 @@ const int spec_skills[NUM_SPECIES][40] =
50, // SK_SLINGS
70, // SK_BOWS
90, // SK_CROSSBOWS
- 50, // SK_DARTS
+ 50, // unused (was darts)
60, // SK_THROWING
150, // SK_ARMOUR
70, // SK_DODGING
@@ -405,7 +405,7 @@ const int spec_skills[NUM_SPECIES][40] =
130, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 130, // SK_DARTS
+ 130, // unused (was darts)
100, // SK_THROWING
90, // SK_ARMOUR
140, // SK_DODGING
@@ -447,7 +447,7 @@ const int spec_skills[NUM_SPECIES][40] =
70, // SK_SLINGS
90, // SK_BOWS
80, // SK_CROSSBOWS
- 50, // SK_DARTS
+ 50, // unused (was darts)
60, // SK_THROWING
140, // SK_ARMOUR
70, // SK_DODGING
@@ -489,7 +489,7 @@ const int spec_skills[NUM_SPECIES][40] =
140, // SK_SLINGS
140, // SK_BOWS
140, // SK_CROSSBOWS
- 140, // SK_DARTS
+ 140, // unused (was darts)
140, // SK_THROWING
140, // SK_ARMOUR
140, // SK_DODGING
@@ -531,7 +531,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
150, // SK_ARMOUR
150, // SK_DODGING
@@ -573,7 +573,7 @@ const int spec_skills[NUM_SPECIES][40] =
180, // SK_SLINGS
180, // SK_BOWS
180, // SK_CROSSBOWS
- 180, // SK_DARTS
+ 180, // unused (was darts)
80, // SK_THROWING
150, // SK_ARMOUR
120, // SK_DODGING
@@ -615,7 +615,7 @@ const int spec_skills[NUM_SPECIES][40] =
180, // SK_SLINGS
180, // SK_BOWS
180, // SK_CROSSBOWS
- 180, // SK_DARTS
+ 180, // unused (was darts)
130, // SK_THROWING
150, // SK_ARMOUR
130, // SK_DODGING
@@ -657,7 +657,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -699,7 +699,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -741,7 +741,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -783,7 +783,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -825,7 +825,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -867,7 +867,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -909,7 +909,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -951,7 +951,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -993,7 +993,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -1035,7 +1035,7 @@ const int spec_skills[NUM_SPECIES][40] =
120, // SK_SLINGS
120, // SK_BOWS
120, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
200, // SK_ARMOUR
120, // SK_DODGING
@@ -1077,7 +1077,7 @@ const int spec_skills[NUM_SPECIES][40] =
80, // SK_SLINGS
60, // SK_BOWS
90, // SK_CROSSBOWS
- 80, // SK_DARTS
+ 80, // unused (was darts)
60, // SK_THROWING
180, // SK_ARMOUR
170, // SK_DODGING
@@ -1119,7 +1119,7 @@ const int spec_skills[NUM_SPECIES][40] =
110, // SK_SLINGS
110, // SK_BOWS
110, // SK_CROSSBOWS
- 110, // SK_DARTS
+ 110, // unused (was darts)
110, // SK_THROWING
110, // SK_ARMOUR
110, // SK_DODGING
@@ -1161,7 +1161,7 @@ const int spec_skills[NUM_SPECIES][40] =
70, // SK_SLINGS
70, // SK_BOWS
100, // SK_CROSSBOWS
- 70, // SK_DARTS
+ 70, // unused (was darts)
90, // SK_THROWING
170, // SK_ARMOUR
50, // SK_DODGING
@@ -1203,7 +1203,7 @@ const int spec_skills[NUM_SPECIES][40] =
90, // SK_SLINGS
90, // SK_BOWS
90, // SK_CROSSBOWS
- 90, // SK_DARTS
+ 90, // unused (was darts)
90, // SK_THROWING
80, // SK_ARMOUR
80, // SK_DODGING
@@ -1245,7 +1245,7 @@ const int spec_skills[NUM_SPECIES][40] =
110, // SK_SLINGS
110, // SK_BOWS
110, // SK_CROSSBOWS
- 110, // SK_DARTS
+ 110, // unused (was darts)
110, // SK_THROWING
110, // SK_ARMOUR
110, // SK_DODGING
@@ -1287,7 +1287,7 @@ const int spec_skills[NUM_SPECIES][40] =
130, // SK_SLINGS
130, // SK_BOWS
130, // SK_CROSSBOWS
- 130, // SK_DARTS
+ 130, // unused (was darts)
130, // SK_THROWING
110, // SK_ARMOUR
110, // SK_DODGING
@@ -1329,7 +1329,7 @@ const int spec_skills[NUM_SPECIES][40] =
100, // SK_SLINGS
80, // SK_BOWS
80, // SK_CROSSBOWS
- 90, // SK_DARTS
+ 90, // unused (was darts)
90, // SK_THROWING
90, // SK_ARMOUR
90, // SK_DODGING
@@ -1371,7 +1371,7 @@ const int spec_skills[NUM_SPECIES][40] =
150, // SK_SLINGS
140, // SK_BOWS
140, // SK_CROSSBOWS
- 100, // SK_DARTS
+ 100, // unused (was darts)
100, // SK_THROWING
160, // SK_ARMOUR
60, // SK_DODGING
@@ -1413,7 +1413,7 @@ const int spec_skills[NUM_SPECIES][40] =
140, // SK_SLINGS
140, // SK_BOWS
140, // SK_CROSSBOWS
- 140, // SK_DARTS
+ 140, // unused (was darts)
140, // SK_THROWING
140, // SK_ARMOUR
90, // SK_DODGING
@@ -1455,7 +1455,7 @@ const int spec_skills[NUM_SPECIES][40] =
90, // SK_SLINGS
180, // SK_BOWS
90, // SK_CROSSBOWS
- 120, // SK_DARTS
+ 120, // unused (was darts)
120, // SK_THROWING
90, // SK_ARMOUR
90, // SK_DODGING
@@ -1535,7 +1535,7 @@ static const skill_type skill_display_order[] =
SK_BLANK_LINE,
- SK_BOWS, SK_CROSSBOWS, SK_THROWING, SK_SLINGS, SK_DARTS,
+ SK_BOWS, SK_CROSSBOWS, SK_THROWING, SK_SLINGS,
SK_BLANK_LINE,
diff --git a/crawl-ref/source/tags.h b/crawl-ref/source/tags.h
index f9c3959299..915c6d1f80 100644
--- a/crawl-ref/source/tags.h
+++ b/crawl-ref/source/tags.h
@@ -40,7 +40,7 @@ enum tag_file_type // file types supported by tag system
enum tag_major_version
{
TAG_MAJOR_START = 5,
- TAG_MAJOR_VERSION = 12
+ TAG_MAJOR_VERSION = 13
};
// Minor version will be reset to zero when major version changes.
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 4d40a20c0c..cf18035dfb 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -109,7 +109,6 @@ static int _bow_offset(const monsters *mon)
case WPN_BOW:
case WPN_LONGBOW:
case WPN_CROSSBOW:
- case WPN_HAND_CROSSBOW:
return (0);
default:
return (1);
@@ -277,6 +276,9 @@ int tileidx_monster_base(const monsters *mon, bool detected)
// merfolk ('m')
case MONS_MERFOLK:
+ case MONS_MERFOLK_IMPALER: // TODO
+ case MONS_MERFOLK_AQUAMANCER: // TODO
+ case MONS_MERFOLK_JAVELINEER: // TODO
if (in_water)
return TILEP_MONS_MERFOLK_FIGHTER_WATER;
else
@@ -1301,9 +1303,6 @@ static int _tileidx_weapon_base(const item_def &item)
case WPN_CROSSBOW:
return TILE_WPN_CROSSBOW;
- case WPN_HAND_CROSSBOW:
- return TILE_WPN_HAND_CROSSBOW;
-
case WPN_SPEAR:
return TILE_WPN_SPEAR;
@@ -2009,6 +2008,20 @@ static int _tileidx_corpse(const item_def &item)
case MONS_DEATH_YAK:
return TILE_CORPSE_DEATH_YAK;
+ // water monsters
+ case MONS_BIG_FISH:
+ return TILE_CORPSE_BIG_FISH;
+ case MONS_GIANT_GOLDFISH:
+ return TILE_CORPSE_GIANT_GOLDFISH;
+ case MONS_ELECTRIC_EEL:
+ return TILE_CORPSE_ELECTRIC_EEL;
+ case MONS_SHARK:
+ return TILE_CORPSE_SHARK;
+ case MONS_KRAKEN:
+ return TILE_CORPSE_KRAKEN;
+ case MONS_JELLYFISH:
+ return TILE_CORPSE_JELLYFISH;
+
// humans ('@')
case MONS_HUMAN:
case MONS_HELL_KNIGHT:
@@ -3988,7 +4001,6 @@ int tilep_equ_weapon(const item_def &item)
case WPN_SLING: return TILEP_HAND1_SLING;
case WPN_BOW: return TILEP_HAND1_BOW2;
case WPN_CROSSBOW: return TILEP_HAND1_CROSSBOW;
- case WPN_HAND_CROSSBOW: return TILEP_HAND1_CROSSBOW;
case WPN_BLOWGUN: return TILEP_HAND1_BLOWGUN;
case WPN_LONGBOW: return TILEP_HAND1_BOW3;
diff --git a/crawl-ref/source/tilereg.cc b/crawl-ref/source/tilereg.cc
index 65383f46b4..dbac2f6d64 100644
--- a/crawl-ref/source/tilereg.cc
+++ b/crawl-ref/source/tilereg.cc
@@ -12,6 +12,7 @@
#include "cio.h"
#include "cloud.h"
#include "coord.h"
+#include "coordit.h"
#include "debug.h"
#include "describe.h"
#include "directn.h"
@@ -303,6 +304,75 @@ void DungeonRegion::pack_background(unsigned int bg, int x, int y)
m_buf_dngn.add(TILE_BLOOD + offset, x, y);
}
+ if (player_in_branch(BRANCH_SHOALS))
+ {
+ // Add wave tiles on floor adjacent to shallow water.
+ const coord_def pos = coord_def(x + m_cx_to_gx, y + m_cy_to_gy);
+ const dungeon_feature_type feat = env.map_knowledge(pos).feat();
+ if (feat == DNGN_FLOOR || feat == DNGN_UNDISCOVERED_TRAP)
+ {
+ bool north = false, south = false, east = false, west = false;
+ bool ne = false, nw = false, se = false, sw = false;
+ for (radius_iterator ri(pos, 1, true, false, true); ri; ++ri)
+ {
+ if (env.map_knowledge(*ri).feat() != DNGN_SHALLOW_WATER)
+ continue;
+
+ if (!is_terrain_seen(*ri) && !is_terrain_mapped(*ri))
+ continue;
+
+ if (ri->x == pos.x) // orthogonals
+ {
+ if (ri->y < pos.y)
+ north = true;
+ else
+ south = true;
+ }
+ else if (ri->y == pos.y)
+ {
+ if (ri->x < pos.x)
+ west = true;
+ else
+ east = true;
+ }
+ else // diagonals
+ {
+ if (ri->x < pos.x)
+ {
+ if (ri->y < pos.y)
+ nw = true;
+ else
+ sw = true;
+ }
+ else
+ {
+ if (ri->y < pos.y)
+ ne = true;
+ else
+ se = true;
+ }
+ }
+ }
+
+ if (north)
+ m_buf_dngn.add(TILE_WAVE_N, x, y);
+ if (south)
+ m_buf_dngn.add(TILE_WAVE_S, x, y);
+ if (east)
+ m_buf_dngn.add(TILE_WAVE_E, x, y);
+ if (west)
+ m_buf_dngn.add(TILE_WAVE_W, x, y);
+ if (ne && !north && !east)
+ m_buf_dngn.add(TILE_WAVE_CORNER_NE, x, y);
+ if (nw && !north && !west)
+ m_buf_dngn.add(TILE_WAVE_CORNER_NW, x, y);
+ if (se && !south && !east)
+ m_buf_dngn.add(TILE_WAVE_CORNER_SE, x, y);
+ if (sw && !south && !west)
+ m_buf_dngn.add(TILE_WAVE_CORNER_SW, x, y);
+ }
+ }
+
if (bg & TILE_FLAG_HALO)
m_buf_dngn.add(TILE_HALO, x, y);
diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc
index 1b173c694b..9eb857d78a 100644
--- a/crawl-ref/source/tutorial.cc
+++ b/crawl-ref/source/tutorial.cc
@@ -1197,7 +1197,6 @@ void tut_gained_new_skill(int skill)
case SK_SLINGS:
case SK_BOWS:
case SK_CROSSBOWS:
- case SK_DARTS:
learned_something_new(TUT_GAINED_RANGED_SKILL);
break;
@@ -3547,7 +3546,7 @@ void tutorial_describe_item(const item_def &item)
{
// Then only compare with other launcher skills.
curr_wpskill = range_skill(item);
- best_wpskill = best_skill(SK_SLINGS, SK_DARTS, 99);
+ best_wpskill = best_skill(SK_SLINGS, SK_THROWING, 99);
}
else
{
diff --git a/crawl-ref/source/wiz-mon.cc b/crawl-ref/source/wiz-mon.cc
index e237401b5d..5664e28fcf 100644
--- a/crawl-ref/source/wiz-mon.cc
+++ b/crawl-ref/source/wiz-mon.cc
@@ -263,7 +263,7 @@ void debug_list_monsters()
std::sort(mon_nums, mon_nums + MAX_MONSTERS, _sort_monster_list);
- int total_exp = 0, total_adj_exp = 0;
+ long total_exp = 0, total_adj_exp = 0, total_nonuniq_exp = 0;
std::string prev_name = "";
int count = 0;
@@ -297,6 +297,8 @@ void debug_list_monsters()
int exp = exper_value(mi);
total_exp += exp;
+ if (!mons_is_unique(mi->type))
+ total_nonuniq_exp += exp;
if ((mi->flags & (MF_WAS_NEUTRAL | MF_NO_REWARD))
|| mi->has_ench(ENCH_ABJ))
@@ -320,13 +322,13 @@ void debug_list_monsters()
if (total_adj_exp == total_exp)
{
- mprf("%d monsters, %d total exp value",
- nfound, total_exp);
+ mprf("%d monsters, %ld total exp value (%ld non-uniq)",
+ nfound, total_exp, total_nonuniq_exp);
}
else
{
- mprf("%d monsters, %d total exp value (%d adjusted)",
- nfound, total_exp, total_adj_exp);
+ mprf("%d monsters, %ld total exp value (%ld non-uniq, %ld adjusted)",
+ nfound, total_exp, total_nonuniq_exp, total_adj_exp);
}
}