0.25 Tournament Results

The 0.25 tournament is over. On behalf of the Dev Team, many thanks to all the server admins, outside contributors, bug reporters, and to the many DCSS players who made the 0.25 release and tournament possible! For 16 days, players could compete for tournament points and banners by playing 0.25 games on the public servers. This was the first tournament held with a major revision of the tournament rules, and there will be discussion threads on the tavern and dcss subreddit to collect feedback on the tournament rules.

This post is going to focus on the results. First, a few highlights from the player and clan results. For comprehensive results with first through fifth place winners in all categories, please see the tournament overview page.

The winning player was Yermak with 5,819 points. Over the course of the tournament, Yermak won 44 games, including a streak of 17 games and a low-turncount world record of 8,783 turns (Sapher, the previous record holder has reclaimed the throne with a post tournament 8,331 turn win). In second place was shummie with 4,235 points and 20 wins, including the lowest XL win with an XL 15 SpEn and a 52 Ziggurat mega-zigging character. Rounding out the top 3 was Flugkiller with 3,513 points and 14 wins, including the first win of the tournament 35 minutes and 32 seconds after the tournament started with a duration of 35 minutes and 12 seconds.

The new tournament format divided scoring in to several categories, and our top three took several of the top spots in these categories. They weren’t the only players at the top of the leaderboard. Yermak maxed out the Piety category, championing and winning every god over the tournament. The Unique Harvesting category included player ghosts, and by diving Ziggurats for player ghosts ehdcjf2142 won the category with 1,332 points. Long time crawl dev elliptic topped the tournament Win Rate category, with an impressive 90.91% adjusted win-rate, winning all 10 games played over the tournament. Yermak had the longest streak, and tied for second place were GordonOverkill and MrMan with 13 game streaks each. Acrobat was the master of Nemelex’ Choice, winning 25 choice combos over the tournament. Yermak also took the Combo High Scores category with 62 points (21 combo high scores, 20 of which were won, 4 species high scores and 3 background high scores), followed by aperiodic with 34 points (17 combo high scores, 6 of which were won, and the Spriggan and Ice Elementalist high scores). It should be no surprise that Yermak continues to top category leaderboards, with the highest score of the tournament (56,717,235 points); followed by Flugkiller (51,589,384 points) and aperiodic (45,485,504 points). I already mentioned Yermak’s turn-count world record; EnegeticOcto came in second place for best turn-count win, completing a game in 10,320 turns itself one of the lowest turn-count runs of all time. p0werm0de topped the fastest real-time win category with an impressive 24:20 win. Our top players were also at the top of the Low XL-win leaderboard; shummie at XL 15, Yermak at XL 16, followed by EnegeticOcto and sentinel who both posted XL 17 wins. Flugkiller heralded the start of the tournament with his first win; the first all-rune win came from p0werm0de a mere 40 minutes after that. shummie and Flugkiller topped the Ziggurat Dive leaderboard, followed by ehdcjf2142′s 26 consecutive Ziggurat dive for 3rd place. Finally, Ge0ff and shummie were the only two players to complete all tier 3 banners both finishing the tournament with a perfect Banner Score.

The clan competition was won by TeamSplat (captained by mandevil) with 7,007 points who topped the Piety, Harvesting, Combo High score, and Banner Score categories, as well as had several top players (including shummie). They were followed by FSTVLKers (captained by EnegeticOcto) with 6,563 points and Stick to Your Gods (Yermak’s one-player-clan). Overall 142 clans scored points in the tournament (compared to 143 in the 0.24 tournament).

Several of the clan categories simply gave the clan credit for their best player’s performance in a category, so I won’t recap those. The Piety, Unique Harvesting, Combo High Score, Nemelex’ Choice, and Banner Score categories were scored as a collective effort among clan members. In the Piety category, FSTVLKersMake_Beogh_Great_AgainStick to Your Gods, and TeamSplat all championed and won every god over the tournament. TeamSplat topped the Unique Harvesting category, followed by FSTVLKers and Gozags Lazy Faire fiscal policy. TeamSplat also finished first in Combo High Scores, followed by Stick to Your Gods and BLACK LIVES MATTER. FSTVLKers took the trophy for Nemelex’ Choice winning 31 Nemelex’ Choice combos between them, followed by Make_Beogh_Great_Again with 27 combos. Finally three clans completed (as a clan effort) all tier 3 banners to tie for first in Banner Score: TeamSplat, FSTVLKers, and Gozags Lazy Faire fiscal policy.

In both the individual and clan categories competition was fierce. Flugkiller came out to an early lead with his first-win points, and throughout most of the tournament held close to Yermak from 2nd place, until being edged out by shummie in the final days of the event. The Clan category followed similarly, with a fierce battle between Flugkiller’ FSTVLKers and mandevil’s TeamSplat (which had shummie as a member).

Thank you to everyone for playing, for your patience with the delayed start, and for your bug finding in the new tournament pages. I hope you enjoyed the new format, and look forward to reading your commentary in the discussion threads on the tavern and reddit.

To close out, here are some overall tournament statistics (with the 0.24 numbers in brackets for comparison). 2,947 players started a game and earned a point in some category; of those 2,772 completed a game in a non-boring way. This definition of “player” (players who completed a non-boring game) is used for subsequent calculations and was used for the 0.24 statistics.

  • Players: 2,772 (0.24: 2,880)
  • Total player time: 34,433 hrs (0.24: 35,422 hrs)
  • Avg player time: 12.4 hrs (0.24: 12.3 hrs)
  • Games played: 62,125 (0.24: 63,048)
  • Players who got a rune: 1010 (0.24: 1046)
  • 548 winners and 1871 wins (0.24: 540 winners and 1930 wins)
  • Win rate: 3.01% (0.24: 3.06%)
  • Proportion of players using WebTiles: 95.9% (0.24: 95.5%)
The 0.26 season is off to a rapid start with retired dev PleasingFungus sending in some neat ideas and several projects that were started just before the tournament receiving attention. Watch this space for further developments as the trunk update posts from the 0.26 cycle begin to flow.
Until next time, happy crawling!
Comments Off

0.25 “Magic Surges Out from Thin Air”

We are pleased to announce the release of Dungeon Crawl: Stone Soup 0.25 “Magic Surges Out from Thin Air”!

DCSS 0.25 features an overhaul of many spells to make spell schools more distinct and positioning more relevant for spell users, a simplification of the miscast system for when those new spells go wrong, a new style of acquirement scroll, and numerous user interface improvements including new options designed to make crawl more accessible for visually impaired crawlers. For a full list of significant changes, please see the changelog for the 0.25 branch.

Download DCSS 0.25 here (updating momentarily) or here, or play it online on one of many servers across the world! Packages for Windows, OS X, and Linux are all available now. (Debs coming very soon.)

The tournament starts today, 20:00 UTC Friday 12 June with all online 0.25 games counting towards your score. See the tournament page for more details, including how to join or set-up a clan. Clan membership changes remain open until 20:00 UTC Friday 17 June.

Many thanks to all those who have contributed to DCSS over the years. A special thanks to the following community members who contributed to DCSS 0.25 and a warm welcome to the first-time contributors, listed in italics. (Let us know if someone is missing, this data is tricky to collect in bulk!)

aaronegolden, AdamPG, Alex Jurkiewicz, Andrew York, Benoit Giannangeli, Byrel Mitchell, Clare Boothby, David Damerell, Emily, Gabriel Marks, Goratrix, hellmonk, Implojin, István Markó, James Buck, kitchen-ace, klorpaNathan Mills, mwvdev, Nikolai Lavsky, nirrattnerPeter Gerlagh, Psymania, Quipyowert2, riverfiendRojjaCebolla, sdynet, Skrybe, shummie, theJollySin, Umer Shaikh, zuurr

0.25 Tournament Delayed But Tournament Page Now Available

Hello crawlers. The ongoing protests in the United States and elsewhere have greatly limited the availability of some community members, including those working on the new tournament project, to do DCSS things. Although we’ve basically completed the tournament script changes and could run the tournament on time, it wouldn’t be fair to those people participating in protests or those just trying to deal with this difficult situation. To that end, we are delaying the start of the 0.25 tournament for one week until June 12th, 8pm UTC, and it will run for 16 days until June 28th, 8pm UTC. We’re sorry for the abrupt change of start date, but sometimes there are more important concerns.

That said, we do have a new tournament page populated with test data from online 0.25 games that you can take a look at now:


This will give you a chance to become better acquainted with the new rule set, but just as importantly you can help us find bugs and give suggestions for improvements! If you’re a UX expert with experience in the relevant technologies, check out the new-scoring branch in our repository of the tournament source code and consider making a pull request. Everyone can feel free to leave constructive feedback for the tournament pages in comments on this post or in your favorite venue for crawl discussion where you see devs lurking! We’ll continue finishing up the scripts and fixing bugs over the next week. Note that any games you see listed on the page above are just test data, and the database will be reset before start of tournament.

The 0.25 release will be made available for download at some point before June 12, and we’ll make an announcement when that happens. Thanks again for your understanding, and we hope you all are staying safe. Hopefully, in a week’s time, we’ll be ready to begin our quest to obtain a fabled artefact, the Orb of Zot!

Last 0.25 Updates and Release/Tournament Date

The 0.25 Updates mumble some strange words. The 0.25 Updates miscasts Dragon Form. The 0.25 Updates are flooded with distortional energies!

Greetings fellow crawlers, it’s time for a quick 0.25 update with the last changes that snuck in before the 0.25 feature freeze. All changes since May 22 have been balance changes and fixes to existing content rather than the addition of significant new features. But before we get to those changes, let’s talk about the release and tournament dates.

The 0.25 release will be Friday, June 5th, with the 0.25 tournament starting at 8pm UTC that same day. We don’t don’t yet have a rules page installed on this server, seeing as how ebering, chequers, advil, and (eventually, I promise!) myself are at work on the new scoring scripts. Until then, check out the writeup ebering made that describes the new rules in detail. We’ll be sure to make a follow-up post once that page is available.

Now for those last 0.25 updates. Please note that these are only the changes since that last Trunk Update. Please see the changelog for the full set of 0.25 changes:

  • Transmutations miscasts have been reworked to remove the bad form polymorphs, given the player more contamination instead. Given how often I see you all quaffing lignification before death, I’m surprised more of you didn’t enjoy becoming a tree!
  • Allies no longer stay out of the player’s line of fire. The ranged AI was updated previously to have monsters give ranged allies a clear path to hit their foes, but having them do this for the player’s line of fire proved annoying for the most common scenarios. This functionality might return in some way in the future, if we can work out a good method and UI.
  • Xom is now stimulated when you worship from a faded altar. Just a little gift to the people crazy enough to use those contraptions. Xom, of course, thinks you’re all hilarious.
  • Trove fees have been adjusted to not ask for potions of stabbing and to add possible fees for scrolls of fear and fog.
  • Formicids can no longer cast the Swiftness spell. Look, we don’t want you crawling away that easily. Try a shaft instead!
  • Paralysis, sleep, and confusion status icons are now shown for allies.
  • Many new random artefact description words have been added. Nouns, verbs, adjectives, you name it!
  • Tiles have finally been added for Cigotuvi’s Embrace, Hood of the Assassin, and Tins of Tremorstones. What, you didn’t like those fancy TO/DO icons?

The stone_soup-0.25 branch is available in the repository, but hasn’t been installed on servers yet. This will change in coming days, and at that point you can help us test the 0.25 beta. Until then, please report any bugs you notice in trunk (now 0.26 alpha!) on github or mantis. As always, and until next time, happy crawling!

Trunk Updates 15 May 2020 and tentative 0.25 release tournament info

The trunk updates explode into fragments!

Hello crawlers and welcome to the last featureful trunk update of the 0.25 cycle. We’re entering into feature freeze today, the remaining time before the 0.25 Release and Tournament will be devoted to bug fixes, balance tweaks, and polish—as well as implementing a new tournament scoring system. You can give your feedback on the proposed new system on the tavern. Tentatively the 0.25 Tournament will start on either May 29 or June 5, depending on the implementation of the new scoring system.

So as you oil up those tab keys and clean your monitors, lets look at the very latest round of changes you’ll face in the upcoming release (stay tuned for the full 0.25 changelog! edit: since this post is getting shared and continues to be confusing to people reading it out of context; this list is not a 0.25 changelog, but rather a trunk update covering just the last few weeks or so):

  • Abyss exits that spawn from earning xp can spawn after the initial spawn, instead of every subsequent spawn being a downstair.
  • A few Nemelex cards have changed:
    • The Pain card no longer summons flayed ghosts, instead it torments monsters at high power (not the card user, though)
    • The cloud card now places vision obscuring black smoke instead of damaging clouds
  • Tins of Tremorstones are now an XP charged evocable with 3 charges that scales with evocations and automatically targets the center of all visible monsters. Wands of Scattershot have been removed.
  • Several amulet, scarf, and cloak egos have been shuffled or adjusted:
    • Gourmand, Harm, and Rage amulets are no more.
    • Amulets of reflection now attune at full HP and give +5 SH. Additionally, piety is now properly given for reflected missiles, banishment, and poison damage.
    • Scarves of cloud immunity and spirit shield are removed; new scarf egos harm and invisibility are added.
    • Invisibility cloaks are no more (you need a scarf for that now!); cloaks can now grant stealth or preservation (corrosion resistance).
  • Jewelry with plusses now get constant plus values: strength, intelligence, and dexterity rings give either +6 or -4; protection, evasion, and slaying rings give either +4 or -4.
  • Summon Lightning Spire now places the spire on a random square.
  • Malign Gateway tentacles can no longer attack out of LOS and appear sooner after casting.
  • Scrolls of acquirement are now cancelable, allowing you to fully inspect your character, stash, etc. before making a decision. When you reread the scroll, you’ll get the same choices until you make a final selection.
  • Leech is now a (cosmetic) sloppy eater: large hits will sometimes turn monsters into large blood explosions!
  • Sceptre of Torment can now be used with spectral weapon. You’d just better be undead unless you want your spectral weapon to torment you!
  • An ASCII screenshots section has been added to morgues, and a screenshot is made there every time you take a note with the : key.
  • Target acquisition for the Foxfire and Conjure Ball Lightning spells has been improved so they only acquire targets within player LOS.
  • Formicids can no longer cast the spell Swiftness.
  • The option auto_butcher defaults to true and the option auto_butcher_max_chunks now defaults to 10.
  • The option explore_auto_rest now defaults to true.
  • Several usability improvements for visually impaired players have been implemented.
That wraps it up for this set of trunk updates. Stay tuned for more tournament details and until next time, happy crawling!
The burst of trunk updates engulfs you!! Ouch! That really hurt…

Trunk Updates 1 May 2020

You miscast the trunk update. You are blasted with magical energy!!!!!!!

Hello crawlers. The 0.25 development cycle continues apace. Expect an announcement about a forthcoming release and tournament within the month.

This round of updates comes with an overhaul of the spell miscast system, to couple with the magic overhaul of this version. Miscasts have been thoroughly simplified, to the point that the effect of miscasting a spell can be included in its description! Read on for details and the scoop on the latest from the Iron City.

  • Zot traps have had their effect flowchart replaced with an effect table with a more focused list of awful terrible things to do to the player.
  • The Wu Jian Council met in executive session and tweaked some of their martial arts. Wall jumps move only to the ‘a’bility menu, movement triggering is no more. Whirlwind attacks no longer pin. Heavenly Storm has had its slaying mechanics simplified.
  • With miscasts simplified Xom now finds them boring and has turned their attention to summoning more demons on low level players.
  • As a prelude to the miscast changes several gods no longer use miscasts in their retribution. The new wraths are:
    • Trog replaces fire miscasts with pure fireballs in her fiery rage.
    • Lugonu exchanges translocations miscasts with a chance to banish, summon Abyssal things, or teleport the penitent to nearby monsters.
    • Cheibriados replaces miscasts with a chime on their clock before putting the player to sleep at high tension, and stat damage at low tension.
    • Fedhas’ elemental damage is now more focused: a corrosive bolt, a primal wave, or a thorn volley await those who would trample the flowers.
    • Yredelemnul prefers the simplicity of a bolt of draining to necromancy miscasts.
    • Kikubaaqudgha will still impose necromancy miscasts on those who attempt to use necromancy while under penance; for outright retribution they now apply the same ancient and terrible death curses used by mummies.
  • The scythe of Curses also replaces necromancy miscasts with death curses.
  • The distortion brand no longer teleports on hit; unwielding a distortion weapon has a chance to teleport the unwieldier to nearby monsters, contaminate, or banish.
  • Regeneration items (troll armour, artifacts) must attune to a player before granting their effect. No more carrying TLA to swap while resting!
  • Mummies have consulted the book of death and determined that necromancy miscasts no longer suit their vengeful needs. Death curses are now their own effect table, separate from miscasts. Kikubaaqudgha was involved as well, and still protects loyal followers from curses.
  • New monster: nameless horror. Nameless horrors are brought into the world by summoning miscasts, have an antimagic attack and abjure other summons as a natural ability.
  • Absolute Zero has been reduced to a fixed range of 5 (up to 6 with Vehumet), the noise now scales with power down to 0 at maximum power.
  • Leda’s Liquefaction regains its slow movement penalty, but the caster remains immune to its effects on melee combat.
  • Deflect Missiles has been removed. The tedious-but-optimal armour-wizardy-int dance has danced its last!
  • Lesser Beckoning and Teleport Other now turn allies hostile.
  • Tukima’s Dance cannot be used by Ru followers who have sacrificed Love.
  • Two new Gauntlet maps are live: one presents a sequence of arenas, after each you can chose to press your luck or turn and face the minotaur. The other has a choke point in the sequence: there is only one middle arena in the three-arena-sequence to the minotaur.
  • Miscast effects have been simplified. When miscasting a spell, the player receives magical contamination, and if the miscast is bad enough an additional effect that scales with the spell’s current failure chance. These effects vary by school as follows (compare to the old miscast effects, which could you even correctly lists all of them without a source dive?). For damaging effects the damage message is punctuated like other damage messages.
    • Charms and Hexes: debuff and slow
    • Summoning: durably summon a nameless horror
    • Translocation: dimension anchor
    • Transmutation: polymorph
    • Conjuration: irresistible AC-ignoring damage
    • Elemental schools: school flavored damage (Earth magic does fragmentation damage like Lee’s Rapid Destruction).
  • Monsters on D:1 are now back asleep, after briefly getting into the coffee.
That’s all for now, so until next time happy crawling!
Desperate hands claw out at the trunk update. A nameless horror comes into view. The trunk update vanishes in a puff of smoke!

Trunk Updates – 31 March 2020

You mumbles some strange words. You chill the trunk update to absolute zero! The trunk update is frozen into a solid block of ice!

Greetings fellow crawlers, it’s time for another Trunk Update. The 0.25 development cycle is slowly winding to a close, but we have some changes for you to try out, with more to come! Expect a release and tournament in the next month or two, barring any unforeseen delays. As always, we’ll make an announcement once we have a date in mind. This update features a couple larger changes we’ll give some extra detail about, along with some smaller updates described further below.

First up is the new L9 Ice spell Absolute Zero, which replaces the L9 Ice/Conj Glaciate spell. Level 9 spells are tricky to get right since they cost so much XP, yet we want to give players a reason to learn them. We also want these spells to be both distinct from the other L9 spells and relevant to their school; the latter is especially a focus with our spell changes this version. Glaciate fits reasonably into the Ice theme we’ve established, being a “diffuse” AOE spell, but it has too many similarities with Fire Storm yet functions like a worse version of that spell! Where Fire Storm is one of the best ways to kill monsters safely, Glaciate requires close proximity to be effective, and is far less good at blocking monster movement and line-of-fire.

Instead of reworking Glaciate and likely ending up with something similar to Fire Storm, so we went for more distinctiveness with Absolute Zero. This spell kills the closest target, leaving behind an ice block. It chooses randomly among the closest monsters if there’s a tie by distance. This kill is unconditional, so it works on everything from orbs of fire to Cerebov! The positional aspect comes getting the right monsters close enough when multiple monsters are involved, which is usually the case for dangerous fights late in the game. Absolute Zero might feel too cheesy at its max range, which scales with spellpower up to 7. We may reduce the range to a fixed lower value of, say, 5, and have noise scale down with spellpower instead. The latter aspect was in fact part of hellmonk’s original implementation of this spell. Thanks to him for that patch as well as other Discord regulars for discussing the idea.

Next we have a round of item removals; that’s right, the dreaded r-word! On the chopping block are: lamp of fire, sack of spiders, fan of gales, crystal ball of energy, and staff of power. See the links for kate’s brief description of why each item was removed. The crystal ball and staff of power removals won’t surprise many long time crawl players. The former is notoriously useless in most situations and the latter is an annoying swap with an effect duplicated by other equipment. As an aside, we’d like all magical staves to have a good melee effect; see below regarding staves of poison and Olgreb, and look out for similar changes (or removals!) in the future.

Regarding the other removed items, we want the set of evocables be relevant reasonably often, as distinct as possible, and not too numerous. The fan of gales was an escape item you’d use very infrequently, and this game already provides so many escape consumables, spells, abilities, and god powers. The lamp was a strong item, yet its design was underwhelming, as kate says. Its notorious targeter was awful to use in open spaces, and while it was very good in corridors, we already have an evocable that makes clouds and which is good in both open and closed areas. The sack was a very strong item, like all summoning consumables, but the summons it created aren’t memorable, at least not until getting ghost moths at high evocations. We have a bunch of other consumable items that create interesting summons and that everyone has to carry around as things are. The sack’s net effect might show up on some future item or ability, but not attached to summons.

These removals make the remaining evocables feel more distinct, free up a lot of item slots, and reduce the cognitive load in a game with such a large number of items. Speaking of loadstones, if you’ve been using the new tin of tremorstones and found it underwhelming, have no fear. We’ll be taking a look at these and seeing how they can be improved before release. Now, for the rest of the changes:

  • Phial of floods now applies a silencing “waterlogged” debuff to all monsters in the flooded area and no longer summons water elementals. So you can still get those cool silencing debuff on monsters, just without so much accompanying summoning cheese.
  • D:1 level spawns can no longer generate within LOS distance of the player’s starting position. A surprising nerf to tiny arrival vaults, to be sure, but a welcome one.
  • Potions of Brilliance now only provide a stronger universal spell enhancer and remove spell hunger. They no longer provide an Int bonus nor wizardry.
  • Staves of poison now do resistable poison damage on hit like other staves instead of just having a chance to poison.
  • The Staff of Olgreb now has a chance to deal poison-arrow flavored damage on hit, based on evocations skill. It no longer has an additional chance to cast Venom Bolt on top of casting OTR when evoked. Once again, I await kills from the Gauntlet minotaur wielding this.
  • Potions of Might no longer provide a bonus to strength. Don’t worry, the 1d10 bonus damage remains, and that’s the really good part.
  • The Dragonskin Cloak now provides rCorr instead of sticky flame resistance. Waiting for the complaints to roll in from the die-hard rSticky fans.
  • The -Tele property no longer appears on artefact weapons and jewellery. Sorry, no more cheesing those Zot traps with your -Tele stick!
  • Ziggurats now have a level set featuring many player ghosts. Zig ghosts are back! Accompanying them are a variety of undead assistants. This set replaces the “draining” monster set, since that idea is well covered by this new set and the existing ones.
  • Frozen Ramparts has its radius of effect reduced to 2 and its damage was slightly reduced. Even with the removal of the monster slow movement debuff, I found this spell to be too strong, doing lots of damage over huge areas in many situations. With these nerfs, Ramparts feels like it has damage more appropriate to a level 3 spell.
  • Many arrival vaults have been reworked to allow better player tactics. After all, tactics are important, or so the wiki guides say.
  • All Evocable items can no longer be used by the player while confused. Target fuzzing, be gone!
  • Trog now hates use of all magical staves and pain weapons. On the upside, Troglodytes won’t get offered these by scrolls of acquirement!
  • Nemelex abilities can no longer be used while silenced. This was a loophole from when decks used to be items. Remember those long gone days?
  • Call Imp no longer bases the type of imp summoned on spellpower. Don’t worry, this spell is still really good, crimson imps included!
  • The WebTiles server has seen a major overhaul and now supports python 3 as well as Tornado 5+. Thanks to advil, aidanh, and chequers for all their work on this development and testing. More WebTiles updates will be rolled out after testing, with work to come from aidanh on making it easier for us to upgrade server chroots. That way we can have a modern development toolchain on every server.

Play-testing trunk is always appreciated, especially as the release gets closer. Please report any bugs you find on mantis or on the github issues page. I myself had great fun ascending a merfolk ice elementalist to experience all the changes to ice magic; looking forward to trying a fire elementalist or venom mage next. Look out for more trunk changes and likely another Trunk Updates before next release. So until next time, Happy Crawling!

Trunk Updates – 21 February 2020

You quaff a potion. It was a potion of stabbing. You feel ready to backstab. You open the trunk update like a pillowcase!

Greetings fellow crawlers. The 0.25 development cycle has proved to be a busy one, so we’re back with another Trunk Update. Many of us usual suspects have been hard at work bringing you some new toys to play with. I’m also happy to note that PleasingFungus has recently returned to drop some new crawl creations of his own. How he managed to escape from the dreaded Tower of Lemuel, we’ll never know!

Now, on with the update:

  • Frozen Ramparts, a new L3 Ice spell that makes all walls within radius 3 become covered in icicles that release when a monster walks nearby. The icicles do light damage that checks AC but is only partly resistable. Affected monsters additionally receive a “frozen” debuff that slows their movement by 4 aut for a few turns. Available now for any Ice Elementalist in their starting book!
  • Tin of Tremorstones, a new multi-use evocable. When used, it creates two radius 2 explosions at range 3 that are triple-affected by AC (like LRD), but the explosions are randomly skewed and may hit the user. Most useful for players with good armour. It has a 33% chance to fall apart with each use. It’s a tin of angry earth elementals waiting to explode!
  • New Potion of Stabbing that gives a 50% chance to upgrade weak stabs (e.g.distracted monsters) to strong ones (e.g. sleeping monsters). I wonder what this potion would taste like?
  • New unrand: Cigotuvi’s Embrace, a +4 leather armour with rN+, rRot and *Drain that automatically gathers corpses to increase AC. The AC decays slowly over time but decays more quickly as more corpses are added. That’s right, the former Cigotuvi’s Embrace spell has returned, but as an unrand!
  • Ledas’ Liquefaction gets a boost: the player is now immune to the effects of liquefied ground made by casting it. With this spell, we can all pretend to be a centaur.
  • Scrolls of Magic Mapping now reveal any floor traps on the level. Now you can feel the pain of finding of a double-zot-trapped Hall of Zot:5 right after you enter the level!
  • The vorpal weapon ego no longer has distinct adjectives for each weapon class. Now all such weapons are described as ‘vorpal’. Vorpality is the new reality.
  • Shields have gotten a reskin. Ordinary shields are renamed to kite shields and large shields have been renamed to tower shields. Sword-and-tower sounds cooler than sword-and-board, in my humble opinion.
  • Confusing Touch is now level 3 and checks MR instead of monster HD. Additionally, the Confuse spell has been removed. Now there’s exactly one “confuse exactly one thing” spell and it’s not so overpowered.
  • Boots of the Assassin are now called the hood of the Assassin and use the headgear slot. Imagine wearing this while quaffing a potion of stabbing and standing next to a distracted Rupert. Nothing personnel, kid.
  • The demon blade Leech gains *Rage/+Rage and loses its AC-3 and EV-3 properties. Bloodbane has been removed, having been merged into Leech.
  • Warlock’s Mirror can now reflect piercing ranged weapons. Is there anything this little gadget can’t do?!
  • God conducts for harming allies now apply to spells and items that place harmful clouds. But don’t worry, demonspawn, your ignite blood mutation won’t anger Oka.
  • The Staff of Olgreb now grants poison immunity to monsters wielding it. The gauntlet minotaur can’t wait to try this out when he next finds Olgreb in his loot pile.
  • Potions of Agility have been removed. Among the less interesting of the many buff potions that fill our inventories, agility potions have been replaced with the more specialized potions of stabbing.
  • Monsters such as spiders can no longer cling. Rest in peace, a myriad of clinging code bugs.

Some of the above items will continue to receive balance adjustments and tweaks over coming weeks. And we’re not done adding new stuff for 0.25, so stay tuned. Until next time, Happy Crawling!

Community Competitions

Hello crawlers!

We occasionally get asked about opportunities for competitive crawling outside of the official release tournaments. Several community members have organized a variety of competitions, and this post aims to point them out.

The Tavern Dart Board

The Dart Board on our official forums is a clearinghouse for community organized competitions as well as discussion of all things competitive crawl. It’s a good first place to go when looking for ongoing competitions and challenges.

The Crawl Cosplay Challenge

Run by kitchen_ace, these challenges give character conducts inspired by crawls many uniques. From the CCC website, “The goal is not to emulate the unique’s behaviour exactly, but to get a good starting point on playing games with interesting requirements. Challenges [...] are suitable for players of all skill levels — the Challenge is about personal achievement rather than competition.” Check them out! The current set (Set 10) is ending, but a new one will begin soon.

Crawl Sudden Death Challenges

Organized in an officially unofficial way by me, based on the popular series originally organized by WalkerBoh, he idea is for players to compete by trying to do as well as possible in a game of Crawl with one attempt only; if you die, that challenge is over. More information and sign-ups can be found on the CSDC website.

DCSS Secret Santa Tournament

Organized by CPO admin chequers (who also offers a weekly challenge seeded run on CPO), this festive adventure comes once a year. Keep an eye out next year when the temperatures start to rise and summer gets into full swing.

Trunk Updates 6 January 2020

Hello crawlers, and welcome to the first batch of trunk updates of 2020. The teams’ celebrations raised quite a bit of Pandemonium, but in the fray several trunk changes appeared. Here’s the latest!

  • A new swamp worm tunnel vault offering a transporter puzzle for your death enjoyment
  • A new Fedhas vs Yredelemnul themed swamp rune vault with a cameo by an undead Lernean Hydra
  • On the back-end we’ve added catch2 testing to the build process
  • Foxfire no longer damage the player when swapping, just dissipate
  • A new abyss-escape themed ghost vault
  • Regeneration has regenerated for the last time, and is removed. Agony replaces it in the book of Necromancy, and Ozocubu’s Armour in the Book of Battle
  • A new unique Maggie enters the dungeon. Maggie is a younger version of Margery, and is a test of reaverb’s new multiple-unique-encounter storytelling approach. Maggie knows Bolt of Fire and Mesmerise, and comes equipped with a light dragon skin and a good weapon. Margery’s dragon armour is upgraded. Both Maggie and Margery have a chance of carrying Wyrmbane, which comes already slightly leveled up!
  • dtsund can send us an “I told you so!”. Scrolls of acquirement now offer a choice of 4-5 items: food (if you eat), gold, and three random choices from the old acquirement categories. These items are fully identified, and you can inspect them before making your choice.
  • However, the miscellaneous category of acquirement has been removed, so you won’t be seeing evocables on the list ever again!

That’s all for now! On the horizon, there are rumors of an upcoming crawl sudden death challenges “soon”, more magic changes, and who knows what manner of twisted sinister changes from the mind of Xom. Happy crawling!

Trunk Updates 10 December 2019 Part II: Magic Changes

Hello crawlers. This is Part II of the trunk updates, you can read Part I here. This post will start with a quick summary of the changes to magic that have landed in trunk, followed by a bit of a discussion of the process that led to them.

The magic changes were aimed at three goals: better differentiate among the magic schools, increase positional considerations in using spells (better differentiation from ranged attacks), and better UI. The changes are in trunk now but will continue to evolve over the 0.25 development cycle as more play testing feedback comes in.

So without further ado, here are the changes (and the spell schools themes).

  • Fire spells are centered around semi-controlled explosions and setting things on fire.
    • A new spell Foxfire (L1 Conjurations/Fire) conjures two foxfire projectiles that home in on the nearest target and burn them. Foxfire replaces Flame Tongue, which is removed.
    • Conjure Flame now creates a cloud of embers at the caster’s position. They ignite into flame if, after the player’s next action, nothing is in the embers cell; or if the player casts the spell a second time.
    • Inner Flame creates a flame cloud under the affected monster whenever they take damage in addition to the explosion on death.
    • A new spell Starburst (L6 Conjurations/Fire) fires a range 5 bolt of fire in each of the principal directions. Starburst replaces Bolt of Fire, which is removed.
    • Throw Flame is removed.
    • Firestorm, Ignition, and Starburst now burn trees, and all squares of a Fireball burn trees as well.
  • Air is bouncy, pointy, and often hard to direct.
    • Airstrike damage now scales with the number of unoccupied cells adjacent to the target.
  • Earth is directed and single target.
    • Borgnjor’s Vile Clutch is now a range 6 beam of hands, instead of a smite-targeted 3×3 explosion.
  • Ice is diffuse and subtle.
    • A new spell Hailstorm (L4 Conjurations/Ice) creates a ring of damaging hail at distance 2 and 3 from the caster. This damage is partly physical but icy monsters are immune. Hailstorm replaces Throw Icicle which is removed.
    • Ozocubu’s Refrigeration is buffed to do more damage and not damage the caster.
    • Throw Frost and Bolt of Cold are removed.
    • Ice Elementalists no longer start with conjurations skill, the extra skill being put into Ice Magic instead.
  • Conjurations are pure magic which have good accuracy in some way.
    • Iskenderun’s Mystic Blast is now Conjurations/Translocations and makes a range 2 explosion around the caster that damages and pushes back monsters, potentially causing damaging collisions.
    • Dazzling Flash (L3 Conjurations/Hexes) replaces Dazzling Spray. The flash is a range 2-3 silent explosion with a chance of blinding monsters (it does no damage).
    • Searing Ray now follows the chosen target; the rays all penetrate, are fired to full range, and have the same damage and to-hit.
    • Spellforged Servitor only receives one player spell, the highest level servitor-compatible spell the player has. The spell description indicates which spell the servitor will cast.
    • Force Lance is removed.
  • Poison is an alchemical discipline, focused on poison and other alchemy.
    • Sting is now a range 3 Poison/Transmutations spell that is only partially resistible.
    • New spell Eringya’s Noxious Bog (L6 Poison/Transmutations) grants the caster a temporary “Bog” status, which causes them to transform terrain behind them into toxic bog. Toxic bogs impose the penalties of shallow water and do partially resistible poison damage of the same flavor as sting to monsters and players in them.
    • Venom Bolt and Poison Arrow are removed.
    • Ignite Poison is added to The Young Poisoner’s Handbook
    • Venom Mages now start with Transmutations skill instead of Conjurations.
  • Necromancy has begun transitioning into more of a melee-support school (either the caster’s or their undead minion’s melee).
    • Agony and Dispel Undead are now range 1.
    • Bolt of Draining is removed.
    • Corpse Rot creates miasma in a ring around the player (using one corpse in LOS per cloud).

A bit about the development of these changes 

Just reading the change summaries blog might not give a clear impression of where and how crawl changes come about. For the curious, here’s the story behind these magic changes.

The desire to differentiate crawl magic schools from one another and from ranged has been around for a very long time. About a year ago, based on some player conversations, I started a brainstorm thread on Tavern with the goal of generating some specific ideas for approaching these goals. After some time letting the results of the brainstorm simmer over the summer, in late September I wrote an initial design doc (which has since been revised and now isn’t exactly up to date with the final implementation) and shared it with the same Tavern thread as well as the devteam for initial feedback and shaping. After iterating on the raw design implementation started in October, continuing through mid-November. Early during the implementation phase several more dedicated players compiled early drafts and gave initial feedback, as well as the usual input from the rest of the devteam.

By mid-November the branch was mostly stable in its initial implementation, and I moved into the next phase. chequers (CPO admin) and floraline (CKO admin) were kind enough to set up online versions of the experimental build; sdynet (community contributor) distributed a playable executable in the Korean rogue likes community and translated feedback. I also created play testing posts on Tavern and the DCSS subreddit. Over the next three weeks the changes were tweaked, adjusted, and occasionally significantly changed as a result of this testing, shaping them up to the version that arrived in trunk on December 1st. As long time players are well aware, arriving in trunk is not the same as “finished for all time”, so these new and revised spells will continue to evolve.

With this brief history written, I want to extend my thanks to the members of the community who gave input and helped out. Making large changes to crawl is a tricky business and a team effort always comes out better. I am of course grateful to my fellow devteam members for their input (especially advil, gammafunk, ontoclasm, and CanOfWorms who made part of the changes). I also want to thank:

  • sdynet for collecting and translating feedback from the Korean community
  • chequers and floraline for hosting experimental branches
  • hellmonk, tealizard, Doesnt, EN0N, Bacchus, minmay, kitchen_ace, and members of the Korean community (sdynet did not include usernames in their summary) for specific ideas to improve the branch.

Trunk Updates 10 December 2019 Part I

Hello crawlers. It’s been a busy week in Dis:7 with many demons hard at work studying the ancient runes and bringing forth new crawl changes. Before we get to the changes, CPO admin chequers is on a mission from Santaeus to bring you some crawl Christmas cheer, hosting the second annual crawl Secret Santa tournament. A big portion of the changes are a new take on attack magic, which will be described in its own post. As for the rest of what’s been happening, read on!

  • Chaos branded weapons now can cause might or agility effects, no longer cause spell miscast effects, and the clone effect now creates either hostile, friendly, or neutral clones.
  • The Elemental staff is now a spell enhancer for all elemental schools. It counts for each elemental school separately, so spells that use more than one element get doubly enhanced by it.
  • Elyvilon’s Divine Protection from death becomes guaranteed at ***** piety, instead of the previous unrevealed piety value between ***** and ****** piety.
  • Trog no longer gifts ammo or launchers, and (aside from unrandart gifts) only gifts melee weapons either with no brand and a higher enchant or one of these three brands: vorpal, flaming, or antimagic.
  • Crawl Lua gains the ability to interface with the targeter system; for you advanced Lua scripters.
  • Renouncing your religion can now be done while silenced
  • Monster wands and quivers are displayed in ^x and xv, and there are better warnings for quivers, wands, and dangerous brands held by dual-wielding monsters when multiple monsters come in to view.
  • Poison level indicators have been added to tiles, and corresponding descriptions to console.

To read about magic changes, click through to the next post. Until next time, happy crawling!


Comments Off

Trunk Updates 1 December 2019

Hello Crawlers, and welcome to a new batch of trunk updates. This sometimes-regular blog feature has seen the dark of Kikubaaqudgha and risen from the grave. There’s no telling whether or not it will survive the whole 0.25 development cycle. But while it’s here lets get the latest from Tar:7.

  • Various bug fixes from the 0.24 tournament. The 0.24.1 bug fix release is coming soon.
  • Monster clinging has finally lost its grip and is now removed
  • Boris will now pursue you on the orb run
  • While hostile guardian golems were great ways to make the game harder, summons now dismiss when attacked instead of becoming hostile. The exception is Greater Demons, who are none to pleased to be bothered with your mortal issues.
  • Local tiles gains monster threat level indicators which can also be enabled in WebTiles with the tile_show_threat_levels option.
  • Fedhas now protects your plants from collision damage.
  • On the back end,
    • aidanh’s long running ui overhaul has made significant strides
    • Monster pathing code has received some optimizations, which should reduce lag when stepped from time. (Cheibriados regrets the need for haste).
  • Carrying corpses has been removed again.

Looking to the future, my positional attack magic experiment has grown and twisted. It’s just been merged, details will appear in the next trunk updates post!

0.24 Tournament Results

The 0.24 tournament is over. On behalf of the Dev Team, many thanks to all the server admins, outside contributors, bug reporters, and to the many DCSS players who made the 0.24 release and tournament possible! For 16 days, players could compete for tournament points and banners by playing 0.24 games on the public servers. First let’s give a few highlights from the player and clan results. For comprehensive results with first through third place winners in all categories, please see the tournament overview page.

The winning player was Yermak, with 8149 points. Yermak won 50 games during the tournament, including a streak of 22 wins, and won 18 tier-three banners. In second place was JiyvaJigglypuff, with 7979 points and 36 wins, including a streak of 18 wins and 19 tier-three banners. In third place was cosmonaut, with 7717 points, a streak of 24 wins (!), and 14 tier-three banners. MeekVeins was the only player to win all 24 tier-three tournament banners.

The fastest win by turncount was achieved by JiyvaJigglypuff (10299 turns with a DDFi of Makhleb). p0werm0de had the highest scoring game of the tournament, a 15 rune VSWr of Chei won in 28978 turns for 50M points. Caminho had the lowest level win with an XL 14 MiFi of Okawaru. The first victory of the tournament was claimed by p0werm0de, winning a DDFi of Makhleb in just 43 minutes (52 minutes after tournament start). The first 15 rune win of the tournament was by Mintice, winning a MiBe of The Shining One in 1h 47m (2h 11m after tournament start).

The clan competition was won by Grow Some Ballistomycetes (26661 points), followed by Gozag or Go Home (26172 points), and XTAHUA RAWR (22185 points). There were 143 clans in all with points scored in the tournament.

Here are some basic statistics on the players in this tournament compared with the 0.23 tournament (in parentheses):

  • Players: 2880 (0.23: 3100)
  • Total player time: 35422 hrs (0.23: 36643 hrs)
  • Avg player time:  12.3 hrs (0.23: 11.8 hrs)
  • Games played: 63048 (0.23: 65857)
  • People who got a rune: 1046 (0.23: 1046)
  • 540 winners and 1930 wins (0.23: 531 winners and 1770 wins)
  • Winrate: 3.06% (0.23: 2.69%)
  • Proportion of players using WebTiles: 95.5% (0.23: 95.4%)

Looks like winrate keeps on slowly creeping up, so we’ll have to bring on more nerfs (mostly kidding). After a relatively slow development cycle, it was neat to see this release come together towards the end as some large changes landed. I had great fun working on the Sif and Fedhas redesigns, myself. The next 0.25 release looks like it will be a big one. I’m particularly excited to see where ebering’s positional attack magic project goes in 0.25. It’s playable now as an experimental branch on CKO! Stay tuned for future posts about this and other things we’ll be adding in the next version.

Thanks to everyone who participated in the 0.24 tournament! Note that we are still interested in a tournament format revamp, and will hopefully make that more of a priority for 0.25 after we nail down some of the CAO score page issues. We’ll put up a wiki page and everything, I swear! But if Xom just replaces it with a recipe for rock worm and boulder beetle soup, well that’s on Xom! Until next time, fellow Ziggurat Zaggers, happy crawling!

0.24 “Plants vs. Vampires”

We are pleased to announce the release of Dungeon Crawl: Stone Soup 0.24 “Plants vs. Vampires”!

DCSS 0.24 features an overhaul of gods Fedhas and Sif Muna, a new and improved version of Vampires, and a streamlined throwing system, not to mention UI improvements, many smaller changes, and all sorts of bugfixes. For players interested in seeding, you’ll be pleased to hear that stable seeding no longer requires full generation of the dungeon in advance, hopefully paving the way to seeded games online. For a full list of significant changes, please see the changelog for the 0.24 branch.

Download DCSS 0.24 here, or play it online on one of many servers across the world! Packages for Windows, OS X, and Linux are all available now. (Debs coming very soon.)

The tournament starts tomorrow, 20:00 UTC Friday 25 October with all online 0.24 games counting towards your score. See the tournament page for more details, including how to join or set-up a clan. Clan membership changes remain open until 20:00 UTC Friday 1 November.

Many thanks to all those who have contributed to DCSS over the years. A special thanks to the following community members who contributed to DCSS 0.24 and a warm welcome to the first-time contributors, listed in italics. (Let us know if someone is missing, this data is tricky to collect in bulk!)

G. Bailey, Josh Braden, achuah, argonaut, CollinJ, cut1less, Doesnt, dplusplus, Higor Eurípedes, Joshua Gelbard, Koen De Groote, Quinten Konyn, Nikolai Lavsky, Gabriel Marks, mgdelmonte, Byrel Mitchell, mwvdev, neofelis, NormalPerson7, Michael Nowack, Andrew O’Neill, s.panicho, Ashley Elizabeth Raine, Chris Rendle-Short, rmcneive, runrin, shelmazad, sdynet, Umer Shaikh, John Stilley, Sean VanMeter, Richard Wardin, wjchen

Happy Crawling!

P.S. by gammafunk. Sorry we couldn’t get that Trunk Update for 0.24! I’ll try to make it up to you all with a more detailed write-up of 0.24 changes in the style of a Trunk Update, along with some details about future directions for 0.25. Best of luck to you all in the tournament!

0.24 Release and tournament dates and CXC server info

Hello digital vampires! I’m referring, of course, to those among you who are undead, capable of turning into an adorable flying mammal, and who have had their blood states recently simplified. Trunk players probably know what I’m talking about, and soon, the rest of you will as well. We’ve been bad, greedy devs, binging on our source code and commits and template metaprogramming and querying the current scissors, but not giving you any Trunk Updates during the 0.24 cycle. I’ll try to make amends with a big Trunk Update post for all of 0.24 soon. It might take us a bit longer to write up those changes, so let’s get some important dates out there right now.

The 0.24 release will (tentatively) happen on Wednesday 23 October, and that the 0.24 tournament will (definitely) happen on 20:00 UTC Friday 25 October through 20:00 UTC Sunday 10 November. We’ll be getting a tournament page up and running very soon as this tournament date is only a week away! Watch out for a future post with the new tournament URL.

We’ve been in the feature freeze since 9 October, and the 0.24 stable branch is already available, soon to be hosted on servers. We’ll be making balance tweaks and bugfixes until release next Wednesday. Online players, please help us test the 0.24 beta by playing the 0.24 branch when that’s available or trunk until then.

Finally, let’s talk about a red dragon THAT TALKS LIKE THIS. As many of you know, the CXC server in France recently went offline after a recent server issue. Medar and Zkyp had graciously hosted CXC for many years, but no longer have time to do so. Thankfully, an admin who goes by Namanix has stepped up to host a new server using the current CXC domain. Namanix tells me that the replacement server is ready and the domain transfer should be complete by 8PM CET on 18 October. All data for logins, current and past games, morgues, ttyrecs, etc should eventually be transferred over to the new server, and games will be played at the same CXC Webtiles URL and SSH host as before. Once again, thanks to Medar and Zkyp for hosting CXC all those years, and thanks to Namanix for taking over the (dragon) reins.

See you all around the lava pit, tossing your blood potions into the fire!

0.23.2 and 0.22.2 bugfix releases

There’s a new bug fix release of the 0.23.2 stable version of DCSS. Source packages and binaries for Windows, OS X, and Linux are available now. We recommend all 0.23 users upgrade to this version. Major bug fixes and updates:

  • Various seed-related bugfixes and improvements:
    • Seed input now supports pasting, and is autofilled from the last game.
    • The seed input box now has an extra digit.
    • The game seed is saved correctly and will no longer show as 0 for games
      started after this fix.
    • Seed stability for floating point calculations: for most configuration the
      main dungeon should remain unchanged, but 32 bit systems (and 32-bit builds)
      should now be much more stable, among others. Slime will likely differ.
    • Seed stability for rc options: certain rc options affected the generation
      of some layouts, leading to divergent seeds.
  • AK starts will no longer crash when exiting the abyss in pregen games.
  • Gozag bribe branch in pregen games now works correctly when entering a
    previously unvisited level.
  • Meatsprint is now difficult again.

Aside from the major fixes listed above, there are scores of smaller bug fixes, vault tweaks, description updates, and the like, so be sure to upgrade! If you’d like to read more about the seeding project, see here.

In addition, there is a new bugfix release of the 0.22.2 previous stable version, that backports a number of fixes. If you are still playing 0.22, we recommend that upgrade, especially if you have a shared save folder with 0.23 versions (common on OS X) — this release will prevent a major incompatibility between the two versions.

Happy Crawling!

Comments Off

Behind the scenes on retrofitting DCSS’ seeding

What is seeding?

The 0.23 release introduced a major and ongoing overhaul in how DCSS approaches random seeding from the player’s perspective. If you’re not familiar with this idea from other games with random procedural generation like Minecraft, Spelunky and brogue, here’s how it’s supposed to work: if you enter a specific code (the “seed”) into the game when starting it, you’ll get a repeatable form of randomness that encompasses dungeon layout, items, and monsters. Any dungeon generated with that seed should be identical. This has many applications: from Spelunky or Brogue (and many others) you might be familiar with the concept of a daily, weekly, or monthly run. In these, all players enter the same seed and over some time interval explore the same dungeon. Here are a few ways crawl community has been experimenting with this since the release:

  • On the CPO server, run by chequers, there is an experimental weekly online challenge with a share dungeon.
  • Ultraviolent4 has started running an offline Game of the Month challenge. (Edit: The next challenge begins on Apr 7, per uv4.)

I’m excited to see what else develops. But what does it take for this to actually work? This post goes into the background on what has been involved in doing this retrofitting for DCSS, where it is at, and what the remaining problems are.

Randomness and procedural generation

Procedural level generation happens via constrained randomness. Some process repeatedly draws on a random number generator according to a fixed, predefined set of constraints and rules, making choices that (ideally) generate a coherent, explorable, locale. At the heart of this is a random number generator, which usually takes the form of a function that the programmer can repeatedly call, generating a sequence of numbers.

Now, “true randomness” is more of an ideal than anything that can be implemented, so RNGs are really only “pseudo-random”. What this means is that they aim to (in addition to matching some overall distribution) be unpredictable, which a viewer or adversary will perceive as random. Unpredictability can be defined in precise mathematical terms that I won’t go into here, but it doesn’t actually mean complicated: some of the best rng algorithms are remarkably simple. They basically all work by initializing the rng state with a “seed”, and repeatedly transforming that state, and the heart of the one we use, PCG, is just 5 lines of code. For cases where there is an adversary, you want this initial seed to itself be unpredictable, and so common strategies are to use some external state of the program (e.g. exact time, external devices) to do this initialization: then, if the adversary doesn’t know the initial state, and the algorithm is unpredictable in the right way, they’re out of luck.

Video games flip this idea on its head. For some kinds of RNGs, if you initialize the generator in the same way, multiple instances will generate the same sequence of numbers in the same order, while still behaving unpredictably and well-distributed as long as the seed is unknown. This means that if the rules and constraints that draw on the RNG are implemented correctly (we’ll come back to this), the behavior given that seed acts random but is completely replicable. You can think of the RNG as, given a seed, providing a “code book” of integers that acts random, but as long as you have the code book and the correct rules/constraints (giving you position in the list), you can decode the behavior of the game.

There are, then, two main ways to make this go wrong: mess up the initial conditions, or cause the rng to get out of sync. This latter case is when two processes are using the same sequence, but make decisions starting from different points in the sequence. Because of unpredicatability, their behavior will diverge extremely rapidly (more on this later). In general, if RNG behavior diverges at all, it tends to diverge thoroughly and quickly.

DCSS has long used the PCG RNG which (like the Mersenne Twister, xorshift, and many others) supports this reproducibility; retired dev bh added this in 2015, replacing a hand-rolled implementation of an algorithm from the 80s that was more predictable. However, using a good RNG algorithm is only one piece of the picture, and turns out to be probably the least complicated part of this project.

Why player-facing seeding was (and is) hard for DCSS

Crawl wasn’t remotely designed with seeding as a player-facing feature in mind; though many roguelikes have used specifiable seeds for testing, the mainstream use as a player feature seems to be quite recent. Actually, I couldn’t find out much of the history of using seeding for completely repeatable procedural generation as a player-oriented feature, but it doesn’t seem to have been very mainstream before games like Minecraft and Spelunky; an earlier example, pointed out to me by Roguelikes discord user esc, is Civ 3. Seed-based pseudo-randomness, internal to the game, is much older, and for example Moria allowed choosing a seed for testing purposes. But getting seeding to work as a player feature is a whole different project.

Here are four challenges that DCSS faced (and still faces) when trying to get player-facing seeding to work well:

  1. Mixing of gameplay / levelgen RNG
  2. Arbitrary interactions in level generation between levels.
  3. Extremely complex level generation with a huge diversity of procedural generation techniques, implemented in a mix of C++ and Lua code.
  4. Diversity of build targets and settings: support for windows, mac, linux, with 32 or 64 bit builds. Builds on non-x86 architectures such as ARM.

When starting the project, I was aware of factors 3-4, but thought 1-2 would be the biggest challenges, and so it was there that I began. In retrospect, 4 is actually the biggest problem.

Before 0.23, generating a level and entering a level were completely intertwined: levels were not generated until you entered them. “Greedy” level generation goes back to Linley’s Dungeon Crawl as far as I’m aware, and on its own terms is a fairly simple and clean approach, spreading the CPU cost of level generation across the game in a way that hides it from the player. However, it can lead to a problem illustrated by the following toy example: suppose that you have a separate RNG for each level, the player is on level 2, and for both levels 3 and 4 Sigmund is poised to generate given the RNG state. If the player takes stairs to level 3, then he’ll generate there; if the player takes a shaft to level 4, then he’ll generate there. Since Sigmund is a unique monster, he cannot then regenerate if the player enters levels 4 and 3 respectively, and so the RNG diverges right away — the builder may place another unique, or do something different altogether, and after that initial decision will tend to be completely different.

Not only that, this first assumption wasn’t made: DCSS before 0.23 used a single RNG for gameplay and levelgen decisions, so any different action the player took might lead to completely different level generation.

Part 1: pregeneration and RNG separation

This problem has long been known, and comes up regularly in discussions of seeding. I adopted two solutions from these discussions: separate out levelgen RNG from gameplay, and allow pregeneration of the dungeon. The latter solves almost all of problems 1-2 on its own, and had several past implementations by community members. The most developed of these was due to tavern user bel in the above linked thread, and just needed some adjustments so that level generation was better separated from level entry. The initial seeding patch can be seen here.

Incidentally, if you’re designing a game from scratch, your life is going to be easier if you take a different strategy for these sorts of non-independent decisions. For example, you could place uniques independently of levelgen (something we do now only for one unique, Boris, who respawns), perhaps deciding where they go at the beginning of the game. However, it’s probably too late for DCSS in this respect.

Part 2: testing and fixing many, many seed stability bugs

This patch, it turns out, was only the beginning, opening things up to a whole world of ways in which a repeatable RNG can get out of sync based on problems 3-4.

To start with, I wrote a lua test that, given a seed, prints the vault list for that seed, re-runs generation, and compares the result. While true seed stability bugs on a single device have been fairly rare, this second part helped identify a tremendous amount of global state that can matter for seeding, scattered all over crawlcode. You can see an example of the output here if you scroll down to “Running test #31: ‘vault_catalog.lua’.”

The real challenge has been seed stability across devices. Here is a sampling of problems that have come up:

  • If you’re drawing randomly from a list, and something permutes the underlying list, it doesn’t matter if your rng draw is the same! For example, if the OS provides a directory listing in a different order.
  • If the order of some calls isn’t determined by the language/library standard, then it will probably be implementation dependent. This is a problem that has come up again and again:
    • C++ (and C) doesn’t define the order of multiple function calls that make up an arithmetic expression, and in practice their order varies. You might think this would go by order of operations, but this would be wrong. They all have to be explicitly sequenced.
    • Lua iteration order, both through the C interface, and via the “pairs” function, is not guaranteed to be stable.
    • Anything in C++ that sorts may have implementation-specific behavior if a comparison operation indicates two objects are equal. This is fine if your comparison operation is fine-grained enough, but sometimes it wasn’t.
  • A large set of bugs that were introduced with the initial pregeneration patch because the level builder (and related code) assumed the player was about to enter the level; something that could be designed around from scratch but was fairly baked into dcss as it stood.
  • DCSS caches parsed maps, and some cases of randomness in the cache were causing divergence.
  • Cases where the builder made use of player state: the most prominent of these were vaults that generated items using the acquirement code. (This still can happen in troves, but only there.)
  • Floating point issues. First, Lua 5.1 uses different Number to int conversion techniques on different build targets, and these have different truncation behavior. Then, even controlling for this it turns out that e.g. SSE2 behavior for non-exactly-represented integers can lead to different ints than x87, for example, (1 / 100 * .7). I doubt all of these have been found yet, and for the 0.23.2 release I still needed to manually force the windows build to not use x87. I’m looking at you layout_delve…
  • Cases where unexpected code was drawn upon by the builder. For example, levelgen tries to ensure connectivity, and it turned out the code that does this was being affected by certain rc options! Another example is that slime connectivity in particular uses a different algorithm (because of the wall damage) that led to an underspecification bug mentioned above.

In effectively all of these examples, the result of the bug was immediate loss of seed synchronization across devices — and many of these were things that wouldn’t be considered bugs at all without the goal of seed stability. Debugging them was uniformly extremely difficult, because it required both replicating the divergence and then finding the exact point of RNG divergence. Without VMs and docker, I would not have been able to do most of this.

Some of these problems can be programmed defensively against, with experience, but I doubt I’ve found all the seed stability bugs in crawlcode. At this point, I’m mostly reliant on people testing seeds on various platforms — Ultraviolent4′s seeded Game of The Month series has so far been invaluable for finding seed/pregen bugs. (Incidentally, the challenge of localizing seed bugs, together with the challenges of developing for seed stability, are why I would strongly recommend fellow roguelike devs against using seed-based save formats…)

Part 3: next steps

There are still many improvements to be made, and I expect a lot of my effort for 0.24 will go towards finding and quashing more seed stability bugs. Here are a few improvements I hope to include in the next version:

  • Incremental pregeneration: generate the dungeon in a predetermined order, but only do as much as you need to do to play catchup on level changes. This will allow hopefully removing the distinction between pregenerated and non-pregenerated games, along with allowing seeded play online. (Right now, the main barrier is that up-front level generation is very hard on a server’s cpu.)
  • More RNG improvements for repeatability: apply various techniques to make rng de-synchronization less impactful. Remove floating point code as much as possible, and improve some of the lua numeric issues further.
  • Non-numeric (readable) seeds, a la cogmind.
  • A seed catalog of some kind.
  • What seed-related features would you like to see?

The DCSS community has been extremely helpful in finding and reporting bugs, and I doubt we are done. Please go play one of the seeding based challenges, and let us know if you find problems!

0.23.1 Bugfix Release

There’s a new bug fix release of the 0.23.1 stable version of DCSS. Source packages and binaries for Windows, OS X, and Linux are available now. We recommend all 0.23 users upgrade to this version. Major bug fixes and updates:

  • Vampiric attacks by the player against allies created from Sticks to Snakes and the Ratskin Cloak no longer restore HP or give vampires satiation.
  • Damage from Ozocubu’s Refrigeration has been increased to the correct amount.
  • Placement for the uniques Aizul, Bai Suzhen, Donald, Jorgrun, and Mara has been fixed so they can place throughout their intended level ranges.
  • The chance of Boris to respawn has been lowered to match previous rates.
  • Yellow draconians now correctly receive their rCorr mutation at XL 7.
  • 45 bugfixes, adjustments, and cleanups in total.

You may have noticed during the tournament that certain uniques were a bit hard to find. Sif Muna intones: ”And with gammafunk’s fateful decision to wrap unique placement statements to an aesthetically pleasing 80 character limit, thus triggering a hitherto unknown vault definition bug, the fates of countless adventurers were altered forever…” Oops! We fixed that, so the uniques listed above should show up more often now. You may also have noticed that old Boris had a bit more life in him than he used to. Due to changing his method of placement to better support the new seeded play mode, Boris was respawning roughly twice as often as he did in previous versions. Congrats to the player Volrath on setting a new record for the number of Boris kills in one game, 10 times! This has also been fixed, so Boris should return to haunt you about as often as he did in 0.22.

Aside from the major fixes listed above, there are scores of smaller bug fixes, vault tweaks, description updates, and the like, so be sure to upgrade!

Happy Crawling!

0.23 Winter Tournament Results

The 0.23 Winter tournament is over. On behalf of the Dev Team, many thanks to all the server admins, outside contributors, bug reporters, and to the many DCSS players who made the 0.23 release and tournament possible! For 16 days, players could compete for tournament points and banners by playing 0.23 games on the public servers. First let’s give  a short summary of player and clan results. To see first through third place winners in all categories, please see the tournament overview page.

The winning player was Yermak, with 8721 points. Yermak won 35 games during the tournament, including the longest streak at 22 games, and won 21 tier-three banners. In second place was MrMan, with 8092 points and 31 wins, including the second-longest streak for 20 wins and 17 tier-three banners. In third place was JiyvaJigglypuff, with 6631 points and 36 wins and 16 tier-three banners. The players ethniccake and watermold were the only ones to win all 24 tier-three tournament banners.

The fastest win by turncount was achieved by Yermak (13586 turns with a DDFi of Makhleb). Yermak also had the highest scoring game of the tournament, a 15 rune GnEE of Chei won in 19994 turns for 71M points. p0werm0de had the fastest realtime win in 25 minutes with a DDFi of Uskayaw, and Yermak had the lowest level win with an XL 15 FeEn of Ashenzari. The first victory of the tournament was claimed by JiyvaJigglypuff, winning a MiFi of Makhleb in just 33 minutes (38 minutes after tournament start). The first 15 rune win of the tournament was by YTcomUltraviolent4, winning a GrGl of The Shining One in 2h 29m (2h 31m after tournament start).

The clan competition was won by Tab and Dab (26578 points), followed by Gozag or Go Home (22637 points), and Big Dispersal (19276 points). There were 126 clans in all with points scored in the tournament.

Here are some basic statistics on the players in this tournament compared with the 0.22 Summer and 0.21 Winter tournaments (in parentheses):

  • Players: 3440 (0.22: 3130, 0.21: 3153)
  • Total player time: 38876 hrs (0.22: 41988 hrs, 0.21: 41283)
  • Avg player time:  11.3 hrs (0.22: 13.41 hrs, 0.21: 13.09)
  • Proportion of players using WebTiles: 95.88% (0.22: 95.39%, 0.21: 94.48%)

It’s nice to see that this tournament had the most players of any we’ve run so far. It looks like the winrate decreased from the high of 2.82% in version 0.22 down to 2.46%, which is similar to version 0.21. We buff players by locking up ghosts, then we nerf players by giving them new traps and Klown pies to the face. Yet you all keep coming back for more! It must be the shiny loot…

We had a lot of fun bringing the 0.23 release together, with multiple devs individually putting in hundreds of commits. We also had lots of great outside contributions ranging from vaults to artwork to bugfixes, including some important feature implementations. Thanks to all those taking the time to contribute to the project! A 0.23.1 bugfix release is imminent, so be on the lookout and be sure to update if you’re playing offline.

In the meantime, we on the Dev Team are excited to start work on the next version. Thanks again, everyone, and happy crawling!

Comments Off