7 weeks agoRemove Will-O-The-Wisps from early vault pull/1675 1675/head
ardl [Sat, 9 Jan 2021 19:30:28 +0000]
Remove Will-O-The-Wisps from early vault

4 months agoGenerate temple before dungeon
advil [Fri, 30 Oct 2020 18:54:52 +0000]
Generate temple before dungeon

This moves Temple before D in the pregen order, and pregens it during
setup for normal games. The level is fully decided at this point, and it
shouldn't interact with the rng for any other level, so order
effectively doesn't matter anyways. This is a long-requested feature to
avoid the popup where entering temple forced pregeneration of the rest
of the dungeon.

4 months agoAttempt to fix contrib zlib on mac gha builds
advil [Thu, 29 Oct 2020 18:47:48 +0000]
Attempt to fix contrib zlib on mac gha builds

This adds a missing header file that is now triggering errors instead of
warnings on this build. The crawl-zlib repository is in a somewhat
confusing state, so while it might be nice to update the zlib version, I
was not able to figure out how to do that.

4 months agoImprove handling of builder failures with pregen
advil [Thu, 29 Oct 2020 16:30:40 +0000]
Improve handling of builder failures with pregen

Before pregen, a builder failure would lead to a force save, and a new
attempt to generate the failed level on load. After pregen, something
similar would have most likely happened, but on load the player would (I
think) be teleported to the failed level and pregen would break. At some
point I added an ASSERT to the save code for other reasons that would
trigger on this case, so most recently the builder would crash without
saving, leading to a broken save (but that could be played up to a

This commit restores a version of the original behavior. If the builder
fails, the game will force-save and then crash. The save step discards
the builder's attempts, but keeps the effect on the rng, so that the
level seed will be different on the next attempt, and most likely
succeed. The end result is still deterministic overall given a starting
seed. When the player loads the save, the builder picks up where it died.
I have been testing this in trunk with seed 17783394655777042589, which
triggers a builder failure (50 vetoes in a row) on depths 3.

This commit also contains a small improvement to the messages API which
didn't end up being needed for the final implementation, but is still a
useful addition.

4 months agoBring back the Black Knight's barding black_is_back
Nicholas Feinberg [Mon, 26 Oct 2020 23:19:42 +0000]
Bring back the Black Knight's barding

It doesn't really do anything particularly thematic, but it does let
you get extremely slow nagas, which is pretty funny.

This commit also fixes a CRITICAL bug with nagas and any source of

4 months agoAdd GitHub Actions CI check for header-build-tests
Aidan Holm [Sun, 25 Oct 2020 08:15:12 +0000]
Add GitHub Actions CI check for header-build-tests

This should prevent accidental backsliding as we work towards fixing our
header file mess.

4 months agoAdd build test for headers with fixed includes
Aidan Holm [Sun, 25 Oct 2020 08:07:32 +0000]
Add build test for headers with fixed includes

This helps verify that headers are including everything they use (IWYU),
since if they are not, compilation will fail. We don't actually do
anything with the compiled objects.

This complements implicit checks for cc files, which must include their
dependencies because they could not successfully compile otherwise.

This commit only includes a subset of all header files. Header files can
be appended to this list as they are fixed.

4 months agoSplit debug defines out of AppHdr.h
Aidan Holm [Sun, 25 Oct 2020 08:01:28 +0000]
Split debug defines out of AppHdr.h

These defines sync DEBUG and NDEBUG. Normally, I'd do this in the
Makefile, which would ensure that all compilations have only one of
these defined, but unfortunately different compilers provide different

Instead, we can move this to its own header file. This allows it to be
included from debug.h, which depends on these rules to verify that they
are not out of sync. Really, all .h and .cc files should include this,
as header files may define static functions which contain asserts, which
would otherwise invoke the assert macro before possibly defining NDEBUG.

Probably the ideal solution in the general case is to have a single
header file that all other headers must include. This should be
extremely minimal, containing only definitions that are vital for
correctness, such as this DEBUG/NDEBUG syncing. Specifically,
convenience definitions should not be included: AppHdr.h is already a
mess in this regard.

4 months agoFix includes for some commonly used header files
Aidan Holm [Sun, 25 Oct 2020 08:01:00 +0000]
Fix includes for some commonly used header files

4 months agoAdd includes, using statements for std::vector
Aidan Holm [Sun, 25 Oct 2020 06:28:23 +0000]
Add includes, using statements for std::vector

4 months agoFix includes for all foo-type.h headers
Aidan Holm [Sat, 24 Oct 2020 19:45:11 +0000]
Fix includes for all foo-type.h headers

4 months agoSplit kill_method_type enum into its own header file
Aidan Holm [Sat, 24 Oct 2020 19:24:02 +0000]
Split kill_method_type enum into its own header file

Going full IWYU is difficult doe to tangled dependencies between
different files. Breaking this enum into its own file will break one of
these cycles.

4 months agoMake some mon-ench methods private
Aidan Holm [Sat, 24 Oct 2020 15:47:25 +0000]
Make some mon-ench methods private

4 months agoAdd BUILD_ALL=1 build tests to GHA CI
Aidan Holm [Sun, 25 Oct 2020 14:05:31 +0000]
Add BUILD_ALL=1 build tests to GHA CI

These are only run for TILES builds for clang/gcc, since they have the
widest set of dependencies and will therefore likely catch issues with
webtiles/console builds.

4 months agoAppreciate the great tradition of curling canadian-curling pull/1594 1594/head
Nicholas Feinberg [Sat, 24 Oct 2020 16:24:03 +0000]
Appreciate the great tradition of curling

To make palentongas a bit more interesting, and to synergize with their
'roll into a bunch of enemies' power, give palentongas a passive
'defensive curl' mutation at XL 7. This gives them +7 AC after they've
been hit, lasting until the *start* of their next turn. In short, it
makes them tougher against multiple enemies or against multi-hit enemies
like hydras, somewhat like the inverse of how shields work.

The main issue here is communication. I'm not sure how best to demonstrate
to the player that this is happening on subsequent hits without spamming
'you curl/you uncurl' messages after every hit. The behaviour in this PR
has no spam but is also super easy to miss entirely. Suggestions welcomed!

4 months agoFix ccache not working on GitHub Actions CI
Aidan Holm [Sun, 25 Oct 2020 11:28:16 +0000]
Fix ccache not working on GitHub Actions CI

ccache was not working for a number of reasons. First, the compiler was
not being invoked through ccache: this requires invoking the compiler
via a symlink named after the compiler binary that points to the
ccache binary.. An alternative method is to add a directory containing
preprepared symlinks to the PATH. alexjurkiewicz/setup-ccache does this,
but it seems the path it prepends is incorrect.

Next, GHA will not actually *update* the cache contents if the cache
was restored with a direct key match! In order to fool GHA into doing
so, we append the SHA1 of the commit being tested, ensuring that each
cache save is saved with a unique key (jobs with the same SHA are
disambiguated by matrix parameters). Cache restoring therefore relies
on partial matches, and will restore the most recently saved cache

However, GHA cache restore prefix matching apparently requires a dash
at the end of each pattern in order to match. This isn't documented
explicitly (of course), but all their examples use this format, and
adjusting this caused GHA to correctly restore the most recent cache.

This commit also zeroes the ccache stats before running, so that the
stats printed at the end reflect only the current compilation job. If
ccache breaks in the future, this will ensure that we aren't fooled by
the cache being restored, but never used, and showing old stats.

With high hit rates, this roughly halves runtime, from ~15 minutes to ~6
minutes. Major remaining sources of latency:
 - ~3 min: collecting coverage with lcov.
 - Install requirements/dependencies: ~1.5min for gcc, 2min for clang.
 - actions/checkout: ~40sec.
Of these, installing requirements/dependencies can probably be optimized
by caching the package manager cache directories.

4 months agoAdd a missing wall (n1000)
gammafunk [Sun, 25 Oct 2020 07:25:06 +0000]
Add a missing wall (n1000)

A bottom-right corner square was missing, thus making the vault
accessible from outside without use of transporter (if you could get
past the statue).

4 months agoDon't crash when a monster kills itself with Primal Wave.
wheals [Sun, 25 Oct 2020 00:07:25 +0000]
Don't crash when a monster kills itself with Primal Wave.

Could happen with Ru retargeting.

4 months agoAdd missing std:: in enum.h
Aidan Holm [Thu, 22 Oct 2020 13:21:27 +0000]
Add missing std:: in enum.h

Since this is a header file (and the most widely used one at that), I'd
like to avoid adding 'use namespace std;' here.

4 months agoAdd missing '#pragma once' lines to headers
Aidan Holm [Thu, 22 Oct 2020 13:20:42 +0000]
Add missing '#pragma once' lines to headers

4 months agoMove a bunch of preprocessor macros out of AppHdr.h
Aidan Holm [Mon, 29 Jun 2020 12:12:15 +0000]
Move a bunch of preprocessor macros out of AppHdr.h

Currently, most headers are not self-contained; they often refer to
symbols that they do not themselves import. This is pretty awful and
tends to flummox code analysis tools, as well as making automated
refactoring quite challenging (since you cannot simply include a

This commit splits a bunch of widely used macros out of AppHdr.h, which
is the pre-compiled header for DCSS. Unfortunately it's accumulated a
bunch of other cruft which really doesn't belong there; these macros are
commonly used in headers as well, but it's unwise for headers to import
AppHdr.h, since it has many dependencies by design.

We're keeping the 'using namespace std' for now, but it'd really be
better if we can slowly remove this... it's especially bad to include in
headers, since it extends to anything that includes them.

4 months agoAdd tag-version.h includes
Aidan Holm [Thu, 22 Oct 2020 13:03:30 +0000]
Add tag-version.h includes

These files all use TAG_MAJOR_VERSION, and so should all include the
header which defines that: tag-version.h

4 months agoFix always_show_zot (vt)
Nicholas Feinberg [Fri, 23 Oct 2020 02:51:38 +0000]
Fix always_show_zot (vt)

Don't claim you're always bezotted while the option is on.

4 months agoDon't let rolling boulder beetles push (ardl)
Nicholas Feinberg [Thu, 22 Oct 2020 21:52:25 +0000]
Don't let rolling boulder beetles push (ardl)

It's bad boulderfeel.

4 months agoRandomize roll duration more precisely
Nicholas Feinberg [Thu, 22 Oct 2020 21:49:08 +0000]
Randomize roll duration more precisely

Don't round to integer player turns. (This mostly doesn't matter,
but it's nice.)

4 months agoDecay rolling over time
Nicholas Feinberg [Thu, 22 Oct 2020 21:48:46 +0000]
Decay rolling over time

It would (essentially) never expire before, despite having a duration.

4 months agoMake boulder beetles slower than speed 100
Nicholas Feinberg [Thu, 22 Oct 2020 21:37:19 +0000]
Make boulder beetles slower than speed 100

The original commit claims they roll at speed 20. Let's do that.

4 months agoSplit env.tile_* fields into a separate global
Aidan Holm [Tue, 20 Oct 2020 13:43:10 +0000]
Split env.tile_* fields into a separate global

Currently a lot of widely used objects are grouped together into the
env global. While env thankfully doesn't have any behaviour itself,
this has the unpleasant effect of obscuring the actual dependencies
between objects: everything depends on env because everything is in env,
and since it's already widely used, it can easily accrete more stuff,
causing a snowballing effect.

This commit breaks a subset of tile drawing related fields into their
own separate global "tile env" object. The presence of this global isn't
great, but it's much better than lumping everything together: env.h is
included 119 times, while the newly-added tile-env.h is now included
only 23 times: around a sixth of the users. This not only clarifies the
dependencies involved, but will also aid compilation time: if this file
needs to be changed, recompilation will be six times faster.

Of course, ideally none of the functions involved need to pass around
data in global mutable state. With smaller globals with a smaller number
of users, analyzing the structure of data transfer is now tractable,
and hopefully this "tile env" global can be pulled apart and refactored

4 months agoAdd some test cases for
Aidan Holm [Mon, 19 Oct 2020 16:35:53 +0000]
Add some test cases for

4 months agoNote aux armour in stash search
Nicholas Feinberg [Wed, 21 Oct 2020 19:10:53 +0000]
Note aux armour in stash search

4 months agoRemove igrd() helper macro
Aidan Holm [Sun, 18 Oct 2020 09:15:36 +0000]
Remove igrd() helper macro

4 months agoRemove mgrd() helper macro
Aidan Holm [Sun, 18 Oct 2020 09:11:29 +0000]
Remove mgrd() helper macro

4 months agoRemove grd() helper macro
Aidan Holm [Sun, 18 Oct 2020 09:07:15 +0000]
Remove grd() helper macro

4 months agoRemove mitm() helper macro
Aidan Holm [Sun, 18 Oct 2020 09:00:39 +0000]
Remove mitm() helper macro

4 months agoRemove menv() helper macro
Aidan Holm [Sun, 18 Oct 2020 08:46:40 +0000]
Remove menv() helper macro

Rationale: these helper macros allow slightly briefer references to the
same object, but are more obscure: they hide the fact that a single
global object is being referenced, and have inconsistent spelling. They
also make it somewhat harder to use IDE/text editor tools to jump to
definitions and find references. Simply referring to these objects via
the env global is much clearer and more user-friendly.

4 months agoGive Edmund a weaponless tile, fixing #1453
amcnicky [Tue, 15 Sep 2020 15:24:07 +0000]
Give Edmund a weaponless tile, fixing #1453

4 months agoAdjust doors in a runed door vault
gammafunk [Mon, 19 Oct 2020 08:33:26 +0000]
Adjust doors in a runed door vault

Make the entire entrance to gammafunk_indiana_jones runed to avoid
autoexploring into a Zot trap, and to generally improve the structure of
the vault. Keep the "trap" gate as a (non-runed) clear door, but the
final door normal, since the glass around it takes care of visibility.
Also make the glass stone instead of rock.

4 months agoSome transporter vault adjustments
gammafunk [Mon, 19 Oct 2020 08:26:23 +0000]
Some transporter vault adjustments

Some placement adjustment for various transporter vaults to make their
placement more appropriate.

gammafunk_its_a_trap: Remove placement from Shoals, where the vault is
generally too large for the islands generated by the layout, and Swamp,
where a large stone structure doesn't fit in as well thematically. I've
left them in Snake, which has a more dungeony layout that fits and
spider, where the stone structure meshes well with the cave-like layout
enveloping it. There is a theme issue that's similar to Swamp, but it's
nice to have transporter vaults in half of our Lair branches. For later
branches with relatively shallow or just absent out-of-depth monster
sets, supplement the 8-tier monsters with some specially selected ones,
using the same choices as gammafunk_dig_for_victory.

emtedronai_trogs_sanctum: Add placement to Orc, since this is certainly
a suitable place for this vault, but using more of the "ogreish'
monsters over too many orc knights.

gammafunk_sealed_arena: Add to all four non-Slime S branches, taking a
bit of care to use the right statue Shoals and wall types for Swamp and
Spider. Also add to Orc and Pan.

4 months agoAdd transporter vaults to Vaults
gammafunk [Mon, 19 Oct 2020 08:25:33 +0000]
Add transporter vaults to Vaults

With c7717499, we can now place transporter vaults in Vaults. This
commit adds such vaults to this branch as "hard" vault rooms. The
structure of Vaults branch room vaults is such that vaults often need
substantial internal changes in order to be suitable. That usually
requires a separate vault definition, but these transporter vaults work
directly as vault rooms, so I've just given them the necessary tags.

For some vaults, I've added a border of floor around the vault that is
removed when not placing in Vaults branch. I experimented with simply
not having this, which would have allowed the vaults to connect two
otherwise disconnected areas, as they can do when placing outside
Vaults, but the vaults sometimes placed in rooms so that one side was
disconnected from the rest of the map. The necessary "passable" tag
disables checks against this that would otherwise normally generate a
veto, so I'm forced to add this path border. Ideally the zone validation
would know how to path through transporters so we wouldn't need
"passable" at all, but mumra's approach works for now.

For vaults with thematic monsters, I made appropriate choices that are
usually a mix between late Dungeon and Depths, since Vaults shares a lot
in common with both areas. Generally all monsters used can already place
in Vaults, since this is a stipulation these vaults already use for each

4 months agoAdd a tag to set vaults as passable
Peter Hurst [Fri, 12 Apr 2019 08:55:52 +0000]
Add a tag to set vaults as passable

In Vaults layouts, rooms are tagged 'transparent' by default in order to
check the whole level connects up properly. Some vaults may contain
enclosed areas, e.g. transporter vaults, so an escape hatch is needed to
prevent the builder from seeing these as disconnected zones.

Commiter's Note: Removed a linebreak from and rewrapped
commit message body.

4 months agoRephrase lifesaving desc
Nicholas Feinberg [Mon, 19 Oct 2020 05:07:49 +0000]
Rephrase lifesaving desc

"Watches over you" is poetic but very vague. "Guards your life" might
be at least a little clearer as to what it does. Probably there's a
better phrasing yet...

4 months agoCheck right god for life-saving in god description
Umer Shaikh [Sat, 10 Oct 2020 23:52:02 +0000]
Check right god for life-saving in god description

Currently describing a god checks your passives when deciding whether to
print something for the protect_from_harm passive. This leads to errors
in both directions: the passive is spuriously indicated when describing
gods that don't give it if you happen to be worshipping a god that gives
it, and is not printed for gods that do give it if you're not
worshipping them.

After this commit the god description checks whether the god being
described gives that passive.

(Committer's note: did a bit of refactoring.)

4 months agoFix out-of-bounds access (wheals)
Aidan Holm [Sun, 18 Oct 2020 16:15:23 +0000]
Fix out-of-bounds access (wheals)

This bug was introduced in b5bd653, which changed some code to use an
adjacent_iterator in passing, but neglected to adjust the expression
used to derive the adjacent coord_def.

4 months agoRemove references to globals across files
Aidan Holm [Wed, 14 Oct 2020 15:02:41 +0000]
Remove references to globals across files

I found three separate instances of functions reusing a global variable
exposed by for their own scratch space, all for mild
variations on the same BFS algorithm. This commit replaces that with a
local variable, and one of a more sensible type as well; only a boolean
visited / not visited state needs to be tracked.

I don't quite have the energy to properly extract these right now, but
these would possibly be a good candidate for unit testing.

4 months agoMake bats less anthrosolipsistic batty
Nicholas Feinberg [Thu, 20 Aug 2020 02:04:17 +0000]
Make bats less anthrosolipsistic

Batty monsters' behaviour depended on player turns, not monster turns,
which created strange and counterintuitive incentives. If you wanted
batty monsters (e.g. summoned harpies from Monstrous Menagerie) to
attack more often, attack the air with a short blade. If you wanted
them to attack less often, use a slower weapon.

This commit changes batty monsters to move randomly for exactly 3
turns after attacking (for most monsters - harpies and thrashing horrors
a little less, spatial maelstroms a little less yet).  It ends up looking
pretty similar, in my limited testing.

4 months agoMake pacified monsters visible (hellmonk)
Nicholas Feinberg [Thu, 15 Oct 2020 15:04:34 +0000]
Make pacified monsters visible (hellmonk)

To avoid accidental penance with Ely and to make it a bit more
consistent with friendly monsters. This mostly, but not exclusively,
affects Ely worshippers.

4 months agoMark ratskin as evil (12373)
Nicholas Feinberg [Thu, 15 Oct 2020 14:27:27 +0000]
Mark ratskin as evil (12373)

Since its hell rats will trigger ely wrath, apparently?

4 months agoA boulder beetle transporter vault
gammafunk [Mon, 12 Oct 2020 23:00:01 +0000]
A boulder beetle transporter vault

In gammafunk_boulding_lane, the player transports into the far side of
the vault with one to three boulder beetles at the far side. If you can
manage to get in before the boulder beetles all see you, you might avoid
their rolling down the lanes as they look to mark a strike. The loot
always contains a pre-identified pair of boots of rampaging (which can
be barding). The number of beetles and loot quality and quantity scales
with depth, with up to 3 beetles appearing along with an eventual torpor
snail. The loot scales up to artefact quality boots and another

4 months agoA themed vault with boulder beetles
gammafunk [Sun, 11 Oct 2020 18:20:12 +0000]
A themed vault with boulder beetles

In gammafunk_indiana_jones, you find the corpse of adventurer in a
narrow, spider-filled corridor leading to a "trap" room with a boulder
beetle (or two or three), that further leads to a trapped treasure room.
In earlier depths, this is flame clouds in front of lava snakes
(snakes...why did it have to be snakes...), and later on this becomes a
room with fast moving spiders and Zot traps. If the player fights the
beetle(s) in the long corridor, they're fairly likely to get flattened
by a rolling bug.

The loot consists of the characteristic whip and hat near the corpse,
which scales in quality and with the whip eventually becoming a demon
whip, along with jewellery plus possible gold in the treasure room. The
monsters and traps likewise scale in number and dangerousness with
depth, increasing the number and dangerousness of spiders as well as the
number of boulder beetles.

It'd be nice to better decorate this vault in Tiles with a more forest
temple theme, but there aren't very appropriate stone wall tiles for
this purpose.

4 months agoShrink hell sentinels back down
Nicholas Feinberg [Fri, 9 Oct 2020 19:02:22 +0000]
Shrink hell sentinels back down

I'd misunderstood the context of a request.

4 months agoMake demons truly spineless
Nicholas Feinberg [Thu, 8 Oct 2020 00:09:30 +0000]
Make demons truly spineless

Remove M_SPINY from Hell Sentinels and torturous demonspawn. This
mechanic had approximately no impact on the game - 4d5 AC-resisted
damage is just not meaningful against extended-capable characters.
We could increase the damage or not make it AC-resisted, but the
effect isn't very interesting here. There's no particular reason we'd
want melee characters to be somewhat worse at fighting these enemies,
and if we did want that, we could just strengthen their melee attack.

Hell Sentinels are now giant so as to be net immune. This will also
let them waltz through deep water, which probably doesn't matter?

4 months agoDon't splash yellow draconian spit onto the spitter.
wheals [Thu, 8 Oct 2020 01:17:26 +0000]
Don't splash yellow draconian spit onto the spitter.

4 months agoStreamline the Zot Clock
Nicholas Feinberg [Sun, 4 Oct 2020 21:36:47 +0000]
Streamline the Zot Clock

(Alternate commit title: Zot Around The Clock)

The Zot clock has been working OK as a time limit, but
it has a major shortcoming: it's not explained to players
at all. The reasoning there was that we didn't want to
stress players out or to make it easier to sneak around
the clock, but the very loose time limits on the current
clock make it easy to sneak around regardless for a spoiled
player, and unexplained mystery deaths are more stressful
than occasional messages.

(Also, if players don't know that the clock exists, it
doesn't serve its intended role of discouraging very slow

So, derandomize the Zot Clock, remove the drain penalty,
display remaining turns when there are <1k left, and add
an option (off by default) to display remaining turns at
all time. Also, take another pass on the messaging. That
should hopefully leave the whole thing in good enough
shape for release.

4 months agoRemove an antique and redundant status list
Nicholas Feinberg [Sun, 4 Oct 2020 22:28:56 +0000]
Remove an antique and redundant status list

Sage, really?

4 months agoFix the TAG MAJOR upgrade script
gammafunk [Sun, 4 Oct 2020 12:51:41 +0000]
Fix the TAG MAJOR upgrade script

The pakellas experiments des file has already been removed.

4 months agoRemove unused Pakellas vaults
gammafunk [Tue, 29 Sep 2020 17:07:12 +0000]
Remove unused Pakellas vaults

These vaults where sitting in a des file with 0 weight mostly due to
accompanying lua triggers that need to be defined for save compatibilty.
I've moved the required functions to a designated save compat lua file
with the function definitions emptied out to the extent possible. This
should cover save compatibilty, but even if there is a problem, the odds
of there being an affected save out there with the vaults actually
generated are quite small at this point.

4 months agoRemove some boring beasts
gammafunk [Tue, 29 Sep 2020 13:32:33 +0000]
Remove some boring beasts

With the re-introduction of boulder beetles to Lair and Dungeon, it's a
good time to remove some of the redundant beasts we have in these
branches. This commit removes hippogriffs, crocodiles, and porcupines.
The first two are simple speed 10 beasts that have little to
differentiate themselves from other melee-only monsters of similar
difficultly at mid-Dungeon and Lair depths.

Porcupines are fast and have a spine mechanic, so they're arguably the
most interesting of the three removed monsters. However their spines are
an "anti-melee" trait that works poorly in terms of influencing the
player's decision to melee or not. Culling the monster list down to a
set that all work well design-wise is a good long-term goal, and neither
branch lacks for good fast melee monsters.

Level spawn weights of each of the three removed monsters has been
giving to respective similar monsters in both branches, with adjustments
so that the impact of removal is minimal. The new weights and changes in
level spawn chance are described in this google spreadsheet:

See the "Chance (Modified)" and "Increase in chance" sections of each

Dungeon has such a large monster set that the largest increase in any
affected monster placement on any level is a fraction of 1%. For Lair,
the largest increase is less than 3%. I increased placement range of the
few more interesting beasts such as polar bears, hell rats, stream
dragons. Additionally, a few weights for rarer Lair beasts are now
doubled, but these monsters are already quite rare and have a placement
chance of 1% or less throughout their range.

4 months agoRe-implement boulder beetles
gammafunk [Fri, 18 Sep 2020 16:54:56 +0000]
Re-implement boulder beetles

Boulder beetles return as a speed 10, 12 HD monster with good AC, melee
slightly better than a death yak, and a rolling attack that doubles
their movement speed and melee damage (1d32->1d64).

They will only self-enchant with the rolling debuff when not already
adjacent to their foe, hence either killing them at range or getting
them into melee range is a priority to avoid their 1d64 rolling damage.
After performing a melee attack in the rolling state, the beetle always
debuffs, returning to its unrolled state. One of the advantages of
having the roll attack be normal melee is that it uses normal melee
mechanics, checking SH and EV, and their modified attack damage is shown
under x-v when in the rolling state.

Boulder beetles also have a blink ability in order to eventually reset
their positioning and allow a subsequent roll, although they cast this
with low frequency. While rolling, they never use either of their

Possible TODO items:

1) "Missing" the player. In my original proposal, I wanted a missed roll
to allow them to "roll past" the player, giving the player a chance for
additional punishment but also allowing the beetle to set up another
roll. Currently this is not implemented, since this aspect was mostly to
the old trivially avoidable (but comedic) roll attack. They already can
reset their position using blink, and with the profile of this monster,
giving the player additional opportunities to damage it would likely
just make it too easy. Still, it remains an option if `??meme rule` is
being ignored.

2) Rolling duration. Right now it's 10 to 15 turns, giving faster
players a fighting small chance at outrunning a rolling beetle that
starts rolling many tiles away, but for normal speed players, even being
7 tiles away means they will not outrun the roll.

3) AI changes while rolling. Should beetles ignore damaging terrain like
traps and clouds while rolling? Currently they don't change their damage
consideration compared to their normal state. This would lead to them
"hover-rolling" before damaging clouds in some cases.

4) Theme of "blink". This is done as the usual translocations effect,
although I had originally planned for this to be themed as a "flip" to
make more thematic sense as a natural ability. Jumping spiders likewise
have no special translocations theme and do the same kind of blink, so
maybe leaving the normal blink is best.

5) Placement and vaults. I mostly re-added them to the spawn lists with
sensible weights and to vaults and Sprint in the appropriate places.
I'll likely make some special boulder beetle transporter or runed door
vaults that get at the theme of the old boulder beetle trap vaults, just
without the spoilers.

4 months agoInsect glyph reorganization
gammafunk [Fri, 18 Sep 2020 16:54:44 +0000]
Insect glyph reorganization

Insects were using 'a' (ants), 's' (mostly arachnids), and 'y' (flying
insects. With the re-introduction of boulder beetles in a forthcoming
commit, I'm re-introducing the 'B' glyph and moving all ants, beetles,
and other non-flying insects here. Now 's' is reserved for arachnids,
and we won't have a new mostly unused insect glyph on 'B'.

Alternatively we could have beetles and non-flying insects on 'a', thus
not moving ants from their ideal home, but kate- was more in favor of
the 'B' glyph. There are only two prominent monsters that are bona fide
ants and that actually appear in level spawn lists: worker and soldier
ants. There are perhaps more prominent non-ant insects that likewise
appear in spawn lists: giant cockroaches, boulder beetles, and death
scarabs. Entropy weavers aren't truly insects, although legends say they
are truly formicids, hence ant-like. In any case, it's possible to move
non-flying insects all from 'B' to 'a' if the 5% of the player-base that
uses console raises an ant army in revolt.

4 months agoUpdate the manual
Nicholas Feinberg [Sun, 4 Oct 2020 03:45:04 +0000]
Update the manual

5 months agoExtremely vane tiles (canofworms)
Nicholas Feinberg [Wed, 30 Sep 2020 17:05:02 +0000]
Extremely vane tiles (canofworms)


5 months agoCancel Heroism and Finesse on angering or abandoning Okawaru
Nikolai Lavsky [Wed, 23 Sep 2020 10:08:48 +0000]
Cancel Heroism and Finesse on angering or abandoning Okawaru

Currently, only Heroism, Finesse, and Elyvilon's Divine Protection
don't expire immediately when the player is placed under penance. It
seems thematically appropriate for Divine Protection, but even Elyvilon
removes all divine effects on abandonment.

This commit puts Okawaru in line with other gods.

5 months agoUpdate
Petri Salminen [Sun, 20 Sep 2020 13:53:04 +0000]

Instructions for Void Linux were removed in f485615. The table of contents should not have dead links.

5 months agoRemove qw support for dragon hides
Nicholas Feinberg [Fri, 25 Sep 2020 20:41:36 +0000]
Remove qw support for dragon hides

5 months agoUpdate an advanced_optioneering example
advil [Thu, 24 Sep 2020 16:28:36 +0000]
Update an advanced_optioneering example

I'm not sure how useful this really is in and of itself, but it's useful
as an example userfunc macro at least.

5 months agoSet an error on invalid fn argument to c_macro
advil [Thu, 24 Sep 2020 16:23:30 +0000]
Set an error on invalid fn argument to c_macro

Entirely possible that this will start popping up errors all over the
place for something I'm not expecting...

5 months agoAdjust gold acquirement
Nicholas Feinberg [Wed, 23 Sep 2020 02:16:53 +0000]
Adjust gold acquirement

Now that the player can see all acquirement options before choosing one,
gold became too often a very easy choice. The massive swings of the old
gold acquirement formula made sense when the player was gambling on an
unseen outcome, but now that the player can see the result before choosing,
all it does is produce random windfalls and unsatisfyingly simple acqs.

Simplify the formula to range nonlinearly between 200 (a disappointing but
nonzero consolation prize) and 1400 (a solid chunk of change, enough to
buy many small things or one very big important thing). Mean of 800, which
is only a bit lower than the old mean and is reasonably competitive with
many items, but generally less exciting than anything really good. (Which
it should be, because getting items from acq is fun!)

I considered removing the guaranteed gold acq, but I think it is good to
have a decent fallback case to acquirement. It just shouldn't be the pick
quite so often.

5 months agoRemove guaranteed early Nemelex deck
Nicholas Feinberg [Wed, 23 Sep 2020 01:43:32 +0000]
Remove guaranteed early Nemelex deck

As with Gozag, Nemelex granting a guaranteed early deck (before the
player even reached 1* of piety!) was part of what made them remarkably
strong. Shift that early guaranteed deck and all other deck gifting to
after the player reaches 1* of piety, to require a little work by the
player before they get their reward. (This decreases deck gifting somewhat
in general, though less so at higher piety.)

5 months agoRemove free gozag potion petition
Nicholas Feinberg [Tue, 14 Jul 2020 01:48:19 +0000]
Remove free gozag potion petition

Few gods give anything to their followers on initial worship. One of
Gozag's strongest traits is the instant on-worship get-out-of-jail
card that the free intro potion petition grants. Let's dial that back.

5 months agoRemove hat (hellmonk)
Nicholas Feinberg [Wed, 23 Sep 2020 01:32:39 +0000]
Remove hat (hellmonk)

From the name of the Ashenzari altar, to avoid false name matches.

5 months agoMerge Hell zot clocks
Nicholas Feinberg [Sun, 20 Sep 2020 15:06:55 +0000]
Merge Hell zot clocks

Avoid some corner case issues involving the Vestibule, maybe.

5 months agoSimplify some hellishly buggy travel code
Nicholas Feinberg [Sun, 20 Sep 2020 15:05:31 +0000]
Simplify some hellishly buggy travel code

Obviously, don't fix the bug.

5 months agoRaise Zot Clock bank cap 15k -> 27k
Nicholas Feinberg [Sun, 20 Sep 2020 14:57:38 +0000]
Raise Zot Clock bank cap 15k -> 27k

The goal of the zot clock bank cap is to prevent players from having
truly tremendous amounts of time to spend to do tedious things on
specific floors. In practice, I haven't seen reports of anyone really
doing anything unpleasant with the current limit, and the 15k cap caused
issues with shaft traps on rare occasions.

Let's raise it to 27k (meaning it approximately doesn't exist outside D)
and see what happens. It might vanish entirely in future, or it might drop
again, depending on the results of this experiment.

5 months agoFix a crash on describing an unid'd wand.
wheals [Mon, 14 Sep 2020 10:03:32 +0000]
Fix a crash on describing an unid'd wand.

5 months agoRemove Traps and Doors
Nicholas Feinberg [Sun, 13 Sep 2020 20:32:52 +0000]
Remove Traps and Doors

This comment was added along with the vault 10 years ago (in c2102b4)
and referred to a long NSUBST sequence that has long ceased to be.

5 months agoRefactor monster self-destruct code
Nicholas Feinberg [Sat, 12 Sep 2020 16:05:25 +0000]
Refactor monster self-destruct code

5 months agoRemove unused M_HYBRID flag
Nicholas Feinberg [Sat, 22 Aug 2020 18:28:30 +0000]
Remove unused M_HYBRID flag

Obsolete since f67d6e41dd8a7dce658198c42247ac2f8df114a4 , back in
2015, hah!

5 months agoRefactor monster death effects
Nicholas Feinberg [Fri, 21 Aug 2020 19:57:29 +0000]
Refactor monster death effects

5 months agoUpdate the Place: on the sidebar when leaving X.
wheals [Sun, 13 Sep 2020 13:58:05 +0000]
Update the Place: on the sidebar when leaving X.

There was a bug that left it showing the last place you had looked at,
rather than your current location.

5 months agoAlways abort charge targeter with no valid targets (#12355).
wheals [Sun, 13 Sep 2020 11:27:20 +0000]
Always abort charge targeter with no valid targets (#12355).

5 months agoHandle dynamic DPI in webtiles glyphs mode
wjchen [Wed, 2 Sep 2020 04:53:55 +0000]
Handle dynamic DPI in webtiles glyphs mode

This commit fixes handling of dynamic DPI situations in webtiles glyphs
mode that was accidentlly broken in 4531bab.

5 months agoGive x-v a selection menu when there are many describable things
Umer Shaikh [Thu, 27 Aug 2020 03:35:35 +0000]
Give x-v a selection menu when there are many describable things

This commit creates a selection menu when you x-v a tile with multiple
monsters, items, or notable features (following the ^x screen's notion
of notability), whether or not they are of the same type.

As of 2a96157, when there is an item stack on a tile you can x-v the
stash to describe any item in the stash by selecting the desired item
from a menu. However, if a monster is on that stash, then x-v describes
the monster and ignores the items. Similiarly, a monster or items stop
you from seeing the description of an interesting feature. After this
commit a selection menu will pop up in any of those cases, so you won't
be stopped from examining underlying things of a different type.

This commit adapts the menu in _full_describe_menu, which is already
designed for displaying a selection menu with these three types of
things. Therefore I've removed the function describe_items, added
recently by 2a96157 to allow selection from a stack of items.

5 months agoDistort layout_cave_pods when in Snake
Skrybe [Fri, 11 Sep 2020 00:08:01 +0000]
Distort layout_cave_pods when in Snake

Give a wavy structure to the corridors and walls of layout_cave_pods
when generated in Snake.  This is the same effect that is already used
for onion and onion_interference in Snake.

[ Committer's note: checkwhite. Closes #1561 ]

5 months agoUpdate layout_loops.des
Skrybe [Thu, 10 Sep 2020 23:43:34 +0000]
Update layout_loops.des

Along the same thinking as chaotic_city, remove an uncommon chance to create a layout entirely of stone or metal in Lair.  This function is used in all of the loops layouts, but only layout_loops_ring is currently used in Lair.

5 months agoEdit layout_chaotic_city
Skrybe [Thu, 10 Sep 2020 23:32:54 +0000]
Edit layout_chaotic_city

The layout now only places rock walls when generated in Lair, per a TODO note.  The result does look far better, IMO.

5 months agoFix item.subtype() in CLua
mgdelmonte [Wed, 2 Sep 2020 15:12:28 +0000]
Fix item.subtype() in CLua

[ Committer's note: reworded. Closes #1451. Closes #1551 ]

5 months agoActually let randarts generate with the spectral brand
Nikolai Lavsky [Fri, 28 Aug 2020 09:12:10 +0000]
Actually let randarts generate with the spectral brand

As a followup to 65aa84ea, this commit adds the spectral ego
to the list of possible artefact brands for melee weapons.

[ Closes #1541 ]

5 months agoDescribe wand noise levels
Naruni [Fri, 28 Aug 2020 04:34:29 +0000]
Describe wand noise levels

Inspecting a wand will tell the player how much noise is generated when
evoking the wand.

[ Committer's note: squash + reword. Closes #1539 ]

5 months agoFix Hailstorm ally warning prompt (12362)
Implojin [Wed, 9 Sep 2020 20:58:55 +0000]
Fix Hailstorm ally warning prompt (12362)

This commit silences the hailstorm ally warning prompt for battlesphere,
spectral weapon, orb of destruction, and demonic guardians.

Monsters with M_PROJECTILE, (allied) M_AVATAR, or MF_DEMONIC_GUARDIAN flags
are bypassed in bolt targeting by bolt::ignores_monster, and hailstorm cannot
actually deal damage to them.

5 months agoMerge pull request #1558 from nlavsky/add-rampage-to-overview
Edgar A. Bering IV [Fri, 11 Sep 2020 21:27:20 +0000]
Merge pull request #1558 from nlavsky/add-rampage-to-overview

Display Rampage on the % screen

5 months agoFix the divider position when tile_force_overlay is set
Marcelo Henrique Cerri [Sat, 5 Sep 2020 17:40:09 +0000]
Fix the divider position when tile_force_overlay is set

When tile_force_overlay is set the divider should always be set to the
end of the of the screen. Move the code that sets that to later in the
code so it doesn't get overwritten.

Without this fix, the space reserved for the message window is still
left unused at the bottom of the screen while the message overlay is
moved to the top of the screen.

5 months agoExpand macOS install instructions further (erf)
Alex Jurkiewicz [Fri, 4 Sep 2020 11:52:26 +0000]
Expand macOS install instructions further (erf)

5 months agoImprove docs for running DCSS after compilation
Alex Jurkiewicz [Thu, 3 Sep 2020 13:15:39 +0000]
Improve docs for running DCSS after compilation

5 months agoRemove bad position clamp for peeking through stairs
Umer Shaikh [Tue, 1 Sep 2020 10:09:05 +0000]
Remove bad position clamp for peeking through stairs

Using X and [ or ] to peek through stairs at different floors is
supposed to deposit the cursor on the other end of the staircase. Lately
the cursor has been frequently deposited in incorrect locations.

It appears that 08ff59a6b inadvertently clamped the destination position
according to the known map bounds of the floor being peeked from, which
tends to move the cursor to an incorrect spot on the floor being peeked

I have simply removed the clamping: if mstate's position was on the same
level then the clamping after the conditional call to goto_level will
serve the same purpose, and if not then clamping before that call is an

5 months agoStop acquirement of +4 stat rings
Umer Shaikh [Mon, 31 Aug 2020 09:13:57 +0000]
Stop acquirement of +4 stat rings

These rings aren't supposed to exist anymore as of 2607d5cfa1. However
acquirement was making them by producing -4 bad stat rings and then
setting the rings' plus value to abs(the old plus).

This commit has acquirement directly set the plus for acquired rings to
the "good" value for that base type. This does not affect unrandarts but
may modify randarts.

5 months agoAdd missing "info" command to --edit-save help
Roderick Schertler [Fri, 28 Aug 2020 19:48:55 +0000]
Add missing "info" command to --edit-save help

5 months agoFix a rampaging bug (12353, Flugkiller)
Implojin [Wed, 26 Aug 2020 18:51:28 +0000]
Fix a rampaging bug (12353, Flugkiller)

This fixes a rampage interaction with deep water / lava.

Previously, the rampaging tracer wasn't properly failing on dangerous
terrain. This was causing the rampage to abort at its moveto check instead,
which erroneously blocked the second half of the move.

5 months agoUpdate an antique comment
Nicholas Feinberg [Fri, 11 Sep 2020 02:28:27 +0000]
Update an antique comment

Obsoleted in 87348de860b6d4e (2016).

5 months agoDon't crash when putting on non-jewellery
advil [Thu, 10 Sep 2020 01:18:21 +0000]
Don't crash when putting on non-jewellery

You can try to do this via the * menu, as long as you have jewellery at
all. This looks like it was broken when the call order was rearranged in
b2248e6a10f6; the problem is that jewellery_is_amulet will crash if it
is handed non-jewellery (because it is a subtype check, and is only
meaningful in that case), whereas this code assumes it would return
false. Just adding in the item type check is inelegant, but I don't want
to mess with the ASSERT.

5 months agoDisplay Rampage on the % screen pull/1558 1558/head
Nikolai Lavsky [Tue, 8 Sep 2020 18:49:38 +0000]
Display Rampage on the % screen

It's often hard to see all properties of equipped artefacts on
the overview screen, especially when the artefacts have long names.
The Rampage ego, which can appear on any randart armour, dramatically
changes the player's movement. So it's worth having a quick way
to see if equipped items have this ego.