You can subscribe to this list here.
| 2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(15) |
Sep
(131) |
Oct
(149) |
Nov
(216) |
Dec
(222) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(152) |
Feb
(58) |
Mar
(184) |
Apr
(249) |
May
(96) |
Jun
(207) |
Jul
(248) |
Aug
(87) |
Sep
(232) |
Oct
(440) |
Nov
(248) |
Dec
(212) |
| 2008 |
Jan
(216) |
Feb
(118) |
Mar
(508) |
Apr
(796) |
May
(597) |
Jun
(896) |
Jul
(475) |
Aug
(124) |
Sep
(200) |
Oct
(248) |
Nov
(377) |
Dec
(373) |
| 2009 |
Jan
(807) |
Feb
(430) |
Mar
(276) |
Apr
(138) |
May
(161) |
Jun
(210) |
Jul
(390) |
Aug
(141) |
Sep
(286) |
Oct
(826) |
Nov
(1123) |
Dec
(419) |
| 2010 |
Jan
(671) |
Feb
(625) |
Mar
(328) |
Apr
(349) |
May
(296) |
Jun
(485) |
Jul
(396) |
Aug
(113) |
Sep
(582) |
Oct
(414) |
Nov
(248) |
Dec
(377) |
| 2011 |
Jan
(400) |
Feb
(225) |
Mar
(321) |
Apr
(264) |
May
(148) |
Jun
(249) |
Jul
(270) |
Aug
(217) |
Sep
(262) |
Oct
(356) |
Nov
(426) |
Dec
(359) |
| 2012 |
Jan
(203) |
Feb
(131) |
Mar
(317) |
Apr
(313) |
May
(170) |
Jun
(272) |
Jul
(363) |
Aug
(364) |
Sep
(330) |
Oct
(188) |
Nov
(178) |
Dec
(141) |
| 2013 |
Jan
(177) |
Feb
(258) |
Mar
(459) |
Apr
(352) |
May
(443) |
Jun
(364) |
Jul
(185) |
Aug
(175) |
Sep
(242) |
Oct
(237) |
Nov
(359) |
Dec
(300) |
| 2014 |
Jan
(331) |
Feb
(272) |
Mar
(446) |
Apr
(301) |
May
(577) |
Jun
(435) |
Jul
(365) |
Aug
(358) |
Sep
(306) |
Oct
(617) |
Nov
(863) |
Dec
(466) |
| 2015 |
Jan
(295) |
Feb
(165) |
Mar
(319) |
Apr
(201) |
May
(158) |
Jun
(148) |
Jul
(62) |
Aug
(91) |
Sep
(147) |
Oct
(203) |
Nov
(346) |
Dec
(382) |
| 2016 |
Jan
(242) |
Feb
(280) |
Mar
(229) |
Apr
(157) |
May
(297) |
Jun
(335) |
Jul
(157) |
Aug
(219) |
Sep
(307) |
Oct
(212) |
Nov
(177) |
Dec
(112) |
| 2017 |
Jan
(100) |
Feb
(203) |
Mar
(112) |
Apr
(124) |
May
(81) |
Jun
(43) |
Jul
(39) |
Aug
(49) |
Sep
(24) |
Oct
(55) |
Nov
(68) |
Dec
(95) |
| 2018 |
Jan
(130) |
Feb
(73) |
Mar
(47) |
Apr
(57) |
May
(62) |
Jun
(76) |
Jul
(159) |
Aug
(158) |
Sep
(81) |
Oct
(100) |
Nov
(62) |
Dec
(75) |
| 2019 |
Jan
(130) |
Feb
(138) |
Mar
(80) |
Apr
(61) |
May
(88) |
Jun
(65) |
Jul
(61) |
Aug
(37) |
Sep
(85) |
Oct
(155) |
Nov
(133) |
Dec
(91) |
| 2020 |
Jan
(59) |
Feb
(123) |
Mar
(121) |
Apr
(155) |
May
(300) |
Jun
(136) |
Jul
(330) |
Aug
(84) |
Sep
(56) |
Oct
(87) |
Nov
(154) |
Dec
(200) |
| 2021 |
Jan
(205) |
Feb
(203) |
Mar
(292) |
Apr
(165) |
May
(56) |
Jun
(135) |
Jul
(248) |
Aug
(218) |
Sep
(165) |
Oct
(150) |
Nov
(135) |
Dec
(266) |
| 2022 |
Jan
(194) |
Feb
(149) |
Mar
(49) |
Apr
(38) |
May
(145) |
Jun
(213) |
Jul
(150) |
Aug
(126) |
Sep
(188) |
Oct
(121) |
Nov
(34) |
Dec
(142) |
| 2023 |
Jan
(105) |
Feb
(82) |
Mar
(138) |
Apr
(125) |
May
(112) |
Jun
(90) |
Jul
(222) |
Aug
(279) |
Sep
(157) |
Oct
(100) |
Nov
(85) |
Dec
(295) |
| 2024 |
Jan
(123) |
Feb
(353) |
Mar
(220) |
Apr
(112) |
May
(162) |
Jun
(169) |
Jul
(205) |
Aug
(174) |
Sep
(73) |
Oct
(62) |
Nov
(95) |
Dec
(62) |
| 2025 |
Jan
(125) |
Feb
(90) |
Mar
(127) |
Apr
(188) |
May
(74) |
Jun
(59) |
Jul
(154) |
Aug
(117) |
Sep
(125) |
Oct
(157) |
Nov
(251) |
Dec
(177) |
| 2026 |
Jan
(115) |
Feb
(50) |
Mar
(63) |
Apr
(50) |
May
(3) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <gi...@cr...> - 2026-05-02 22:05:20
|
via d5e08f372d01eb9aed05292dce5fef35bde8379e (commit)
from 02af3d50c8ca72feb466625fcf3f7fdd5e477b9d (commit)
-----------------------------------------------------------------------
commit d5e08f372d01eb9aed05292dce5fef35bde8379e
Author: CrawlOdds <cra...@gm...>
Date: Fri May 1 21:47:11 2026 +0100
Don't allow knockback to take monsters out of bounds
This could cause rare crashes with wall walkers being trampled
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/melee-attack.cc | 1 +
1 file changed, 1 insertion(+)
diff --git a/crawl-ref/source/melee-attack.cc b/crawl-ref/source/melee-attack.cc
index c234a24e2c..683ba24707 100644
--- a/crawl-ref/source/melee-attack.cc
+++ b/crawl-ref/source/melee-attack.cc
@@ -4904,6 +4904,7 @@ bool melee_attack::do_knockback(bool slippery)
if (!slippery && !x_chance_in_y(size_diff + 3, 6)
// need a valid tile
|| !defender->is_habitable(new_pos)
+ || !in_bounds(new_pos)
// don't trample anywhere the attacker can't follow
|| !attacker->is_habitable(old_pos)
// don't trample into a monster - or do we want to cause a chain
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-05-02 19:10:14
|
at 13fb887620879df6b1c88cb98e8adea6ac984df6 (commit)
-----------------------------------------------------------------------
commit 13fb887620879df6b1c88cb98e8adea6ac984df6
Author: hellmonk <nld...@gm...>
Date: Sat May 2 14:05:18 2026 -0500
Radiant snails
Snails with a blinding aura. I thought this might be fun in an early portal
somewhere. Very simple implementation.
-----------------------------------------------------------------------
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-05-02 16:55:17
|
via 02af3d50c8ca72feb466625fcf3f7fdd5e477b9d (commit)
via 2d096d4ccb7f05c2c937b693780d83771afa04ed (commit)
via 5a90629c15addf32683a16c8a0e5614884e903b9 (commit)
from b14e334c730fdf035bb291f3800f4597fa88c802 (commit)
-----------------------------------------------------------------------
commit 02af3d50c8ca72feb466625fcf3f7fdd5e477b9d
Author: regret-index <clo...@ho...>
Date: Sat May 2 14:21:28 2026 -0230
Improve vault itemspec error handling, fix found errors (DracoOmega)
Crawl's item specification and definition error handling has had
extremely significant errors in it since 0.16. The way it parses items in
a list will silently pass by incorrect entries as long as there is another
valid item further in that list (since the error message it would report
gets replaced by the next work not having any errors). While failing
silently and gracefully allows vaults with some working definitions to
still place the working part of an item list, it's very noticeably against
the policy of Crawl not loading from other significant vault errors, and
it is exceedingly bad policy to completely hide failing item entries from
anybody working on Crawl for relatively indefinite periods of development.
This commit, with some assistance from DracoOmega, makes Crawl print
errors instead of loading whenever it actually parses that an incorrect
item has been passed to vault creation in a vault. I have also thus
gone through and fixed every incorrect item specification Crawl reports:
for the most part, this only fixes minor errors, but most notably it
reintroduces small chances of getting multiple ally scrolls in each Trove
post-rework and also catches the ziggurat potion of mutation syntax error
introduced in c79536f.
(Our limited means of error handling means that, unfortunately, we can't
have Crawl cleanly present every vault's syntax errors at once. It also
means we can't really try to, say, have Crawl report these issues to users
and then load in other valid item specifications or other vaults entirely
without stopping play dead. Further adjustments here may be beneficial,
but for now, this falling into the same means of handling as other .des
syntax errors is fairly more consistent and helps catch more actual
errors.)
commit 2d096d4ccb7f05c2c937b693780d83771afa04ed
Author: regret-index <clo...@ho...>
Date: Fri May 1 09:47:52 2026 -0230
Tweak some descriptions
* Metal walls no longer mention they're bluish-grey- quite a few vaults
recolour them as is, and the default metal wall tiles that the vast
majority of players have seen for the past decade are not blue in any
fashion.
* Fungus in Gulch are now described as mauve instead of grey, which
should be usefully ambigious enough to match both types of fungus
tile colour there while being substantially more accurate than calling
them "grey".
* Athame now are described as knives rather than daggers, to reduce the
chance of misinterpretting them as getting the dagger-exclusive extra
stabbing damage bonus, and as newer weapons people may otherwise
misinterpret.
commit 5a90629c15addf32683a16c8a0e5614884e903b9
Author: regret-index <clo...@ho...>
Date: Fri May 1 08:17:00 2026 -0230
Give sewage sovereigns immunity to Porkalator (tekkud)
The odds of dragging a bound Kirke far enough to see this were
incredulously unlikely to come up in a thousand games, but it is
consistent with the Porkalator immunity hell hogs already have, so it might
as well exist.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/beam.cc | 3 ++-
crawl-ref/source/dat/des/altar/overflow.des | 2 +-
crawl-ref/source/dat/des/branches/abyss.des | 2 +-
crawl-ref/source/dat/des/branches/lair.des | 4 ++--
crawl-ref/source/dat/des/branches/snake.des | 2 +-
.../source/dat/des/branches/vaults_rooms_hard.des | 6 +++---
crawl-ref/source/dat/des/branches/zot.des | 2 +-
crawl-ref/source/dat/des/portals/gauntlet.des | 2 +-
crawl-ref/source/dat/des/portals/gulch.des | 10 +++++-----
crawl-ref/source/dat/des/portals/necropolis.des | 6 +++---
crawl-ref/source/dat/des/portals/trove.des | 23 +++++++++++-----------
crawl-ref/source/dat/des/portals/volcano.des | 2 +-
crawl-ref/source/dat/des/portals/wizlab.des | 10 +++++-----
crawl-ref/source/dat/des/sprint/linesprint.des | 2 +-
crawl-ref/source/dat/des/sprint/pitsprint.des | 2 +-
crawl-ref/source/dat/des/variable/float.des | 6 +++---
.../source/dat/des/variable/grated_community.des | 6 +++---
crawl-ref/source/dat/des/variable/large_themed.des | 7 ++++---
.../source/dat/des/variable/mini_monsters.des | 4 ++--
crawl-ref/source/dat/descript/features.txt | 2 +-
crawl-ref/source/dat/descript/items.txt | 2 +-
crawl-ref/source/dat/descript/monsters.txt | 3 ++-
crawl-ref/source/dat/dlua/vault.lua | 8 ++++----
crawl-ref/source/dat/dlua/ziggurat.lua | 2 +-
crawl-ref/source/mapdef.cc | 4 ++--
25 files changed, 63 insertions(+), 59 deletions(-)
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 195908e87a..f1378e9232 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -5930,7 +5930,8 @@ bool ench_flavour_affects_monster(actor *agent, beam_type flavour,
case BEAM_PORKALATOR:
rc = (mon->holiness() & MH_DEMONIC && mon->type != MONS_HELL_HOG)
- || (mon->holiness() & MH_NATURAL && mon->type != MONS_HOG)
+ || (mon->holiness() & MH_NATURAL && mon->type != MONS_HOG
+ && mon->type != MONS_SEWAGE_SOVEREIGN)
|| (mon->holiness() & MH_HOLY && mon->type != MONS_HOLY_SWINE);
break;
diff --git a/crawl-ref/source/dat/des/altar/overflow.des b/crawl-ref/source/dat/des/altar/overflow.des
index 604bc5f018..5d4c0132b9 100644
--- a/crawl-ref/source/dat/des/altar/overflow.des
+++ b/crawl-ref/source/dat/des/altar/overflow.des
@@ -1040,7 +1040,7 @@ ENDMAP
NAME: nicolae_elyvilon_little_fluffy_clouds
TAGS: transparent decor
WEIGHT: 7
-KITEM: _ = none w:100 / orb / orb ego:light w:1
+KITEM: _ = nothing w:100 / orb / orb ego:light w:1
MARKER: _ = lua:fog_machine{cloud_type = "white fluffiness", pow_min = 10, \
pow_max = 15, delay_min = 20, delay_max = 30, size = 1, \
walk_dist = 3, spread_rate = 0}
diff --git a/crawl-ref/source/dat/des/branches/abyss.des b/crawl-ref/source/dat/des/branches/abyss.des
index 1c70b20a19..d9087d4049 100644
--- a/crawl-ref/source/dat/des/branches/abyss.des
+++ b/crawl-ref/source/dat/des/branches/abyss.des
@@ -851,7 +851,7 @@ MONS: rakshasa ; whip good_item | trident good_item | long sword good_item .
ring mail good_item | kite shield good_item . \
mundane javelin | boomerang | throwing net
MONS: guardian serpent / great orb of eyes
-ITEM: d = potion of curing pre_id / potion of moonshine pre_id
+ITEM: potion of curing pre_id / potion of moonshine pre_id
SUBST: x = ccccvbb
MAP
.x.x
diff --git a/crawl-ref/source/dat/des/branches/lair.des b/crawl-ref/source/dat/des/branches/lair.des
index 443c9f9745..11ff4daf81 100644
--- a/crawl-ref/source/dat/des/branches/lair.des
+++ b/crawl-ref/source/dat/des/branches/lair.des
@@ -4116,8 +4116,8 @@ KMONS: 8 = raven
KMONS: R = spectral anaconda
# A necromancy-themed loot item behind the obsidian statue.
ITEM: rapier ego:pain w:5 / rapier ego:draining w:5 / \
- quickblade ego:pain w:5 / quickblade ego:draining w:5 / \
- demon blade ego:draining / skull of zonguldruk w:1 / \
+ quick blade ego:pain w:5 / quick blade ego:draining w:5 / \
+ demon blade ego:draining / skull of zonguldrok w:1 / \
great sword ego:draining / triple sword ego:draining / \
demon whip ego:pain w:5 / demon whip ego:draining w:5 / \
eveningstar ego:draining / sceptre of torment w:1 / \
diff --git a/crawl-ref/source/dat/des/branches/snake.des b/crawl-ref/source/dat/des/branches/snake.des
index 2cfc3203c1..333c816906 100644
--- a/crawl-ref/source/dat/des/branches/snake.des
+++ b/crawl-ref/source/dat/des/branches/snake.des
@@ -2603,7 +2603,7 @@ KMONS: 12 = guardian serpent / naga w:20 / salamander / anaconda w:20 / \
KMONS: 3 = naga mage / naga ritualist / naga sharpshooter / shock serpent / \
salamander mystic / nothing w:40
KMONS: 4 = nagaraja / salamander tyrant
-KITEM: 2 = %:15 / * / |:5 / nothing w:5
+KITEM: 2 = % w:15 / * / | w:5 / nothing w:5
NSUBST: 4 = 2=4 / 34
SUBST: D = 13
MAP
diff --git a/crawl-ref/source/dat/des/branches/vaults_rooms_hard.des b/crawl-ref/source/dat/des/branches/vaults_rooms_hard.des
index 32e17c898d..68a5b80fa0 100644
--- a/crawl-ref/source/dat/des/branches/vaults_rooms_hard.des
+++ b/crawl-ref/source/dat/des/branches/vaults_rooms_hard.des
@@ -38,8 +38,8 @@ function init_protected_by_tso(e)
e.tags('vaults_hard')
e.kmons('A = angel')
e.kmons('1 = generate_awake daeva')
- e.kmons('2 = vault warden ; great sword ' .. h .. ' | battleaxe .. ' .. h ..
- 'glaive ' .. h .. ' | great mace ' .. h .. ' . ' ..
+ e.kmons('2 = vault warden ; great sword ' .. h .. ' | battleaxe ' .. h ..
+ ' | glaive ' .. h .. ' | great mace ' .. h ..
' . chain mail | plate armour')
e.kmons('3 = generate_awake vault guard / \
generate_awake ironbound mechanist w:2')
@@ -2758,7 +2758,7 @@ NAME: nicolae_vaults_lava_storage_facility
KMONS: 1 = yaktaur captain ; arbalest ego:flaming pre_id w:15 | \
hand cannon ego:flaming pre_id w:3
: local f = "great sword ego:flaming pre_id | long sword ego:flaming pre_id |"..
-: " battle axe ego:flaming pre_id | war axe ego:flaming pre_id | great mace " ..
+: " battleaxe ego:flaming pre_id | war axe ego:flaming pre_id | great mace " ..
: "ego:flaming pre_id | dire flail ego:flaming pre_id | bardiche ego:flaming "..
: "pre_id | glaive ego:flaming pre_id . ring mail ego:fire_resistance pre_id|"..
: "chain mail ego:fire_resistance pre_id | " ..
diff --git a/crawl-ref/source/dat/des/branches/zot.des b/crawl-ref/source/dat/des/branches/zot.des
index c9ef1621c0..7b07d47e1d 100644
--- a/crawl-ref/source/dat/des/branches/zot.des
+++ b/crawl-ref/source/dat/des/branches/zot.des
@@ -3900,7 +3900,7 @@ KMONS: O = diamond obelisk
KMONS: S = lightning spire
ITEM: storm talisman, randbook disc:air spells:chain_lightning
: local e = "ego:electrocution good_item pre_id no_pickup"
-: item("quickblade " .. e .. " w:5 / double sword " .. e .. " w:5 / " ..
+: item("quick blade " .. e .. " w:5 / double sword " .. e .. " w:5 / " ..
: "executioner's axe " .. e .. " w:5 / eveningstar " .. e .. " w:5 / " ..
: "bardiche " .. e .. " w:5 / lajatang " .. e .. " w:5 / " ..
: "rapier " .. e .. " / scimitar " .. e .. " / dire flail " .. " / " ..
diff --git a/crawl-ref/source/dat/des/portals/gauntlet.des b/crawl-ref/source/dat/des/portals/gauntlet.des
index c5191d2bbd..49c54c93bf 100644
--- a/crawl-ref/source/dat/des/portals/gauntlet.des
+++ b/crawl-ref/source/dat/des/portals/gauntlet.des
@@ -1108,7 +1108,7 @@ kitem("P = felid skeleton, protean talisman randart / eel talisman / " ..
"any scroll / any potion / nothing w:60")
-- Barachi warper.
-kitem("Q = barachi skeleton, book of spatial translocation / " ..
+kitem("Q = barachi skeleton, book of spatial translocations / " ..
"book of displacement / there-and-back book / book of the warp / " ..
"randbook disc:translocation, " ..
"scroll of blinking / scroll of teleportation q:2 / " ..
diff --git a/crawl-ref/source/dat/des/portals/gulch.des b/crawl-ref/source/dat/des/portals/gulch.des
index eef20377cf..209f129e9d 100644
--- a/crawl-ref/source/dat/des/portals/gulch.des
+++ b/crawl-ref/source/dat/des/portals/gulch.des
@@ -133,7 +133,7 @@ function gulch_loot(e, item_nsubst, potion_count)
local schools1 = util.random_from({"alchemy", "hexes", "forgecraft"})
local schools2 = util.random_from({"fire", "ice", "air", "earth"})
local orbprop = util.random_from({"Alch", "Forge", "rPois", "rCorr"})
- local weapon_string = "d = "
+ local weapon_string = ""
for _, wt in ipairs(weapon) do
weapon_string = weapon_string .. " / " .. wt .. " ego:venom pre_id good_item"
end
@@ -157,7 +157,7 @@ function gulch_loot(e, item_nsubst, potion_count)
"hand cannon good_item w:20")
e.kitem("e = staff of alchemy randart artprops:Hexes w:5 / " ..
"staff of alchemy randart artprops:Forge w:5 / " ..
- "randbook disc:" .. schools1 .. " disc2:" .. schools2 ..
+ "randbook disc:" .. schools1 .. " disc2:" .. schools2 .. " " ..
"splevels:33 numspells:5 / " ..
"orb ego:attunement randart artprops:" .. orbprop .. " w:3 / " ..
"orb ego:stardust randart artprops:" .. orbprop .. " w:3 / " ..
@@ -242,8 +242,8 @@ function gulch_crossways_sections(e)
e.kmons("5 = fungal shambler / formless jellyfish w:6 / " ..
"telencephalon w:4 / torpor snail w:1")
e.subst("~ = ..Wwx")
- gulch_generic_subvaults(e, {"y", "z"}, "x.", true)
gulch_boss_theme_sets(e, false)
+ gulch_generic_subvaults(e, {"y", "z"}, "x.", true)
gulch_loot(e, "|", 4)
end
@@ -256,8 +256,8 @@ function gulch_network(e)
e.kmons("4 = great orb of eyes / crawling flesh cage / telencephalon w:2")
e.kmons("5 = fungal shambler / formless jellyfish w:6 / " ..
"telencephalon w:4 / torpor snail w:1")
- gulch_generic_subvaults(e, {"y", "z"}, "xxW..", true)
gulch_boss_theme_sets(e, false)
+ gulch_generic_subvaults(e, {"y", "z"}, "xxW..", true)
gulch_loot(e, "|", 4)
end
@@ -270,7 +270,6 @@ function gulch_chamber_river(e, is_subvault)
e.kmons("4 = great orb of eyes / crawling flesh cage / telencephalon w:2")
e.kmons("5 = fungal shambler / formless jellyfish w:6 / " ..
"telencephalon w:4 / torpor snail w:1")
- gulch_generic_subvaults(e, {"y", "z", "Y", "Z"}, "xxW..", true)
if crawl.one_chance_in(3) then
e.kmons("? = fungus")
e.subst("? : ;WW?")
@@ -281,6 +280,7 @@ function gulch_chamber_river(e, is_subvault)
if is_subvault then
gulch_loot(e, "|", 3)
end
+ gulch_generic_subvaults(e, {"y", "z", "Y", "Z"}, "xxW..", true)
end
function gulch_winding_coils(e)
diff --git a/crawl-ref/source/dat/des/portals/necropolis.des b/crawl-ref/source/dat/des/portals/necropolis.des
index 6104fdc390..22e2012b26 100644
--- a/crawl-ref/source/dat/des/portals/necropolis.des
+++ b/crawl-ref/source/dat/des/portals/necropolis.des
@@ -4507,7 +4507,7 @@ ITEM: any magical staff / quarterstaff randart ego:spectral w:5 pre_id / \
dagger randart plus:9 pre_id w:5 / rapier good_item / \
randbook disc:hexes disc2:summoning spells:summon_forest numspells:3 / \
swamp dragon scales no_pickup / any ally scroll q:2 pre_id
-ITEM: any staff randart artprops:Hexes / \
+ITEM: any magical staff randart artprops:Hexes / \
lajatang randart ego:spectral w:5 pre_id / \
athame randart w:2 / quick blade good_item / \
randbook disc:hexes disc2:summoning spells:summon_forest numspells:6 / \
@@ -4695,7 +4695,7 @@ NSUBST: ' = 1:1 / 1:2 / *:', " = 2:1 / *:"
NSUBST: $ = 2:d / *:%, * = 1:e / 1:f, % = 2:* / *:%
: end
KMONS: O = player ghost
-ITEM: dagger ego:vamprism pre_id / falchion ego:vampirism pre_id / \
+ITEM: dagger ego:vampirism pre_id / falchion ego:vampirism pre_id / \
potion of curing q:1 pre_id w:20 / scroll of fog q:1 pre_id w:5 / \
amulet of regeneration pre_id w:5
ITEM: rapier ego:vampirism pre_id / scimitar ego:vampirism pre_id / \
@@ -4754,7 +4754,7 @@ SUBST: ?! = %
KMONS: O = player ghost
ITEM: staff of fire / staff of necromancy / quarterstaff ego:spectral / \
quarterstaff ego:pain / any ring randart artprops:rN pre_id w:15
-ITEM: staff of fire randart / staff of pain randart / \
+ITEM: staff of fire randart / staff of necromancy randart / \
lajatang ego:spectral / lajatang ego:pain / \
any amulet randart artprops:Regen&&rN pre_id w:15
ITEM: scarab talisman, scarab talisman randart
diff --git a/crawl-ref/source/dat/des/portals/trove.des b/crawl-ref/source/dat/des/portals/trove.des
index f1fb401b66..a5af284539 100644
--- a/crawl-ref/source/dat/des/portals/trove.des
+++ b/crawl-ref/source/dat/des/portals/trove.des
@@ -312,7 +312,7 @@ function trove_standard_magic(e, school, use_staff)
["conjuration"] = {"conjuration", "Conj", "conjurations"},
["summoning"] = {"ERROR: set use_staff to false", "Summ", "summonings"},
["necromancy"] = {"necromancy", "Necro", "necromancy"},
- ["translocations"] = {"ERROR: set use_staff to false", "Tloc", "translocations"},
+ ["translocation"] = {"ERROR: set use_staff to false", "Tloc", "translocations"},
["hexes"] = {"ERROR: set use_staff to false", "Hexes", "hexes"},
["fire"] = {"fire", "Fire", "fire magic"},
["ice"] = {"cold", "Ice", "ice magic"},
@@ -1092,7 +1092,8 @@ local box = nil
local talis = nil
local magic = trove_standard_magic(_G, "alchemy", true)
if no_friendlies(_G) == false then
- table.insert(scroll, "any ally scroll q:2")
+ table.insert(scroll, "butterflies w:5 q:2")
+ table.insert(scroll, "summoning w:5 q:2")
box = "box of beasts w:5"
talis = "hive talisman"
if you.mutation("no summoning magic") ~= 1 then
@@ -1217,7 +1218,7 @@ elseif you.mutation("hooves") ~= 3 and you.mutation("talons") ~= 3 then
"pair of boots ego:rampaging good_item w:2"
end
if not no_evil(e) then
- talis = " w:30 / sanguine talisman"
+ talis = "sanguine talisman"
end
trove_offense(_G, trove_weap_brand(_G, "venom", false) .. " / quick blade randart / " ..
@@ -1298,7 +1299,7 @@ if you.species() ~= "Demigod" then
end
kitem('d = ' .. weap)
kitem('e = ' .. manual)
-kitem('f = any ally scroll q:2')
+kitem('f = scroll of summoning q:2')
trove_defense(_G, "pearl dragon scales good_item / \
pearl dragon scales randart artprops:*Silence&Will w:5",
trove_ego_gen_armour(_G, "willpower", "Will"), jewelery,
@@ -1376,7 +1377,7 @@ if you.mutation("no potions") ~= 1 then
potion of heal wounds pre_id q:2"
end
if no_friendlies(_G) == false then
- cons = cons .. " / any ally scroll q:4 w:2"
+ cons = cons .. " / scroll of summoning q:3 w:2"
end
kitem("h = " .. cons)
kitem("i = scroll of brand weapon q:2 pre_id")
@@ -1530,10 +1531,10 @@ MONS: spectral golden dragon, spectral quicksilver dragon
-- All dragon scales, some elemental books, some elemental / slay jewellery,
-- hats and a manual of invocations to match the Mask, some consumables,
-- and some decoration.
-local dg = "dragon_scales good_item"
+local dg = "dragon scales good_item"
local dr = "dragon scales randart"
kitem("d = steam " .. dr .. " / acid " .. dr .. " / swamp " .. dg .. " w:7 / \
- swamp" .. dr .. " / quicksilver dragon scales w:2 / \
+ swamp " .. dr .. " / quicksilver dragon scales w:2 / \
quicksilver " .. dr .. " w:1")
kitem("e = fire " .. dg .. " w:6 / fire " .. dr .. " w:2 / \
ice " .. dg .. " w:6 / ice " .. dr .. " w:2 / \
@@ -1541,7 +1542,7 @@ kitem("e = fire " .. dg .. " w:6 / fire " .. dr .. " w:2 / \
kitem("f = storm " .. dg .. " w:6 / storm " .. dr .. " w:4 / \
shadow " .. dg .. " w:6 / shadow " .. dr .. " w:4 / \
golden " .. dg .. " w:4 / golden " .. dr .. " w:2")
-kitem("g = serpent tailsman randart w:2 / dragon-coil talisman w:6 / \
+kitem("g = serpent talisman randart w:2 / dragon-coil talisman w:6 / \
dragon-coil talisman randart w:12")
local book = trove_book(_G, "fire", "ice") .. " / " ..
trove_book(_G, "air", "earth")
@@ -1552,7 +1553,7 @@ kitem("h = " .. book)
kitem("i = ring of slaying randart w:15 / any amulet randart artprops:rF / \
any amulet randart artprops:rC / any amulet randart artprops:rPois")
kitem("j = useful hat ego:see_invisible good_item w:4 / \
- useful hat ego_willpower good_item w:4 / \
+ useful hat ego:willpower good_item w:4 / \
hat randart artprops:Will / hat randart artprops:Slay")
kitem("k = " .. trove_cons(_G, {"fear q:2", "enchant armour w:15 q:2"},
{"berserk rage q:2", "enlightenment q:2"},
@@ -1638,7 +1639,7 @@ NSUBST: ? = 6:d / 6:g / *:'
{{
local weap = ""
local aux1 = ""
-local magic = trove_standard_magic(_G, "translocations", false)
+local magic = trove_standard_magic(_G, "translocation", false)
local extra = "any manual w:1"
if no_evil(_G) then
weap = "acquire weapon / any useful weapon good_item"
@@ -1751,7 +1752,7 @@ local magic = trove_standard_magic(_G, "earth", true)
local aux = ""
local extra = ""
if no_friendlies(_G) == false then
- extra = extra .. " / any ally scroll q:2"
+ extra = extra .. " / scroll of butterflies q:2"
if you.mutation("no summoning magic") ~= 1 then
magic = magic .. " / " .. trove_standard_magic(_G, "summoning", false) ..
" / any magical staff randart artprops:Summ&Will w:5"
diff --git a/crawl-ref/source/dat/des/portals/volcano.des b/crawl-ref/source/dat/des/portals/volcano.des
index e8daa79a45..22ba2cef40 100644
--- a/crawl-ref/source/dat/des/portals/volcano.des
+++ b/crawl-ref/source/dat/des/portals/volcano.des
@@ -1257,7 +1257,7 @@ WEIGHT: 20
MONS: steam dragon / steam dragon / smoke demon / hell hound
MONS: sun demon, lindwurm
KMONS: 4 = fire crab / fire dragon w:5
-KITEM: 4 = scroll of fog q:2 pre_id w:20 / condensation vane / \
+KITEM: 4 = scroll of fog q:2 pre_id w:20 / condenser vane / \
cloak of the thief w:1
SUBST: a = ..xxl, p = ..'xl, q = .x, ' = '.
NSUBST: 1 = 1:1 / 2:. / * = 1.., D2 = 2:., $ = 1:4 / *:$
diff --git a/crawl-ref/source/dat/des/portals/wizlab.des b/crawl-ref/source/dat/des/portals/wizlab.des
index a74d39d716..96302ea2ce 100644
--- a/crawl-ref/source/dat/des/portals/wizlab.des
+++ b/crawl-ref/source/dat/des/portals/wizlab.des
@@ -785,7 +785,7 @@ MARKER: ! = lua:fog_machine { \
# player complete the rest of the map.
ITEM: potion of haste / potion of resistance w:5 / any potion w:20 \
/ scroll of silence w:5 / scroll of fog w:5 / any scroll w:20
-ITEM: scarf ego:repulsion / book of vapours / condenser vane \
+ITEM: scarf ego:repulsion / trismegistus codex / condenser vane \
/ staff of air
# Main loot, including some thematic items that are good even if you don't care
# about flight.
@@ -1290,7 +1290,7 @@ KMONS: & = col:mutagenic primal ox-ox-weird mutant beast perm_ench:regen \
ITEM: potion of mutation q:1 pre_id
ITEM: randbook disc:alchemy disc2:necromancy owner:Cigotuvi
ITEM: protean talisman randart / maw talisman randart / \
- serpent talisman randart / statue talisman w:8 / \
+ serpent talisman randart / granite talisman w:8 / \
dragon-coil talisman / storm talisman w:8 / \
talisman of death w:2
ITEM: staff of necromancy pre_id, scroll of poison pre_id
@@ -2164,9 +2164,9 @@ MONS: patrolling electric golem
KMONS: P = lightning spire
KMONS: M = ironbound mechanist
KMONS: S = stack of scrap
-ITEM: scarf ego:harm randart w:25 / boots ego:rampaging w:25 /\
- boots ego:rampaging randart /\
- any armour good_item ego:ponderous randart /\
+ITEM: scarf ego:harm randart w:25 / pair of boots ego:rampaging w:25 /\
+ pair of boots ego:rampaging randart /\
+ any body armour good_item ego:ponderousness randart /\
plate armour good_item ego:ponderousness / any weapon ego:chaos /\
maxwell's patent armour w:2 / maxwell's thermic engine w:2
ITEM: any armour good_item w:20 / any weapon good_item w:20 /\
diff --git a/crawl-ref/source/dat/des/sprint/linesprint.des b/crawl-ref/source/dat/des/sprint/linesprint.des
index c4c3efebb8..dec7627cb1 100644
--- a/crawl-ref/source/dat/des/sprint/linesprint.des
+++ b/crawl-ref/source/dat/des/sprint/linesprint.des
@@ -219,7 +219,7 @@ KITEM: a = potion of curing q:4 pre_id, \
KITEM: b = scroll of blinking q:1 pre_id, \
scroll of amnesia q:2 pre_id
KITEM: d = any blast wand charges:10 pre_id /\
- any beam wand charges:10 pre_id, \
+ any beam wand charges:10 pre_id
KITEM: e = rapier plus:2 ego:electrocution pre_id /\
rapier plus:2 ego:draining pre_id /\
rapier plus:2 ego:venom pre_id /\
diff --git a/crawl-ref/source/dat/des/sprint/pitsprint.des b/crawl-ref/source/dat/des/sprint/pitsprint.des
index 3af8c3ac1e..7df94941b8 100644
--- a/crawl-ref/source/dat/des/sprint/pitsprint.des
+++ b/crawl-ref/source/dat/des/sprint/pitsprint.des
@@ -707,7 +707,7 @@ KITEM: k = protean talisman / serpent talisman /\
scale mail plus:4 pre_id /\
plate armour plus:3 pre_id
KITEM: l = any randbook slevels:14, /\
- ring of protection plus:3 pre_id \
+ ring of protection plus:3 pre_id /\
ring of evasion plus:3 pre_id /\
ring of strength plus:3 pre_id /\
ring of intelligence plus:3 pre_id /\
diff --git a/crawl-ref/source/dat/des/variable/float.des b/crawl-ref/source/dat/des/variable/float.des
index 9f65eba5ea..1963301e34 100644
--- a/crawl-ref/source/dat/des/variable/float.des
+++ b/crawl-ref/source/dat/des/variable/float.des
@@ -4603,9 +4603,9 @@ NAME: minmay_shoctagon
DEPTH: D:12-, Elf, Depths
ORIENT: float
ITEM: book of air / book of lightning / book of storms / \
- manual of air magic / staff of air pre_id / lightning rod w:20 \
+ manual of air magic / staff of air pre_id / lightning rod w:20 / \
storm dragon scales w:5 / storm talisman w:5
-KITEM: 2 = arc blade / quick blade ego:electrocution randart pre_id \
+KITEM: 2 = arc blade / quick blade ego:electrocution randart pre_id / \
glaive of the guard / \
demon trident ego:electrocution randart pre_id / storm bow
: if you.in_branch("D") then
@@ -7490,7 +7490,7 @@ MONS: rakshasa, vampire knight, shadow dragon
SUBST: ' = 12, " = 56
: end
KITEM: & = shadow dragon scales randart / manual of stealth / \
- boots ego:stealth good_item pre_id / \
+ pair of boots ego:stealth good_item pre_id / \
cloak ego:stealth good_item pre_id / \
scroll of fog q:3 pre_id
KFEAT: B = cache_of_baked_goods
diff --git a/crawl-ref/source/dat/des/variable/grated_community.des b/crawl-ref/source/dat/des/variable/grated_community.des
index 037604185a..d2336d3b52 100644
--- a/crawl-ref/source/dat/des/variable/grated_community.des
+++ b/crawl-ref/source/dat/des/variable/grated_community.des
@@ -230,21 +230,21 @@ NSUBST: P = 1:P / *:G
KMONS: P = withered plant
: kitem("% = $, any wand / w:15 nothing, " .. s)
: kitem("* = scroll of torment pre_id q:" .. q .. " / nothing, " .. s)
-: kitem("| = potion of magic pre_id q: " .. q .. " / nothing, " .. p)
+: kitem("| = potion of magic pre_id q:" .. q .. " / nothing, " .. p)
KFEAT: C = altar_kikubaaqudgha / altar_sif_muna w:4
SUBST: & = ddddd., G = GGGGGY
: elseif occupant == 1 then
KMONS: P = plant
: kitem("% = $, " .. p .. ", " .. p .. ", " ..p)
: kitem("% = scroll of vulnerability / nothing, " .. s)
-: kitem("* = potion of magic pre_id q: " .. q .. " / nothing, " .. p)
+: kitem("* = potion of magic pre_id q:" .. q .. " / nothing, " .. p)
KFEAT: C = altar_sif_muna / altar_ashenzari w:5
SUBST: 1 = 2, & = eeeee., G = GTU
: else
KITEM: % = $, any beam wand / any blast wand, \
potion of brilliance pre_id / nothing
: kitem("* = scroll of immolation pre_id / nothing, " .. s)
-: kitem("| = scroll of immolation pre_id q: " .. q .. " / nothing, " .. s)
+: kitem("| = scroll of immolation pre_id q:" .. q .. " / nothing, " .. s)
KFEAT: C = altar_vehumet / altar_makhleb w:2
KFEAT: P = cache_of_fruit
SUBST: 1 = 3, & = fffff.
diff --git a/crawl-ref/source/dat/des/variable/large_themed.des b/crawl-ref/source/dat/des/variable/large_themed.des
index d62a8da90e..ffc2325f83 100644
--- a/crawl-ref/source/dat/des/variable/large_themed.des
+++ b/crawl-ref/source/dat/des/variable/large_themed.des
@@ -2822,7 +2822,7 @@ TILE: v = dngn_metal_wall_red
FTILE: ."~01234567Rs>V%$d*|-+abcdefABCDEFTUVn = floor_zot_diamonds
: end
KITEM: & = demon whip / demon blade / demon trident / \
- plate armor ego:fire_resistance pre_id / \
+ plate armour ego:fire_resistance pre_id / \
plate armour ego:command pre_id w:5 / \
fire dragon scales good_item / fire dragon scales randart / \
sanguine talisman w:2 / dragon-coil talisman w:3
@@ -3514,8 +3514,9 @@ ITEM: any scroll, parchment
# Books with notable spells at level 6 or higher, across each school.
ITEM: book of spontaneous combustion / book of ice / book of spectacle / \
book of power / book of chaos / book of the warp / book of death / \
- book of siegecraft / necronomicon / grand grimoire / book of annihilations
-ITEM: robe randart / orb ego:guile randart / orb ego:channeling randart / \
+ compendium of siegecraft / necronomicon / grand grimoire / \
+ book of annihilations
+ITEM: robe randart / orb ego:guile randart / orb ego:energy randart / \
orb ego:stardust randart / orb ego:attunement randart / \
any magical staff randart w:15 / \
ring of wizardry randart / manual of spellcasting w:5
diff --git a/crawl-ref/source/dat/des/variable/mini_monsters.des b/crawl-ref/source/dat/des/variable/mini_monsters.des
index 33724c40d2..5698d72c5b 100644
--- a/crawl-ref/source/dat/des/variable/mini_monsters.des
+++ b/crawl-ref/source/dat/des/variable/mini_monsters.des
@@ -487,7 +487,7 @@ NSUBST: 10 = 2:3 / 1:2, % = 1:| / 1:* / 1:e / * = *%%
SUBST: W = ., X = x
: end
ITEM: throwing net q:1 no_pickup / rapier ego:venom no_pickup w:12 / \
- scimitar ego:venom no_pickup w:8 / \ any hex wand charges:8 no_pickup / \
+ scimitar ego:venom no_pickup w:8 / any hex wand charges:8 no_pickup / \
potion of ambrosia q:1 w:3 pre_id / potion of curing w:3 pre_id / \
fen folio w:3 / my sojourn through swampland w:3 / \
dart ego:curare no_pickup w:3 / scarab talisman
@@ -528,7 +528,7 @@ DEPTH: D:3-7, Depths
: if you.in_branch("D") then
MONS: bombardier beetle
MONS: orc wizard w:20 / orc wizard band w:15 / orc band / orc w:5
-KITEM: any weapon ego:flaming w:18 / parchment disc:fire w:18 / \
+ITEM: any weapon ego:flaming w:18 / parchment disc:fire w:18 / \
wand of flame w:18 / scarab talisman w:18 / \
ring of protection from fire w:18 / manual of fire magic w:15 / \
fire dragon scales w:15 / pair of gloves ego:fire w:5 / \
diff --git a/crawl-ref/source/dat/descript/features.txt b/crawl-ref/source/dat/descript/features.txt
index f56461dba2..373b6088dc 100644
--- a/crawl-ref/source/dat/descript/features.txt
+++ b/crawl-ref/source/dat/descript/features.txt
@@ -233,7 +233,7 @@ cause temporary corrosion.
%%%%
A metal wall
-A wall of bluish-grey metal. As every dungeon electrician knows, it will ground
+A wall of shiny grey metal. As every dungeon electrician knows, it will ground
even magical bolts of lightning.
%%%%
A rock wall
diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt
index 51e09148a7..55432ae1d3 100644
--- a/crawl-ref/source/dat/descript/items.txt
+++ b/crawl-ref/source/dat/descript/items.txt
@@ -75,7 +75,7 @@ with a windlass. It takes some time to load and fire.
%%%%
athame
-An ornate and bewitched ritual dagger. Even just wielding it will cost a small
+An ornate and bewitched ritual knife. Even just wielding it will cost a small
piece of your health, but blows made with it against those suffering negative
statuses (other than poison) have increased base damage, up to +4 for two
such baleful ailments.
diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt
index 5d0b193ecf..e81bd0c0db 100644
--- a/crawl-ref/source/dat/descript/monsters.txt
+++ b/crawl-ref/source/dat/descript/monsters.txt
@@ -1569,7 +1569,8 @@ spores.
%%%%
fungus
-A lumpy grey fungus, growing well in the dank underground dungeon.
+A lumpy {{ if you.branch() == "Gulch" then return "mauve"; else return "grey";
+end }} fungus, growing well in the dank underground dungeon.
%%%%
gargoyle
diff --git a/crawl-ref/source/dat/dlua/vault.lua b/crawl-ref/source/dat/dlua/vault.lua
index ea807becd8..dc09ce211b 100644
--- a/crawl-ref/source/dat/dlua/vault.lua
+++ b/crawl-ref/source/dat/dlua/vault.lua
@@ -245,15 +245,15 @@ function vault_species_skeletons(e, category)
local s3 = {"barachi", "demigod", "dwarf", "demonspawn", "felid", "oni"}
local output = "human skeleton"
if category == "early" or category == "dungeon" or category == "all" then
- output = output .. " / " .. table.concat(s1, " skeleton / ")
+ output = output .. " / " .. table.concat(s1, " skeleton / ") .. " skeleton"
end
if category == "late" or category == "dungeon" or category == "all" then
- output = output .. " / " .. table.concat(s2, " skeleton / ")
+ output = output .. " / " .. table.concat(s2, " skeleton / ") .. " skeleton"
end
if category == "all" then
- output = output .. " / " .. table.concat(s3, " skeleton / ")
+ output = output .. " / " .. table.concat(s3, " skeleton / ") .. " skeleton"
end
- return output .. " skeleton"
+ return output
end
-- Three sets of reusable vault feature redefines scattered across the game,
diff --git a/crawl-ref/source/dat/dlua/ziggurat.lua b/crawl-ref/source/dat/dlua/ziggurat.lua
index a39fd0cf5a..eb7d0d413f 100644
--- a/crawl-ref/source/dat/dlua/ziggurat.lua
+++ b/crawl-ref/source/dat/dlua/ziggurat.lua
@@ -662,7 +662,7 @@ local function ziggurat_create_loot_at(c)
local xpw = math.max(10, 190 - you.zigs_completed() * 30)
local mtw = math.min(470, 290 + you.zigs_completed() * 30)
local super_loot = dgn.item_spec("| no_pickup w:7000 /" ..
- "potion of experience no_pickup q:1 w: " .. xpw .. " / " ..
+ "potion of experience no_pickup q:1 w:" .. xpw .. " / " ..
"potion of mutation no_pickup w:" .. mtw .. " / " ..
"potion of cancellation q:5 no_pickup / " ..
"potion of heal wounds q:5 no_pickup / " ..
diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc
index 7c79ce37be..c0ae8c3963 100644
--- a/crawl-ref/source/mapdef.cc
+++ b/crawl-ref/source/mapdef.cc
@@ -5890,8 +5890,8 @@ item_list::item_spec_slot item_list::parse_item_spec(string spec, bool ignore_ex
item_spec parsed_spec;
if (!parse_single_spec(parsed_spec, specifier))
{
- dprf(DIAG_DNGN, "Failed to parse: %s", specifier.c_str());
- continue;
+ error = make_stringf("Error parsing '%s':\n%s", spec.c_str(), error.c_str());
+ break;
}
if (ignore_excluded
|| parsed_spec.props.exists(NO_EXCLUDE_KEY)
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-30 18:25:26
|
via b14e334c730fdf035bb291f3800f4597fa88c802 (commit)
via c79536f93dbb9f9136d944b518109c9e25660133 (commit)
via f327da5d0f0424f1686286c0cfb03acf61884154 (commit)
via 7c7671227834b79e1995195b648537f93a87668b (commit)
via 7fa87c3485d5a5dfe3309a711a26c6f8a2880d1a (commit)
from 87192ef88b6596bc424918ba7841f8587dd5e853 (commit)
-----------------------------------------------------------------------
commit b14e334c730fdf035bb291f3800f4597fa88c802
Author: regret-index <clo...@ho...>
Date: Thu Apr 30 15:30:54 2026 -0230
Buff Gulch item rewards + add a unique new reward feature (roxie puddles)
* Gulch layouts now feature three more superb_items and one more randart
talisman, to offer more mixed potential reward benefits still heavily
balanced out by the high threat levels of the portal and the usual
blind balancing capacity for rewards to match a specific character's
needs.
* The thematic Gulch rewards have been nudged up a little bit, with an
increased (if not very high) chance of randarts using the flavour
artprops for the plainer egos in the armour slot, and orb randarts
specifying a few valuable types of orb to remove the chance of rolling
e.g. orbs of mayhem as mostly just exist for ziggurat delving.
* Most notably, there is now a completely new and distinct feature added
to parallel the transient mutation entry penalty as well as provide
another distinct reward from other portals. In the boss chambers of
each Gulch is a single "purified mutation catalyst", which upon being
interacted with (via standing on it and pressing `>`, as has been
established with altars and shops both) gives a player a single good
mutation before breaking apart. This leaves the decorative floor
feature of an empty mutation catalyst, and a small number of Gulch
layouts contain such decorative features alongside the usable one.
* This mutation source can never roll the three flat stat increase
mutations for being very boring (c.f. 67c6cfe), nor any body slot
auxes as can have the notable downside of disabling equipment slots
(most pressingly, including horns and antennae dropping helmets
with one level). Zin worshippers and undead still can't mutate,
though those in Death Form can access these catalysts if they
transform back to normal.
* These are deliberately features rather than e.g. returning potions of
beneficial mutation to amplify the interests and pressures of
mutation roulette- if a player wants more than just a single good
mutation for their character, they have to actually commit to
drinking potions of mutation brought in prior. (The flashiness of
the reward as distinct from any other portal, and establishing
that portals can affect characters beyond just item rewards, and
preventing item hoarding with our expanded inventory size limits,
all also contribute to this particular design decision.)
* Currently, autoexplore will stop on seeing the catalyst, but not
automatically travel towards or take it due to how one may thus
want to drink potions of mutation first. Additionally, there is
no prompt for using it. This might warrant some adjustment to stop
ontop of it without actually using it automatically, then bringing
in the usual yes / no prompt, but this is otherwise following some
of the precedents set by altars.
* The mutation catalyst tile in both usable and used-up states
combines CanOfWorms's old Pakellas altar with a CC0 potion graphic
by idylwild.
commit c79536f93dbb9f9136d944b518109c9e25660133
Author: regret-index <clo...@ho...>
Date: Tue Apr 28 14:41:50 2026 -0230
Another quick and brief vault review (+ a minor Zig change)
Worthy of note:
* pf_dread_powers_of_hell has constantly gotten confused reports of it
deploying reapers and balrugs not wielding their iconic weapons, as
both of them haven't kept the wands of flame they were supposed to
be given by the vault for multiple years. Rather than revert it to
the state prior to a1918b6 and end up using crimson imps in Depths,
I am opting to remove the monsters from the vault entirely, which is
a mild shame but fairly less confusing.
* A few Gulch monsters have been added to the usual hyper-randomized
Sprint trio (arenasprint, zigsprint, and pitsprint) as are closest to
contemporary design principles.
* I've made another new Arena map (the testing one, not the Oka one)
with 2-tile-wide corridors to test performances beyond open spaces
or 1-tile-wide corridors.
* hellmonk_guarded_unrand_damnation no longer uses hellions in Elf,
partially because I've got mixed feelings about directly deploying
demons in the branch with such diminished demonology themes, and
partially so one of the best ranged weapon unrands can actually be
guarded by one of the most dangerous ranged monster in the game.
* Ziggurats past the first one cleared redistribute the weight of potions
of experience over to potions of mutation, as the way potions of
experience are currently implemented makes them give very little
besides the experience level by the time one enters a zig, and
rerolling mutations still holds some interest for megazig divers.
commit f327da5d0f0424f1686286c0cfb03acf61884154
Author: regret-index <clo...@ho...>
Date: Tue Apr 28 04:54:50 2026 -0230
Nerf early D generic draugr once more
Most non-specified derived undead placements get extra effective depth for
the monster they pick, due to derived undead mostly missing out on many
of the strengths of the monster they take. This was excluded from draugr in
98bede3 due to them having a fairly reasonable trade-off of AC and an
AF_DOOM weapon hit, but was accidentally renabled when 76c8eab set up V
draugr as being stronger for their depth. While most early draugr placement
specifies monster types to prevent them from being too mean, a few overflow
altars and serial_undead don't, which can do with tuning down for
consistency's sake since so many draugr are quite difficult to even damage
at all early on.
As such, this commit once more removes the derived undead extra floor
scaling for generic draugr placement. (This doesn't apply to Crypt, though,
which already needs as much spice as it can get for its overlap with the
rest of lategame).
commit 7c7671227834b79e1995195b648537f93a87668b
Author: regret-index <clo...@ho...>
Date: Tue Apr 28 03:26:43 2026 -0230
Explicitly mention shields can't block penetrating projectiles
This adjusts the Shields skill description, javelins, and several bolt
spell descriptions to hopefully better communicate to newcomers that if a
projectile can go entirely through three orcs in plate armour before it
hits a target, a shield isn't going to block such either.
commit 7fa87c3485d5a5dfe3309a711a26c6f8a2880d1a
Author: regret-index <clo...@ho...>
Date: Tue Apr 28 02:47:01 2026 -0230
Make manticores count as winged quadrupeds (tekkud)
In almost any medieval bestiary manuscript collection, over 90% of
manticores don't actually have wings. This common perception is, as usual,
mostly D&D's fault, and can plausibly be traced back to Dante insisting
Geryon was a human-faced stinger-bearing dragon-lion for the sake of a
winged mount planar crawl. Unfortunately, Crawl needs manticores to be able
to fly so Shoals has more lowest-level fodder, and I'm pretty doubtful
people would entirely take wingless manticores swimming through the Shoals
water that seriously, so I'm updating their bodyplan to match their
capacity to fly and their tile both.
(This mostly just affects manticore derived undead tile choices, for the
record, which got extra highlighted with the additional spectral tiles
added in 70a134b.)
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/dat/defaults/misc.txt | 2 +-
crawl-ref/source/dat/des/branches/hell.des | 5 +-
crawl-ref/source/dat/des/branches/zot.des | 2 +-
crawl-ref/source/dat/des/builder/arena.des | 27 +++
crawl-ref/source/dat/des/portals/gulch.des | 195 +++++++++++----------
crawl-ref/source/dat/des/sprint/arena_sprint.des | 22 +--
crawl-ref/source/dat/des/sprint/pitsprint.des | 19 +-
crawl-ref/source/dat/des/sprint/zigsprint.des | 15 +-
.../source/dat/des/variable/mini_monsters.des | 6 +-
crawl-ref/source/dat/descript/features.txt | 10 ++
crawl-ref/source/dat/descript/items.txt | 6 +-
crawl-ref/source/dat/descript/skills.txt | 6 +-
crawl-ref/source/dat/descript/spells.txt | 29 +--
crawl-ref/source/dat/dlua/vault.lua | 3 +-
crawl-ref/source/dat/dlua/ziggurat.lua | 19 +-
crawl-ref/source/dat/mons/manticore.yaml | 2 +-
crawl-ref/source/describe.cc | 29 +++
crawl-ref/source/dgn-proclayouts.cc | 1 +
crawl-ref/source/dungeon-feature-type.h | 4 +
crawl-ref/source/explore-stop-options.h | 1 +
crawl-ref/source/feature-data.h | 7 +
crawl-ref/source/main.cc | 5 +-
crawl-ref/source/mon-place.cc | 2 +-
crawl-ref/source/mutation-data.h | 1 +
crawl-ref/source/mutation-type.h | 1 +
crawl-ref/source/mutation.cc | 78 ++++++++-
crawl-ref/source/mutation.h | 2 +
crawl-ref/source/rltiles/dc-feat.txt | 3 +
.../rltiles/dngn/empty_mutation_catalyst.png | Bin 0 -> 7799 bytes
.../rltiles/dngn/purified_mutation_catalyst.png | Bin 0 -> 8077 bytes
crawl-ref/source/terrain.cc | 2 +-
crawl-ref/source/tilepick.cc | 2 +
crawl-ref/source/travel.cc | 6 +
crawl-ref/source/travel.h | 1 +
crawl-ref/source/viewmap.cc | 6 +-
35 files changed, 357 insertions(+), 162 deletions(-)
create mode 100644 crawl-ref/source/rltiles/dngn/empty_mutation_catalyst.png
create mode 100644 crawl-ref/source/rltiles/dngn/purified_mutation_catalyst.png
diff --git a/crawl-ref/source/dat/defaults/misc.txt b/crawl-ref/source/dat/defaults/misc.txt
index 2987d72d4f..c5054ba4f0 100644
--- a/crawl-ref/source/dat/defaults/misc.txt
+++ b/crawl-ref/source/dat/defaults/misc.txt
@@ -15,7 +15,7 @@ note_messages += You (fall|are sucked) into a shaft
note_monsters += orb of fire, orb of winter, orb of entropy
note_monsters += ancient lich, dread lich, Sigmund
-monster_item_view_features += stair, trap, runelight
+monster_item_view_features += stair, trap, runelight, purified mutation catalyst
# Dangerous and non-tactical items
action_panel_filter = attraction,moonshine,experience,mutation
diff --git a/crawl-ref/source/dat/des/branches/hell.des b/crawl-ref/source/dat/des/branches/hell.des
index 58c974bc03..5a75246b86 100644
--- a/crawl-ref/source/dat/des/branches/hell.des
+++ b/crawl-ref/source/dat/des/branches/hell.des
@@ -421,7 +421,6 @@ ENDMAP
NAME: pf_dread_powers_of_hell
TAGS: transparent uniq_hell_entry_geh
WEIGHT: 2
-KMONS: i = reaper ; wand of flame / balrug ; wand of flame pre_id
TILE: c = dngn_stone_wall_red
COLOUR: c = red
FTILE: 'iO = floor_infernal_blank
@@ -430,7 +429,7 @@ FTILE: 'iO = floor_infernal_blank
MAP
........
..cccccc...
- ....cci'ccc..
+ ....cc''ccc..
...l..cc'''cc..
...lll..cc'''cc..
...lllll..cc'''cc..
@@ -438,7 +437,7 @@ MAP
...lllll..cc'''cc..
...lll..cc'''cc..
...l..cc'''cc..
- ....cci'ccc..
+ ....cc''ccc..
..cccccc...
........
ENDMAP
diff --git a/crawl-ref/source/dat/des/branches/zot.des b/crawl-ref/source/dat/des/branches/zot.des
index 7b483fa1c0..c9ef1621c0 100644
--- a/crawl-ref/source/dat/des/branches/zot.des
+++ b/crawl-ref/source/dat/des/branches/zot.des
@@ -3840,7 +3840,7 @@ SHUFFLE: ])deOG, OGUCD~, GM
: tile("b = dngn_crystal_" .. wallc)
: tile("v = dngn_metal_wall_" .. wallc)
: tile("c = dngn_stone_wall_" .. wallc)
-: ftile(".`123409deO%CDTG~+ = floor_rough_" .. floorc)
+: ftile(".`^123409deO%CDTG~+ = floor_rough_" .. floorc)
: vault_granite_statue_setup(_G, "G", "scintillating statue")
: vault_metal_statue_setup(_G, "M", "enigmatic dynamo")
MAP
diff --git a/crawl-ref/source/dat/des/builder/arena.des b/crawl-ref/source/dat/des/builder/arena.des
index e47512c259..68c61703d9 100644
--- a/crawl-ref/source/dat/des/builder/arena.des
+++ b/crawl-ref/source/dat/des/builder/arena.des
@@ -362,6 +362,33 @@ X...X...A...X...X
XXXXXXXXXXXXXXXXX
ENDMAP
+NAME: arena_widebaffles
+TAGS: arena_widebaffles
+MARKER: A = feat: stone_stairs_up_i
+MARKER: B = feat: stone_stairs_down_i
+MARKER: O = feat: escape_hatch_up
+SUBST: A = ., B = ., O = .
+ORIENT: encompass
+MAP
+XXXXXXXXXXXXXXXXX
+X.......B.......X
+X.......X.......X
+X..XXX..X..XXX..X
+X.......X.......X
+X.......X.......X
+X..X..XXXXX..X..X
+X..X.........X..X
+X..X..X.O.X..X..X
+X..X.........X..X
+X..X..XXXXX..X..X
+X.......X.......X
+X.......X.......X
+X..XXX..X..XXX..X
+X.......X.......X
+X.......A.......X
+XXXXXXXXXXXXXXXXX
+ENDMAP
+
NAME: arena_glassbaffles
TAGS: arena_glassbaffles
MARKER: A = feat: stone_stairs_up_i
diff --git a/crawl-ref/source/dat/des/portals/gulch.des b/crawl-ref/source/dat/des/portals/gulch.des
index 75b83bea4f..eef20377cf 100644
--- a/crawl-ref/source/dat/des/portals/gulch.des
+++ b/crawl-ref/source/dat/des/portals/gulch.des
@@ -99,6 +99,8 @@ end
function gulch_setup(e, main_vault)
e.kfeat("< = exit_gulch")
+ e.kfeat("} = purified_mutation_catalyst")
+ decorative_floor(e, ']', "empty mutation catalyst")
if main_vault then
e.place("Gulch")
e.tags("no_monster_gen no_item_gen no_pool_fixup")
@@ -117,11 +119,12 @@ end
-- * Two top-tier venom-branded weapons / good_item hand cannons
-- * Two Alchemy, Hexes, or Forgecraft magic-enhancing items
-- * A rPois / rCorr / prior schools / flying piece of armour / jewellery
--- * A random tier 3 or 4 talisman randart with rPois / rCorr
+-- * Two random tier 3 or 4 talisman randarts with rPois / rCorr
-- To fit both the trash themes and to help people who didn't bring in
-- flaming weapons for the ~5% of encountering slymdra, there's also a bunch
-- of damaged ego weapons, including flaming ones available via cross-training
--- for all characters.
+-- for all characters. Purified mutation catalysts- single use good mutation
+-- features- are set up in gulch_setup instead.
function gulch_loot(e, item_nsubst, potion_count)
local weapon = {"quick blade w:6", "great mace w:4", "eveningstar w:6",
"double sword w:5", "triple sword w:5", "broad axe w:4",
@@ -139,10 +142,12 @@ function gulch_loot(e, item_nsubst, potion_count)
local res_c = "ego:corrosion_resistance good_item"
local prop_p = "randart artprops:rPois"
local prop_c = "randart artprops:rCorr"
- local def = { { i = "cloak " .. res_p, w = 8 }, { i = "cloak " .. res_c, w = 12 },
+ local def = { { i = "cloak " .. res_p, w = 6 }, { i = "cloak " .. prop_p, w = 2 },
+ { i = "cloak " .. res_c, w = 10 }, { i = "cloak " .. prop_c, w = 2 },
{ i = "pair of boots ego:flying good_item, " ..
"barding ego:flying good_item", w = 10 },
- { i = "kite shield " .. res_c, w = 10 },
+ { i = "kite shield " .. res_c, w = 8 },
+ { i = "kite shield " .. prop_c, w = 2 },
{ i = "scale mail ego:resonance good_item", w = 4 },
{ i = "chain mail ego:resonance good_item", w = 6 },
{ i = "any ring " .. prop_p, w = 8 },
@@ -153,7 +158,11 @@ function gulch_loot(e, item_nsubst, potion_count)
e.kitem("e = staff of alchemy randart artprops:Hexes w:5 / " ..
"staff of alchemy randart artprops:Forge w:5 / " ..
"randbook disc:" .. schools1 .. " disc2:" .. schools2 ..
- "splevels:33 numspells:5 / orb randart artprops:" .. orbprop .. " / " ..
+ "splevels:33 numspells:5 / " ..
+ "orb ego:attunement randart artprops:" .. orbprop .. " w:3 / " ..
+ "orb ego:stardust randart artprops:" .. orbprop .. " w:3 / " ..
+ "orb ego:guile randart artprops:" .. orbprop .. " w:2 / " ..
+ "orb ego:glass randart artprops:" .. orbprop .. " w:2 / " ..
"manual of alchemy w:5 / manual of forgecraft w:5")
e.kitem("f = " .. util.random_weighted_from("w", def).i)
e.kitem("g = maw talisman w:8 " .. prop_p .. " / maw talisman w:12 " .. prop_c .. " / " ..
@@ -174,8 +183,8 @@ function gulch_loot(e, item_nsubst, potion_count)
"damaged rapier ego:freezing pre_id no_pickup / " ..
"damaged dire flail ego:freezing pre_id no_pickup")
e.kitem("$ = $ no_pickup")
- e.kitem("% = any potion w:12 / potion of mutation pre_id q:1 w:1")
- e.nsubst(item_nsubst .. " = 2:d / 2:e / 1:f / 1:g / *:|")
+ e.kitem("% = any potion w:12 / any potion q:2 w:4")
+ e.nsubst(item_nsubst .. " = 2:d / 2:e / 1:f / 2:g / *:|")
e.nsubst("i = 1:h / 1:i / 1:j / 2 = hij / *:k")
e.nsubst("$ = " .. potion_count - 1 .. " = %$$ / " .. potion_count.. ":% / *:$")
end
@@ -516,8 +525,8 @@ ENDMAP
# in the subvault definitions and pass the subvault glyphs into that function
# to properly distribute those rewards- refer to how it's done in layouts
# like gulch_chambers_river, gulch_winding_coils, and gulch_divide.
-# * With unique tiles for each, a basic wall progression from rock to stone
-# to bits of metal from start to finish can easily look nice.
+# * With unique tiles for each, some simple wall progression between rock and
+# stone and (bits of metal) from start to finish can easily look nice.
# * The current gulch_boss_theme_sets(_G) set-up uses ? and ' to place
# terrain features, with ? using mould patches or stacks of scrap as
# traversible blocking features and ' rarely being used for deep water that
@@ -554,8 +563,8 @@ MAP
cx.1.'?..-CCCCCCCCCCCCCCCCCCCCC-..?'.1.xc
cx......WcCCCCCCCCCCCCCCCCCCCCCcW......xc
cc.?'.....-CCCCCCCCCCCCCCCCCCCCC-.....'?.cc
- cc..'?.....cCCCCCCCCCCCCCCCCCCCCCc.....?'..cc
- cc........v$cCCCCCCCCCCCCCCCCCCCCCc$v........cc
+ cc..'?....$cCCCCCCCCCCCCCCCCCCCCCc$....?'..cc
+ cc........v|cCCCCCCCCCCCCCCCCCCCCCc|v........cc
c..W.W.W..$|ccccccccccccccccccccccc|$..W.W.W..c
cccc-c-c-c-ccccvvvvvvvvvvvvvvvvvvvvvcccc-c-D-c-cccc
ccBBBBBBBBBBBcvw?'..Z....Y....Z..'?wvcDDDDDDDDDDDcc
@@ -573,7 +582,7 @@ ccBBBBBBBBBBBcv...'v'.1.vvv.1.'v'...vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv....v$..0$v$0..$v....vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv..vvvvv0.6v6.0vvvvv..vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv..z...vv||6||vv...z..vcDDDDDDDDDDDcc
-ccBBBBBBBBBBBcv.......vv|.|vv.......vcDDDDDDDDDDDcc
+ccBBBBBBBBBBBcv.......vv|}|vv.......vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv........vvvvv..yy....vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv........v...v..y.....vcDDDDDDDDDDDcc
ccBBBBBBBBBBBcv'.......v...v.......'vcDDDDDDDDDDDcc
@@ -582,9 +591,9 @@ ccBBBBBBBBBBBcvw?'..Z....Y....Z..'?wvcDDDDDDDDDDDcc
cccc+c+B+c+ccccvvvv+v+v+vvvvvvvvvvvvcccc+c+c+c+cccc
cc...W.W.W....xxxxxxPxPxccccxxxxxxxxx....W.W.W...cc
cc............~~~~~~~.~~ccc~~~~~~~~~~............cc
-cc..v..............3.2<.ccc.A.W...1.3.........v..cc
+cci.v..............3.2<.ccc.A.W...1.3.........v.icc
cc~'..............2.1...ccc..W.<...2...........'~cc
-ccx~ii~i~i~i~i~~~~~~~~~~ccc~~~~~~~~~~i~i~i~i~ii~xcc
+ccx~|i~i~i~i~i~~~~~~~~~~ccc~~~~~~~~~~i~i~i~i~i|~xcc
ccxxxxxxxxxxxxxxxxxxxxxcccccxxxxxxxxxxxxxxxxxxxxxcc
ccccccccccccccccccccccccccccccccccccccccccccccccccc
ENDMAP
@@ -786,11 +795,11 @@ vvvvvvvvvvvvvxx x.2cvvvvc3.x xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx +.2cvvvvc2.+ xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx +.$cvvvvc$.+ xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx xcccvvvvcccx xxccccccccvvvvv
-vvvvvvvvcccccxx x.'cvvvvc'.x xx~~.~~.03cvvvv
+vvvvvvvvcccccxx x.'cvvvvc'.x xx~~.~~|03cvvvv
vvvvvvvvc$$$cxx +.1cvvvvc$.+ xx.....060cvvvv
-vvvvvvvccc+ccxx +.$cvvvvc0.+ .x..c$060.cvvvv
+vvvvvvvccc+ccxx +.$cvvvvc0.+ .x..c$060|cvvvv
vvvvvccc04...x. x.'cvvvvc'.x .+..c$|0.~cvvvv
-vvvvvc$c5'?..+. xcccvvvvcccx .+..c|$$.~cvvvv
+vvvvvc$c5'?..+. xcccvvvvcccx .+..c}$$.~cvvvv
vvvvvc|+.?~..+. +.$cvvvvc$.+ .+..cccc..cvvvv
vvvvvc$c...3.+. +.2cvvvvc2.+ .x.?.....~cvvvv
vvvvvccc.....x. x.2cvvvvc2.x xx?......~cvvvv
@@ -807,9 +816,9 @@ vvvvc~.....?.xx +.2cvvvvc2.+ .+.3...c$cvvvvv
vvvvc..cccc..+. +.$cvvvvc$.+ .+..~?.+|cvvvvv
vvvvc~.$$|c..+. xcccvvvvcccx .+..?'5c$cvvvvv
vvvvc~.0|$c..+. x.'cvvvvc'.x .x...40cccvvvvv
-vvvvc.040$c.'x. +.0cvvvvc$.+ xxcc+cccvvvvvvv
+vvvvc|040$c.'x. +.0cvvvvc$.+ xxcc+cccvvvvvvv
vvvvc130.....xx +.$cvvvvc1.+ xxc$$$cvvvvvvvv
-vvvvc21.~~.~~xx x.'cvvvvc'.x xxcccccvvvvvvvv
+vvvvc21|~~.~~xx x.'cvvvvc'.x xxcccccvvvvvvvv
vvvvvccccccccxx xcccvvvvcccx xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx +.$cvvvvc$.+ xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx +.2cvvvvc2.+ xxvvvvvvvvvvvvv
@@ -826,8 +835,8 @@ vvvvvvvvvvvvvxx x....'....cx xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx +.c..?..c3cx xxcvvvvvvvvvvvv
vvvvcccccccccxx +.cc$'$cc4cx xxccvvvvvvvvvvv
vvvvccc$3...'xx +..cc?cc$2cx xx$ccvvvvvvvvvv
-vvvvcc|c2.c..x. x.'.ccc|3.vx xx'.ccvvvvvvvvv
-vvvvc$cc5c...+. x.'.ccc|3.vx .x?c$ccvvvvvvvv
+vvvvcc|c2.c..x. x.'.ccc|3|vx xx'.ccvvvvvvvvv
+vvvvc$cc5c...+. x.'.ccc|3|vx .x?c$ccvvvvvvvv
vvvvc324v....+. +..cc?cc$2cx .+...1ccvvvvvvv
vvvvc..c.c...x. +.cc$'$cc5cx .+..2v1ccvvvvvv
vvvvc.c.....'xx +.c..?..c3cx .x..c2.$ccvvvvv
@@ -842,16 +851,16 @@ vv vv
vxxxxxxx....xxx xxxxxxxxxxxx xxxxx....xxxxxv
vxxxxxxxx++xxxx xxxxxxxxxxxx xxxxxx++xxxxxxv
vvvcc$.?....?xx xccccccccccx xxxx'....'cvvvv
-vvvvcc.c...c.xx xc....'....x .xx?......cvvvv
+vvvvcc.c...c.xx xc}...'....x .xx?......cvvvv
vvvvvcc..2c..x. xc0c..?..c.+ .x'.....c.cvvvv
vvvvvvcc1v2..+. xc6cc$'.cc.+ .x...c.c..cvvvv
vvvvvvvcc1...+. xc0$cc?cc..+ .+....v523cvvvv
-vvvvvvvvcc.c?x. xv.0|ccc.'.x .+...c4cc$cvvvv
-vvvvvvvvvcc..xx xv.0|ccc.'.x xx..c.2c|ccvvvv
+vvvvvvvvcc.c?x. xv|0|ccc.'.x .+...c4cc$cvvvv
+vvvvvvvvvcc..xx xv|0|ccc.'.x xx..c.2c|ccvvvv
vvvvvvvvvvcc$xx xc0$cc?cc..+ xx'...3$cccvvvv
vvvvvvvvvvvccxx xc6cc$'.cc.+ xxcccccccccvvvv
vvvvvvvvvvvvcxx xc0c..?..c.+ xxvvvvvvvvvvvvv
-vvvvvvvvvvvvvxx xc....'....x xxvvvvvvvvvvvvv
+vvvvvvvvvvvvvxx xc]...'....x xxvvvvvvvvvvvvv
vvvvvvvvvvvvvxx xccccccccccx xxvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
ENDMAP
@@ -865,10 +874,10 @@ vvvvvvvvvvc..x. +...cccc...+ xxvccccvvvvvvvv
vvvvvvvvvvc~.+. +..~.3'.~..+ xxvc$$cvvvvvvvv
vvvvvvvvvvc..+. +....'0....+ xccc++ccvvvvvvv
vvvvvvvvvvc1.x. xcc..2?..ccx xc...22ccvvvvvv
-vvvvvvvvvcc++xx xvc+c?3c+cvx xc~...34vcvvvvv
+vvvvvvvvvcc++xx xvc+c?3c+cvx xc~..|34vcvvvvv
vvvvvvvccc...xx xvc$cccc$cvx xcc++c|.5ccvvvv
vvvvvvvc$.~..xx xvcccvvcccvx xc...cc|32cccvv
-vvvvvvcc.2.4.xx xvvvvvvvvvvx xc...'cc.2+$cvv
+vvvvvvcc.2.4.xx xvvvvvvvvvvx xc...'cc|2+$cvv
vcccccc.~.2$cxx xvvvvvvvvvvx xc.??..+..+$cvv
vc.~.1+..3$|cxx xvvvvvvvvvvx xc'1...+..cccvv
vc'...+...cccxx xvvvvvvvvvvx xc.....c~.cvvvv
@@ -883,10 +892,10 @@ vvxxxxxxx+++xxx xxxxxxxxxxxx xxxxxxxxxx++xxv
vvvvc..c.....cx xvvvvvvvvvvx xxccc...+...'cv
vvccc..+...1'cx xvvvvvvvvvvx xxc|.3..+1.~.cv
vvc$+..+..??.cx xvvvvvvvvvvx xxc.2.~.ccccccv
-vvc$+0.cc'...cx xvvvvvvvvvvx xx.4.2$ccvvvvvv
+vvc$+0|cc'...cx xvvvvvvvvvvx xx.4.2$ccvvvvvv
vvccc00|cc...cx xvcccvvcccvx xx..~$$cvvvvvvv
-vvvvcc6.|c++ccx xvc$cccc$cvx xx...cccvvvvvvv
-vvvvvcv60....cx xvc+c2?c+cvx xx++ccvvvvvvvvv
+vvvvcc6}|c++ccx xvc$cccc$cvx xx...cccvvvvvvv
+vvvvvcv60|...cx xvc+c2?c+cvx xx++ccvvvvvvvvv
vvvvvvcc00...cx xcc..?3..ccx .x.1cvvvvvvvvvv
vvvvvvvcc++cccx +....0'....+ .+..cvvvvvvvvvv
vvvvvvvvc$$cvxx +..~.'3.~..+ .+.~cvvvvvvvvvv
@@ -903,14 +912,14 @@ MAP
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
vvvvvvvccccccxx xcccccvvvvvx xcvvvvvvvvvvvvv
vvvvvvcc'.cc2x. +...'cccccvx xccccccvvvvvvvv
-vvvvvcc3.PP..+. +.~?.c..$cvx xc$$.|cvvvvvvvv
+vvvvvcc3.PP..+. +.~?.c..$cvx xc$$||cvvvvvvvv
vvvvcc4..c...+. +.?~.c.2.cvx xcc++ccccccvvvv
-vvvcc5..cccccxx x'...+..3cvx xc....'00|cvvvv
-vvcc0..QQQ...+. xccc++.~.cvx xc....0c$0cvvvv
-vcc3..Rc.cc..+. xvc......cvx xx'..6ccc0cvvvv
-vc'..cR...cc1x. xvc.~....ccx .x...ccc0'cccvv
-vc.SccRc...ccxx xvc2..++cccx .+..ccc6..c|cvv
-vccS.c.cc...ccx xvc.0.+....x .+..?c....+.cvv
+vvvcc5..cccccxx x'...+..3cvx xc$...'42|cvvvv
+vvcc0..QQQ...+. xccc++.~.cvx xc....3c$5cvvvv
+vcc3..Rc.cc..+. xvc......cvx xx'..2ccc4cvvvv
+vc'..cR...cc1x. xvc.~....ccx .x...ccc3'cccvv
+vc.SccRc...ccxx xvc2..++cccx .+..ccc2..c|cvv
+vccS.c.cc...ccx xvc.0.+....x .+..?c....+|cvv
vcc..c..cc.?$cx xvc$..c.~?.+ .+.c......+$cvv
vc2..c..1cc$|cx xvccccc.?~.+ .x.....'..c$cvv
vxx++x++xxccccx xvvvvvc....+ xxx+++xxccccccv
@@ -923,14 +932,14 @@ vxxxxxxx.....xx xxxxxxxxxxxx xxxxxx...x...xv
vccccccxx+++xxx +....cvvvvvx xccccxx++x++xxv
vvc$c..'.....x. +.~?.cccccvx xc|$cc1..c..2cv
vvc$+......c.+. +.?~.c..$cvx xc$?.cc..c..ccv
-vvc.+....c?..+. x....+.0.cvx xcc...cc.c.Sccv
+vvc|+....c?..+. x....+.0.cvx xcc...cc.c.Sccv
vvc|c..6ccc..+. xccc++..2cvx xxcc...cRccS.cv
vvccc'0ccc...x. xcc....~.cvx .x1cc...Rc..'cv
vvvvc0ccc6..'xx xvc......cvx .+..cc.cR..3ccv
-vvvvc0$c0....cx xvc.~.++cccx .+...QQQ..0ccvv
-vvvvc|00'....cx xvc3..+...'x xxccccc..5ccvvv
+vvvvc0}c0....cx xvc.~.++cccx .+...QQQ..0ccvv
+vvvvc|00'...$cx xvc3..+...'x xxccccc..5ccvvv
vvvvcccccc++ccx xvc.2.c.~?.+ .+...c..4ccvvvv
-vvvvvvvvc|.$$cx xvc$..c.?~.+ .+..PP.3ccvvvvv
+vvvvvvvvc||$$cx xvc$..c.?~.+ .+..PP.3ccvvvvv
vvvvvvvvccccccx xvccccc'...+ .x2cc.'ccvvvvvv
vvvvvvvvvvvvvcx xvvvvvcccccx xxccccccvvvvvvv
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -1032,7 +1041,7 @@ c.xxxx.2.x'.....c
c.....1..x??xxx'c
c.1..2..Wx'.y...ccvvvvvvvvvvvvvvvvvvvvvvvvvvv
c......W3x..y...'c x$$xx$$x vvvvvv
-c..xxxxxxx0......c x..xx..x xvvvvv
+c..xxxxxxx0......c x..xx.|x xvvvvv
c....'?'.0.......c +..2'..+ xvvvvv
c..3..?....?...c+c +..'3..+ xvvvvv
cx....xyy...c++c xxxxxxxx xxxxvv
@@ -1050,7 +1059,7 @@ cccccccc'..+ v
vx$..+ +..$xv
vxxx2x x4xxxv
vxxx3x x5xxxv
- vx$..+ +..|xv
+ vx$|.+ +..|xv
vxx'.+ +..xxv
vxxxxx xxxxxv
v v
@@ -1061,19 +1070,19 @@ cccccccc'..+ v
v c..'vvvvvvvv
v cc...?'...$|v
v +....?..x.|$v
- v +....x..x...v
+ v +....x..x..|v
vvxxxx xxxxxxxx c++c....x.'xxx.v
vvvvvx +..4'..+ ccc.......x..'...v
vvvvvx +..'5..+ c........2x......v
vvvvvx x..xx..x c.......1.x..xxx.v
vvvvvv x$$xx|$x c'.....2..x..z..3v
vvvvvvvvvvvvvvvvvvvvvvvvvvvvv??xxxxxxx..z...v
- v'..............v
+ v'........}.....v
v...'......xxxx0v
v.xxx'.xzz.x6'0.v
v...x..x...x'6.$v
v$|.x..x...x0.6|v
- v|$.....3..0.$|$v
+ v|$|....3..0.$|$v
vvvvvvvvvvvvvvvvv
ENDMAP
@@ -1091,7 +1100,7 @@ c<....xx...x?...c
c.x...xx...?x?..ccvvvvvvvvvvvvvvvvvvvvvvvvvvv
c1.x.1..x.'.?x..0c x|$...xx x..$xv
c.2.x....x....x..c x$.x4x.x +.2x$v
-c....x..'.xx...x.c x.x5x..x +.x3.v
+c....x..'.xx...x.c x.x5x..x +.x3|v
c...x.x?..xx'..c+c xx.....x xx...v
cW..x.?x?..'ccc+ xxx++xxx xx++xv
cy...3.?x...c v
@@ -1117,20 +1126,20 @@ cccccccc0..+ v
v v
v ccccc
v c|||cccccccc
- v ccx$$..x.zz.c
+ v ccx$$|.x.zz.c
v +.xx$..+....c
v +..xx..+...6c
vx++xx xxx++xxx c++c...xx.x..0.c
v...xx x.....xx ccc...z...xxx.0..c
v.2x.+ x..x4x.x c|xx......2xx.0.~c
v$x3.+ x.x5x.$x c|$xx......3x...~c
- vx$..x xx...$|x c|$$xx......xx...c
- vvvvvvvvvvvvvvvvvvvvvvvvvvvcc...xx2..?...x..c
+ vx$|.x xx...$|x c|$$xx......xx...c
+ vvvvvvvvvvvvvvvvvvvvvvvvvvvcc|..xx2..?...x..c
c....xx3..?...x.c
cx++xxxxx......xc
c.......x......0c
cz...00..x......c
- cz..0.....x.....c
+ cz..0.....x...}.c
c..6..~~...x0..6c
ccccccccccccccccc
ENDMAP
@@ -1147,8 +1156,8 @@ c..xx~...xx.3..~c
c.yx~.....x.....c
c..x..1...xxx...c
c..1....'??.xxx?ccvvvvvvvvvvvvvvvvvvvvvvvvvvv
-c......''.......'c x$xxxx$x xvvvvv
-c2xxx..?...x0....c +.4xx5.+ xxxvvv
+c......''.......'c x$xxxx|x xvvvvv
+c2xxx..?...x0....c +.4xx5$+ xxxvvv
c...xxx?..xxx....c +..''..+ +$vxvv
c.....x..xx....+cc x......x +?$xvv
c~..3.xx.0x.ccc+ xxx++xxx x++xxv
@@ -1166,7 +1175,7 @@ cccccccc'..c v
v.1..x x.1..v
v$xxxx x$xxxv
vxxx$x xxxx|v
- v.23.x x.23.v
+ v|23.x x.23.v
v...'x x...'v
vx++xx xx++xv
v v
@@ -1180,11 +1189,11 @@ cccccccc'..c v
v +..xxxx....zc
vxx++x xxx++xxx c++c..2x|xx~...c
vvx$?+ x......x ccc......x|$xx...c
- vvxv$+ +..''..+ c......1.x.~$xx..c
+ vvxv$+ +..''..+ c......1.x|~$xx..c
vvvxxx +.4xx5.+ c.''x2..xx$..|x..c
vvvvvx x$xxxx|x c??xxxxxxxx++xx..c
- vvvvvvvvvvvvvvvvvvvvvvvvvvvcc.3x||.$xx...x..c
- c..xx$~.+...0..0c
+ vvvvvvvvvvvvvvvvvvvvvvvvvvvcc.3x|||$xx...x..c
+ c..xx$~.+.}.0..0c
c...xx$.+..6.0..c
c...~xx|x.0.6.0.c
cz....xxxx.0.6..c
@@ -1206,8 +1215,8 @@ c?yxxxx'?.xxxxx0c
c..x.xxx'xxx..y.c
c..x.'xxxxx.w...ccvvvvvvvvvvvvvvvvvvvvvvvvvvv
c..1.?'xxx.w....'c x$x|'x$x xxvvvv
-c.....xxxxx'.....c +.2x.4.+ +xxxxv
-c.y..xxx.x?x.....c +...x..+ +??$xv
+c.....xxxxx'.....c +.2x$4.+ +xxxxv
+c.y..xxx.x?x.....c +...x..+ +??|xv
c2xxxxx.w'x?x'.+cc xx....xx x1$xxv
c...3x.w...xccc+ ?xx++xx? xxxxxv
c....x.....'c v
@@ -1238,11 +1247,11 @@ cccccccc'..c v
v c.?...xx..~.c
vxxxxx ?xx++xx? cccc'....x...W.c
vxx$1x xx....xx c++..'2x1..xw.xx.c
- vx$??+ +..x...+ c...?.xxx.xxxxx..c
- vxxxx+ +.3.x5.+ c.?...1xxxx$|.3..c
- vvvvxx x$x'|x$x c.......xx$..0...c
- vvvvvvvvvvvvvvvvvvvvvvvvvvvcc'....xx$.x.xx..c
- c??xxxx$.x|x|x..c
+ vx|??+ +..x...+ c...?.xxx.xxxxx..c
+ vxxxx+ +.3$x5.+ c.?...1xxxx$|.3..c
+ vvvvxx x$x'|x$x c.......xx$|.0...c
+ vvvvvvvvvvvvvvvvvvvvvvvvvvvcc'....xx$}x.xx..c
+ c??xxxx$|x|x|x..c
c.xx.wx|..x|xx..c
c.W...x.0x|xx.0.c
c.~..xx3.xxx.0.6c
@@ -1265,7 +1274,7 @@ SUBVAULT: C : gulch_river_chamber
: gulch_setup(_G, true)
MAP
xxxxxxxxxxccccccccccccccccccccccccccccccccccccccvvvvvvvvvv
-x....w..AxcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv|||w....v
+x....w..AxcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv|||w.||}v
x~..xWW..xcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv|$WWx..~v
x.<..xWWWxcBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCcvWWWx..<.v
x.....x..xcBBBBBBBBBBBBBBBBB'CCCCCCCCCCCCCCCCCCcv..x.....v
@@ -1298,7 +1307,7 @@ x..WW..WWWBBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCC+WWW..WW..v
x...WWWW..BBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCC+..WWWW...v
x.........BBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCC+.........v
x.........BBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCC+.........v
-x........xcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv........v
+x|.......xcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv.......|v
x$$......xcBBBBBBBBBBBBBBBBBccCCCCCCCCCCCCCCCCCcv......$$v
xxxxxxxxxxccccccccccccccccccccccccccccccccccccccvvvvvvvvvv
ENDMAP
@@ -1476,13 +1485,13 @@ vvvvvxxxxcccccccccccccccccccccccccccx..2x...vv
vcBBBBBBBBBBBBBBBBBBBBBBBBBBcx...x...xv
vvvvcBBBBBBBBBBBBBBBBBBBBBBBBBBcx'..x...xv
vxxxccBBBBBBBBBBBBBBBBBBBBBBBBBcx...x...xv
-vvvvvx...cBBBBBBBBBBBBBBBBBBBBBBBBBcx...x...xv
+vvvvvx||.cBBBBBBBBBBBBBBBBBBBBBBBBBcx...x...xv
vxxxxv...xcccBBBcccccBBBccccccccccccx..'x...xv
vx......'...'...''''cc..cw.....'...'...'''..xv
vv''...?.'.'.'.'....wc..cw....'.'.'.'.?...''vv
vx..'''...'...'.....wc..cc''''...'...'......xv
vx...v'..xccccccccccccCCCcccccCCCcccx...xxxxxv
-vx...x...xcCCCCCCCCCCCCCCCCCCCCCCCCCc...xvvvvv
+vx...x...xcCCCCCCCCCCCCCCCCCCCCCCCCCc.||xvvvvv
vx...x...xcCCCCCCCCCCCCCCCCCCCCCCCCCccxxxxv
vx...x..'xcCCCCCCCCCCCCCCCCCCCCCCCCCCcvvvvv
vx...x...xcCCCCCCCCCCCCCCCCCCCCCCCCCCcv
@@ -1494,11 +1503,11 @@ vx'..x3..xcCCCCCCCCCCCCCCCCCCCCCCCCCcvvvvv
vx...x...xcccccccccccccccccccccccccccxxxxvvvvv
vx...v..'xxxxxxxxxxxxxxxxxxxxxxxxxxxx.0.vxxxxv
vvi.....4?'.''......'??'......''.'6..1.0.$|wvv
-vv$....<.?.........W.........W...6W.0.<.0~.wvv
+vv$....<.?.........W.........W...6W.0.<.0~]wvv
vvi...5..?..vvv'??'......'??'.....6''1.0.$|wvv
vxxxxv..'vxxxxxxxxxxxxxxxxxxxxxxxxxxv'0.vxxxxv
vvvvvx.'.xvvvvvvvvvvvvvvvvvvvvvvvvvvx$~$xvvvvv
- vx.'.xv vx|.|xv
+ vx.'.xv vx|}|xv
vxi$ixv vxwwwxv
vxvvvxv vxvvvxv
vvvvvvv vvvvvvv
@@ -1639,30 +1648,30 @@ MAP
v v
vvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvv
vxxxxxxxxxxxxxxc cxxxxxxxxxxxvvvv
-vxxxi...x.'?'.xc cx.?''.x..$ vvvv
+vxxxi...x.'?'.xc cx<?''.x..$ vvvv
vxxxi.y.x......c c....5.x.z.$vvvv
vxxi.yy.+...3..+ +...3..@.zz. xvv
vxxi....+..2.1.+ +..1.2.@.....xxv
vxi.....x......c c......x......xv
vxi....'x.''?.xc cx.'?'.x'.....xv
-vx....2xcccccccc ccccccccx.....vv
-vx....'x x'....xv
+vx....2xcccccccc ccccccccx....$vv
vx....'x x'...$xv
-vx....1x x.6..$xv
+vx....'x x'... xv
+vx....1x x.6..}xv
vxx~...x x0.0~xxv
vxA....x x00.. xv
vx<....x x00.. xv
vxx~...x x0.0~xxv
-vx....1x x.6..$xv
+vx....1x x.6..]xv
+vx....'x x'... xv
vx....'x x'...$xv
-vx....'x x'....xv
-vx....2xcccccccc ccccccccx.....vv
+vx....2xcccccccc ccccccccx....$vv
vxi....'x.'?'.xc cx.?''.x'.....xv
vxi.....x......c c......x......xv
vxxi....+..2.1.+ +..1.2.&.....xxv
vxxi.zz.+...3..+ +...3..&.yy. xvv
vxxxi.z.x......c c....5.x.y.$vvvv
-vxxxi...x.''?.xc cx.'?'.x..$ vvvv
+vxxxi...x.''?.xc cx<'?'.x..$ vvvv
vxxxxxxxxxxxxxxc cxxxxxxxxxxxvvvv
vvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvv
v v
@@ -1697,9 +1706,9 @@ vxx...xc cx....xv
vxi...xxxx+++xxc cccccccccx....xv
vxi...xxx.....xc cvxxxxxxxv...0xv
vxx......1....xc cx~$ $y...y..0xv
-vxx.....z.2.z.xc cx$ $$.y.y..0.xv
-vxx.?.........xc cx $ ...y..6..xv
-vxi'.'....z.1.xc cx$$......0..6vv
+vxx.....z.2.z.xc cx$}$$.y.y..0.xv
+vxx.?...... ..xc cx $ ...y..6..xv
+vxi'.'....z.1.xc cx$$. ....0..6vv
vx'ixxx'.1...3xc cx~ ' '.00..6vxv
vxxxxxxxxxxxxxxc cvxxxxxxxxxxvxvv
vvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvv
@@ -1719,22 +1728,22 @@ vvxxxxxxxxvxx.xc cx<xxvxxxxvvvvvv
vvx~.xx.?xxx.2xc cx..xxx?.vxxxxvv
vxx..x...xx.1.xc cx235xx...x.$vxv
vx'..++..+.?.'xc cx.?'.+..++.~ xv
-vx....xx.+'.?3xc cx.'?.+.xx...$xv
+vx....xx.+'.?3xc cx.'?.+.xx... xv
vx.....xxx....xc cx....xxx~...$xv
-vx..y..cxxx+++xc cx+++xxxc..z..xv
+vx..y..cxxx+++xc cx+++xxxc..z.$xv
vx..y.vc cv.z..xv
-vx2..1xc cx...0xv
+vx2..1xc cx}..0xv
vx...xxc cxx.60xv
vxA..iic c ++.~xv
vx~.x.ic c $x06xv
vx~.x.ic c $x06xv
vx<..iic c ++.~xv
vx...xxc cxx.60xv
-vx1..2xc cx...0xv
+vx1..2xc cx]..0xv
vx..z.vc cv.y..xv
-vx..z..cxxx+++xc cx+++xxxc..y..xv
+vx..z..cxxx+++xc cx+++xxxc..y.$xv
vx.....xxx....xc cx....xxx~...$xv
-vx'...xx.+.?'.xc cx3?.'+.xx...$xv
+vx'...xx.+.?'.xc cx3?.'+.xx... xv
vxx..++..+.'?.xc cx'.?.+..++.~ xv
vvx~.x...xx123xc cx.2.xx...x.$vxv
vvxxxxx.?xxx..xc cx5.xxx?.vxxxxvv
@@ -1753,7 +1762,7 @@ MAP
xxxxx''''''xxxxx
xxxxx''??''xxxxx
...W''????''W $.
- ....W'?x??'W$...
+ ....W'?x??'W$ ..
.....'????'.....
..z..''??''.....
.zzz.'????'.....
@@ -1776,7 +1785,7 @@ x''''''''''''''?.''''''''''''''x
.....'????'.zzz.
.....''??''..z..
.....'????'.....
- ...$W'??x?'W....
+ .. $W'??x?'W....
.$ W''????''W...
xxxxx''??''xxxxx
xxxxx''''''xxxxx
@@ -1799,8 +1808,8 @@ MAP
.'?..?'x?'...?'.'?.1..zz.'?..?'.
W.?..?x'.....'?'?.2.zzz..2?..?.W
...??.......3.'?'$.zz......??...
-..'??........$'?' ...4.....??'..
-..'??.....4... '?'$........??'..
+..'??........$'?' ..4.....??'..
+..'??.....4.. '?'$........??'..
...??......zz.$'?'.3.......??...
W.?..?2..zzz.2.?'?'.....'x?..?.W
.'?..?'.zz..1.?'.'?...'?x'?..?'.
@@ -1832,12 +1841,12 @@ MAP
.?.......?'...'?
.........?3......?'.....?.......
.....?'.z.?....1?'4.......z.z...
-xW.??..z...??...?'i.'.3?......Wx
+xW.??..z...??.. ?'i.'.3?......Wx
x.?....zz....?$' ?2$.??.???..?.x
'?'...1.....''?''????'''''?????'
'?????'''''????''?''.....1...'?'
x.?..???.??.$2? '$?....zz...'?.x
-xW......?3.'.i'?...??...z..??.Wx
+xW......?3.'.i'? ..??...z..??.Wx
...z.z.......4'?1....?.z.'?.....
.......?.....'?......3?.........
?'...'?.......?.
diff --git a/crawl-ref/source/dat/des/sprint/arena_sprint.des b/crawl-ref/source/dat/des/sprint/arena_sprint.des
index e4983ae40e..b73b82c42d 100644
--- a/crawl-ref/source/dat/des/sprint/arena_sprint.des
+++ b/crawl-ref/source/dat/des/sprint/arena_sprint.des
@@ -441,8 +441,8 @@ function arena_sprint_get_monster_set(round, boss)
lich / w:5 ancient lich / w:1 frederick",
"cyclops / stone giant / w:5 frost giant / w:5 fire giant /\
w:1 titan",
- "fire dragon / ice dragon / storm dragon / w:5 shadow dragon /\
- w:5 golden dragon / w:1 xtahua",
+ "mongrel wurm w:2 / fire dragon / ice dragon / storm dragon /\
+ shadow dragon w:4 / golden dragon w:4 / w:1 xtahua",
"yak / dream sheep / death yak / catoblepas / apis w:2",
"glowing shapeshifter",
"hell knight / w:5 necromancer / w:1 margery",
@@ -528,8 +528,8 @@ function arena_sprint_get_monster_set(round, boss)
-- Gimmicks
"neqoxec", "smoke demon", "catoblepas",
"moth of wrath / w:20 ettin", "orb spider", "undertaker",
- "chonchon", "star jelly / starcursed mass",
- "shining eye", "tormentor", "tentacled monstrosity",
+ "chonchon", "fungal shambler", "star jelly / starcursed mass",
+ "glowmurk ghast / shining eye", "tormentor", "tentacled monstrosity",
"skeletal warrior / skeletal warrior ; dart ego:atropa",
"unseen horror / shadow wraith w:15 / ghost moth",
"curse toe / w:20 deathcap / w:4 murray",
@@ -601,14 +601,15 @@ function arena_sprint_get_monster_set(round, boss)
"profane servitor w:25 / angel / daeva / fravashi w:5 /\
cherub / seraph",
-- Gimmicks
- "undertaker", "chonchon", "star jelly / starcursed mass",
+ "undertaker", "chonchon", "sewage sovereign",
+ "star jelly / starcursed mass",
"moth of wrath / w:20 ettin", "orb spider", "nekomata",
- "shining eye", "tormentor",
+ "radroach / shining eye", "tormentor",
"unseen horror / shadow wraith / ghost moth",
"reaper / sin beast / geryon w:1",
"spriggan berserker ; war axe ego:antimagic . animal skin /\
- void ooze / cognitogaunt w:5 / ghost moth /\
- demonspawn warmonger w:5",
+ roaming slugefish w:5 / void ooze / cognitogaunt w:5 /\
+ ghost moth / demonspawn warmonger w:5",
"glass eye w:5 / tentacled monstrosity",
"executioner / w:1 ignacio / w:5 death drake",
"ghost moth / moth of wrath / sun moth",
@@ -630,7 +631,7 @@ function arena_sprint_get_monster_set(round, boss)
-- Blade, Forest, Crypt, Pan, Tomb, Hell
"ironbound thunderhulk / vault warden w:3 / deep elf master archer w:3 /\
titan w:15 / golden dragon w:20 / glowing shapeshifter hd:20 /\
- undying armoury / ancient lich w:15",
+ undying armoury / scrapshell chimera w:3 / ancient lich w:15",
"orc warlord w:25 / juggernaut w:5 / orc high priest w:15 /\
moth of wrath w:5 / undying armoury w:5",
"deep elf high priest / deep elf elementalist / thermic dynamo /\
@@ -684,10 +685,9 @@ function arena_sprint_get_monster_set(round, boss)
"cacodemon", "sun moth", "catoblepas / iron golem w:5",
"moth of wrath / w:20 juggernaut", "orb spider", "apocalypse crab",
"guardian sphinx / walking divine tome", "tormentor",
- "unseen horror / shadow wraith / ghost moth w:15",
"reaper / sin beast / geryon w:1",
"ghost moth / cognitogaunt / demonspawn warmonger",
- "glass eye w:5 / tentacled monstrosity",
+ "glass eye w:5 / six-headed slymdra",
"executioner / w:1 ignacio / w:5 death drake",
-- Just die already!
"daeva", "demonspawn corrupter",
diff --git a/crawl-ref/source/dat/des/sprint/pitsprint.des b/crawl-ref/source/dat/des/sprint/pitsprint.des
index c0f0211089..3af8c3ac1e 100644
--- a/crawl-ref/source/dat/des/sprint/pitsprint.des
+++ b/crawl-ref/source/dat/des/sprint/pitsprint.des
@@ -68,8 +68,9 @@ function base_monster_setup(e)
place:Crypt:1 draugr / large abomination / cognitogaunt /\
anaconda simulacrum / alligator simulacrum / death knight /\
eidolon / flayed ghost / phantasmal warrior / vampire knight /\
- vampire mage / starcursed mass / demonic crawler / neqoxec /\
- sixfirhy / sun demon / rust devil / shadow demon /\
+ vampire mage / mongrel wurm / rusted inspector /\
+ roaming sludgefish / starcursed mass / demonic crawler /\
+ neqoxec / sixfirhy / sun demon / rust devil / shadow demon /\
hell hog band w:5 / sin beast / death scarab / minotaur")
e.kmons("E = orc warlord / yaktaur captain band w:5 / vault warden /\
ironbound mechanist / ironbound thunderhulk /\
@@ -82,7 +83,8 @@ function base_monster_setup(e)
deep elf elementalist / shadow dragon /\
deep elf blademaster w:5 / deep elf master archer w:5 /\
spriggan air mage / spriggan berserker /\
- spriggan defender / chonchon band / colossal amoeba /\
+ spriggan defender / chonchon band / fungal shambler /\
+ telencephalon w:2 / colossal amoeba /\
star jelly / morphogenic ooze / glass eye /\
walking divine tome / walking earthen tome / nagaraja /\
salamander tyrant / guardian serpent / shock serpent w:5 /\
@@ -96,11 +98,12 @@ function base_monster_setup(e)
searing wretch / imperial myrmidon / halazid warlock")
e.kmons("F = storm dragon w:12 / shadow dragon / golden dragon w:12 /\
iron dragon / quicksilver dragon w:15 / wyrmhole / spark wasp /\
- tengu reaver / juggernaut / titan / lich /\
- tentacled monstrosity / undying armoury w:5 /\
- deep elf blademaster / deep elf master archer /\
- walking frostbound tome / walking crystal tome / acid blob /\
- rockslime / slymdra band / moth of wrath w:15 / ghost moth /\
+ tengu reaver / juggernaut / titan / sewage sovereign band /\
+ scrapshell chimera / lich / tentacled monstrosity /\
+ undying armoury w:5 / deep elf blademaster /\
+ deep elf master archer / walking frostbound tome /\
+ walking crystal tome / acid blob / rockslime / slymdra band /\
+ moth of wrath w:15 / ghost moth /\
killer klown / draconian monk w:4 / draconian stormcaller w:7 /\
draconian scorcher w:7 / draconian annihilator w:7 /\
draconian knight w:7 / alderking / vampire bloodprince /\
diff --git a/crawl-ref/source/dat/des/sprint/zigsprint.des b/crawl-ref/source/dat/des/sprint/zigsprint.des
index 47eeecde71..54a053b12a 100644
--- a/crawl-ref/source/dat/des/sprint/zigsprint.des
+++ b/crawl-ref/source/dat/des/sprint/zigsprint.des
@@ -385,8 +385,8 @@ function choose_mset_3(e)
-- Dragon
elseif rnd < 81 then
e.kmons("1 = swamp drake / rime drake / acid dragon / steam dragon /\
- death drake / swamp dragon / fire dragon / ice dragon / wyvern /\
- hydra")
+ death drake w:5 / swamp dragon / fire dragon /\
+ ice dragon / wyvern / hydra / mongrel wurm w:5")
-- Ranged
elseif rnd < 83 then
e.kmons("1 = centaur / yaktaur / cyclops / centaur warrior w:6 /\
@@ -457,7 +457,8 @@ local rnd = crawl.random2(142)
-- Lair
elseif rnd < 19 then
e.kmons("1 = caustic shrike / hellephant / spriggan druid / skyshark /\
- torpor snail / hydra / catoblepas / dire elephant")
+ torpor snail / hydra / catoblepas / dire elephant /\
+ sewage sovereign w:5")
-- Spider
elseif rnd < 26 then
e.kmons("1 = place:Spider:$ w:70 / ghost moth w:5 / broodmother /\
@@ -475,7 +476,7 @@ local rnd = crawl.random2(142)
-- "Forest"
elseif rnd < 47 then
e.kmons("1 = caustic shrike / dire elephant / thorn hunter / eleionoma /\
- satyr / alderking w:3 / spriggan defender /\
+ satyr / fungal shambler w:3 / alderking w:3 / spriggan defender /\
spriggan air mage / spriggan druid w:3 / spriggan berserker")
-- Shoals
elseif rnd < 52 then
@@ -525,9 +526,9 @@ local rnd = crawl.random2(142)
-- Dragon
elseif rnd < 90 then
e.kmons("1 = swamp drake / rime drake / acid dragon / steam dragon /\
- death drake / swamp dragon / fire dragon / ice dragon /\
- shadow dragon / iron dragon / quicksilver dragon /\
- golden dragon / wyrmhole / wyvern / hydra")
+ death drake / swamp dragon / fire dragon / ice dragon /\
+ shadow dragon / iron dragon / quicksilver dragon /\
+ golden dragon / wyrmhole / wyvern / hydra / mongrel wurm")
-- Ranged
elseif rnd < 93 then
e.kmons("1 = Vashnia, centaur / yaktaur / cyclops / centaur warrior /\
diff --git a/crawl-ref/source/dat/des/variable/mini_monsters.des b/crawl-ref/source/dat/des/variable/mini_monsters.des
index 241976ebd7..33724c40d2 100644
--- a/crawl-ref/source/dat/des/variable/mini_monsters.des
+++ b/crawl-ref/source/dat/des/variable/mini_monsters.des
@@ -9623,12 +9623,12 @@ DEPTH: D:13-, Elf
WEIGHT: 3
ITEM: damnation no_pickup
: if you.in_branch("Elf") then
-MONS: deep elf sorcerer / deep elf high priest, hellion
+MONS: deep elf sorcerer / deep elf high priest, deep elf master archer
KFEAT: a = iron_grate
-NSUBST: D = 2=2 / 1.
+NSUBST: D = 1:2 / * = 1.
: else -- D:13-
MONS: efreet, hellion
-NSUBST: D = 2 / 1..
+NSUBST: D = 1:2 / * = 1..
SUBST: a = c
: end
SUBST: b = bc, c : cv
diff --git a/crawl-ref/source/dat/descript/features.txt b/crawl-ref/source/dat/descript/features.txt
index a8d4545d97..f56461dba2 100644
--- a/crawl-ref/source/dat/descript/features.txt
+++ b/crawl-ref/source/dat/descript/features.txt
@@ -485,6 +485,16 @@ A dense carpet of colourful mould, rustling with fecundity. The towering fungi
which sprout from it can grow back in the blink of an eye, no matter how many
times they are cut down.
%%%%
+a purified mutation catalyst
+
+An experimental arcane still, brewing some incomplete- if refined- mutagenic
+serum. Breaking this open will bathe you in mystic mists, imparting upon you one
+beneficial mutation (excluding those that could restrict equipment slots).
+%%%%
+an empty mutation catalyst
+
+A complex arcane still, cracked open and fully emptied of its contents.
+%%%%
########################################################################
### Branch entrances and exits
########################################################################
diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt
index 6644a33b53..51e09148a7 100644
--- a/crawl-ref/source/dat/descript/items.txt
+++ b/crawl-ref/source/dat/descript/items.txt
@@ -892,9 +892,9 @@ and the flame which burns away impurity.
%%%%
javelin
-A lightweight spear, designed for throwing. It will pass through the targets it
-hits, potentially hitting all targets in its path until it reaches maximum
-range.
+A lightweight penetrating spear, designed for throwing. It will pass through the
+targets it hits, potentially hitting all targets in its path until it reaches
+maximum range.
{{
if you.race() == "Kobold" or you.race() == "Spriggan" then
return "Unfortunately, it is too long and awkward for you to use."
diff --git a/crawl-ref/source/dat/descript/skills.txt b/crawl-ref/source/dat/descript/skills.txt
index eef3e0794a..c038b39a20 100644
--- a/crawl-ref/source/dat/descript/skills.txt
+++ b/crawl-ref/source/dat/descript/skills.txt
@@ -101,9 +101,9 @@ distracted or helpless creature, as well as the amount of extra damage dealt.
%%%%
Shields
-A high Shields skill helps you block melee attacks or projectiles (both magical
-and non-magical) with your equipped shield, and reduces their penalty to your
-evasion, attack speed and spellcasting success.
+A high Shields skill helps you block melee attacks or non-penetrating
+projectiles (both magical and non-magical) with your equipped shield, and
+reduces their penalty to your evasion, attack speed and spellcasting success.
%%%%
Unarmed Combat
diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt
index 8204000529..937a33dfa8 100644
--- a/crawl-ref/source/dat/descript/spells.txt
+++ b/crawl-ref/source/dat/descript/spells.txt
@@ -183,8 +183,8 @@ spell power.
%%%%
Blinkbolt spell
-Transforms the caster into a lightning bolt, and translocates the caster to
-the bolt's destination.
+Transforms the caster into a penetrating lightning bolt, and translocates the
+caster to the bolt's destination.
%%%%
Bolt of Antimagic spell
@@ -197,7 +197,8 @@ Fires a penetrating bolt of frost.
%%%%
Bolt of Devastation spell
-Fires a bolt of grief and heartache that cuts its victims' willpower in half.
+Fires a penetrating bolt of grief and heartache that cuts its victims'
+willpower in half.
%%%%
Bolt of Draining spell
@@ -210,13 +211,13 @@ Fires a penetrating bolt of flames.
%%%%
Bolt of Flesh spell
-Fires a barrage of conjured flesh, which will briefly remain as a pile on the
-ground at the end of its path.
+Fires a penetrating barrage of conjured flesh, which will briefly remain as a
+pile on the ground at the end of its path.
%%%%
Bolt of Light spell
-Fires a ray of searing light, which may blind any living, demonic, or holy
-creature it strikes.
+Fires a pentrating ray of searing light, which may blind any living, demonic,
+or holy creature it strikes.
%%%%
Bolt of Magma spell
@@ -594,7 +595,7 @@ will not avoid what fate has in store for you.
%%%%
Doom Bolt spell
-Fires a bolt of accursed malice which inflicts Doom.
+Fires a penetrating bolt of accursed malice which inflicts Doom.
%%%%
Oblivion Howl spell
@@ -637,7 +638,7 @@ Recalls woodland creatures from elsewhere on the same level.
%%%%
Electrical Bolt spell
-Throws a bolt of electricity at the target, with high accuracy.
+Throws a penetrating bolt of electricity at the target, with high accuracy.
%%%%
Enfeeble spell
@@ -1214,8 +1215,8 @@ Beckons the target forward, attempting to place them adjacent to the caster.
%%%%
Lightning Bolt spell
-Fires a mighty bolt of lightning. Its damage bypasses half of defenders'
-armour, and it can be bounced off walls to hit targets twice.
+Fires a mighty penetrating bolt of lightning. Its damage bypasses half of
+defenders' armour, and it can be bounced off walls to hit targets twice.
%%%%
Magic Dart spell
@@ -1666,8 +1667,8 @@ put to rest for good.
%%%%
Quicksilver Bolt spell
-Fires a bolt of dispelling energy at a targeted creature, possibly removing
-some of its enchantments.
+Fires a penetrating bolt of dispelling energy at a targeted creature, possibly
+removing some of its enchantments.
%%%%
Ravenous Swarm spell
@@ -2318,7 +2319,7 @@ aversion to drinking potions.
%%%%
Thunderbolt spell
-Creates an arc of electricity.
+Creates a penetrating arc of electricity.
%%%%
Trog's Hand spell
diff --git a/crawl-ref/source/dat/dlua/vault.lua b/crawl-ref/source/dat/dlua/vault.lua
index 141584e465..ea807becd8 100644
--- a/crawl-ref/source/dat/dlua/vault.lua
+++ b/crawl-ref/source/dat/dlua/vault.lua
@@ -329,7 +329,8 @@ function decorative_floor (e, glyph, type)
["skull pike"] = {"lightgrey", "dngn_skull_pike"},
["mop and bucket"] = {"lightblue", "dngn_mop"},
["bloodied mop and bucket"] = {"lightred", "dngn_mop_bloody"},
- ["weapon-inlaid floor"] = {"lightgrey", "floor_blade"}
+ ["weapon-inlaid floor"] = {"lightgrey", "floor_blade"},
+ ["empty mutation catalyst"] = {"blue", "dngn_empty_mutation_catalyst"}
}
for name, contents in pairs(dec) do
diff --git a/crawl-ref/source/dat/dlua/ziggurat.lua b/crawl-ref/source/dat/dlua/ziggurat.lua
index a88bff3ecb..a39fd0cf5a 100644
--- a/crawl-ref/source/dat/dlua/ziggurat.lua
+++ b/crawl-ref/source/dat/dlua/ziggurat.lua
@@ -655,14 +655,19 @@ local function ziggurat_create_loot_at(c)
-- dgn.good_scrolls is a list of items with total weight 1000
local good_loot = dgn.item_spec("* no_pickup w:7000 /" ..
dgn.good_scrolls)
+
+ -- Potions of experience can still do something in the first Zig, but will do
+ -- very little afterwards. As such, the weight shifts over to more potions of
+ -- mutation when doing multiple zigs.
+ local xpw = math.max(10, 190 - you.zigs_completed() * 30)
+ local mtw = math.min(470, 290 + you.zigs_completed() * 30)
local super_loot = dgn.item_spec("| no_pickup w:7000 /" ..
- "potion of experience no_pickup w:190 q:1 /" ..
- "potion of mutation no_pickup w:290 /" ..
- "potion of cancellation q:5 no_pickup / " ..
- "potion of heal wounds q:5 no_pickup / " ..
- "potion of magic q:5 no_pickup / " ..
- "potion of haste q:5 no_pickup / " ..
- dgn.good_scrolls)
+ "potion of experience no_pickup q:1 w: " .. xpw .. " / " ..
+ "potion of mutation no_pickup w:" .. mtw .. " / " ..
+ "potion of cancellation q:5 no_pickup / " ..
+ "potion of heal wounds q:5 no_pickup / " ..
+ "potion of magic q:5 no_pickup / " ..
+ "potion of haste q:5 no_pickup / " .. dgn.good_scrolls)
local loot_spots = find_free_space(nloot * 4)
diff --git a/crawl-ref/source/dat/mons/manticore.yaml b/crawl-ref/source/dat/mons/manticore.yaml
index f3ca25fbbd..3cc24d59b0 100644
--- a/crawl-ref/source/dat/mons/manticore.yaml
+++ b/crawl-ref/source/dat/mons/manticore.yaml
@@ -15,4 +15,4 @@ spells: manticore
has_corpse: true
intelligence: animal
size: large
-shape: quadruped
+shape: quadruped_winged
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc
index f3e6b97a76..40836ff619 100644
--- a/crawl-ref/source/describe.cc
+++ b/crawl-ref/source/describe.cc
@@ -3106,6 +3106,8 @@ static string _feat_action_desc(const vector<command_type>& actions,
// XX disable for p...
[truncated message content] |
|
From: <gi...@cr...> - 2026-04-30 18:05:19
|
at 62fa7c82172556eac5f1ec1dc64006231a0b2329 (commit)
-----------------------------------------------------------------------
commit 62fa7c82172556eac5f1ec1dc64006231a0b2329
Author: hellmonk <nld...@gm...>
Date: Thu Apr 30 12:58:07 2026 -0500
Make revivification inflict doom
Rather than permanently lowering max hp, inflict a very large amount of doom.
This doom is not stepped down like normal doom applications and is guaranteed
to apply a bane outright until power is very high, plus residual doom on top
in most cases. There was some discussion about doing this a while back because
players dislike the feeling of permanent max hp reduction.
-----------------------------------------------------------------------
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-29 19:55:12
|
via 87192ef88b6596bc424918ba7841f8587dd5e853 (commit)
from 9da0311f7af15b274a3c0e8f5ee82e02f985ad8a (commit)
-----------------------------------------------------------------------
commit 87192ef88b6596bc424918ba7841f8587dd5e853
Author: CrawlOdds <cra...@gm...>
Date: Wed Apr 29 20:51:55 2026 +0100
Make LRD hit plasmodia (#5231)
LRD cast directly at a creeping plasmodium was not hurting it. This was
because the logic for LRD explosions was "don't affect the centre unless
exploding terrain with a non-solid tile".
We change the logic to "don't affect the centre when exploding a
monster", which should be correct in all cases.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/mon-cast.cc | 4 +---
crawl-ref/source/spl-damage.cc | 27 ++++++++-------------------
crawl-ref/source/spl-damage.h | 2 +-
crawl-ref/source/target.cc | 6 ++----
4 files changed, 12 insertions(+), 27 deletions(-)
diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc
index 49d739f9dd..74c17335de 100644
--- a/crawl-ref/source/mon-cast.cc
+++ b/crawl-ref/source/mon-cast.cc
@@ -6330,14 +6330,12 @@ static coord_def _mons_fragment_target(const monster &mon)
int maxpower = 0;
for (distance_iterator di(mons->pos(), true, true, range); di; ++di)
{
- bool temp;
-
if (!cell_see_cell(mons->pos(), *di, LOS_NO_TRANS))
continue;
bolt beam;
const char *what = nullptr;
- if (!setup_fragmentation_beam(beam, pow, mons, *di, true, &what, temp))
+ if (!setup_fragmentation_beam(beam, pow, mons, *di, true, &what))
continue;
beam.range = range;
diff --git a/crawl-ref/source/spl-damage.cc b/crawl-ref/source/spl-damage.cc
index aadcd9cd99..e658d11abe 100644
--- a/crawl-ref/source/spl-damage.cc
+++ b/crawl-ref/source/spl-damage.cc
@@ -1212,7 +1212,6 @@ struct frag_effect
string name;
const char* terrain_name;
bool direct;
- bool hit_centre;
};
// Initializes the provided frag_effect with the appropriate Lee's Rapid
@@ -1414,9 +1413,6 @@ static bool _init_frag_grid(frag_effect &effect,
if (what)
*what = frag.what;
- if (!feat_is_solid(grid))
- effect.hit_centre = true; // to hit monsters standing on doors
-
// If it was recoloured, use that colour instead.
if (env.grid_colours(target))
effect.colour = env.grid_colours(target);
@@ -1452,7 +1448,7 @@ static bool _init_frag_effect(frag_effect &effect, const actor &caster,
bool setup_fragmentation_beam(bolt &beam, int pow, const actor *caster,
const coord_def target, bool quiet,
- const char **what, bool &hole)
+ const char **what)
{
beam.glyph = dchar_glyph(DCHAR_FIRED_BURST);
beam.source_id = caster->mid;
@@ -1500,9 +1496,6 @@ bool setup_fragmentation_beam(bolt &beam, int pow, const actor *caster,
break;
}
- if (effect.hit_centre)
- hole = false;
-
beam.source_name = caster->name(DESC_PLAIN, true);
beam.target = target;
@@ -1512,23 +1505,17 @@ bool setup_fragmentation_beam(bolt &beam, int pow, const actor *caster,
spret cast_fragmentation(int pow, const actor *caster,
const coord_def target, bool fail)
{
- bool hole = true;
const char *what = nullptr;
bolt beam;
- if (!setup_fragmentation_beam(beam, pow, caster, target, false, &what,
- hole))
- {
+ if (!setup_fragmentation_beam(beam, pow, caster, target, false, &what))
return spret::abort;
- }
if (caster->is_player())
{
bolt tempbeam;
- bool temp;
- setup_fragmentation_beam(tempbeam, pow, caster, target, true, nullptr,
- temp);
+ setup_fragmentation_beam(tempbeam, pow, caster, target, true, nullptr);
player_beam_tracer tracer;
tempbeam.explode(tracer, false);
if (cancel_beam_prompt(tempbeam, tracer))
@@ -1536,8 +1523,8 @@ spret cast_fragmentation(int pow, const actor *caster,
}
fail_check();
-
- if (what != nullptr) // Terrain explodes.
+ bool is_terrain = what != nullptr;
+ if (is_terrain)
{
if (you.see_cell(target))
mprf("The %s shatters!", what);
@@ -1576,7 +1563,9 @@ spret cast_fragmentation(int pow, const actor *caster,
mon->hurt(caster, dam, BEAM_MINDBURST);
}
- beam.explode(true, hole);
+ // The explosion has a hole if it was a monster or the player which
+ // exploded, to prevent hitting them twice.
+ beam.explode(true, !is_terrain);
return spret::success;
}
diff --git a/crawl-ref/source/spl-damage.h b/crawl-ref/source/spl-damage.h
index 6c20760bba..8db9e2cea9 100644
--- a/crawl-ref/source/spl-damage.h
+++ b/crawl-ref/source/spl-damage.h
@@ -88,7 +88,7 @@ dice_def base_fragmentation_damage(int pow, bool random);
bool monster_type_is_fraggable(monster_type mc);
bool setup_fragmentation_beam(bolt &beam, int pow, const actor *caster,
const coord_def target, bool quiet,
- const char **what, bool &hole);
+ const char **what);
spret cast_fragmentation(int powc, const actor *caster,
const coord_def target, bool fail);
spret cast_polar_vortex(int powc, bool fail, bool no_prompt = false);
diff --git a/crawl-ref/source/target.cc b/crawl-ref/source/target.cc
index 11ccf46028..8e46cad0d2 100644
--- a/crawl-ref/source/target.cc
+++ b/crawl-ref/source/target.cc
@@ -926,8 +926,7 @@ bool targeter_fragment::valid_aim(coord_def a)
return false;
bolt tempbeam;
- bool temp;
- if (!setup_fragmentation_beam(tempbeam, pow, agent, a, true, nullptr, temp))
+ if (!setup_fragmentation_beam(tempbeam, pow, agent, a, true, nullptr))
return notify_fail("You cannot affect that.");
return true;
}
@@ -938,9 +937,8 @@ bool targeter_fragment::set_aim(coord_def a)
return false;
bolt tempbeam;
- bool temp;
- if (setup_fragmentation_beam(tempbeam, pow, agent, a, true, nullptr, temp))
+ if (setup_fragmentation_beam(tempbeam, pow, agent, a, true, nullptr))
{
exp_range_min = tempbeam.ex_size;
exp_range_max = tempbeam.ex_size;
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 18:10:19
|
via 9da0311f7af15b274a3c0e8f5ee82e02f985ad8a (commit)
from 92c20a70a4ea23510ed26bae67af06950abec0c3 (commit)
-----------------------------------------------------------------------
commit 9da0311f7af15b274a3c0e8f5ee82e02f985ad8a
Author: hellmonk <nld...@gm...>
Date: Tue Apr 28 13:08:04 2026 -0500
Improve obsidian axe description (thewilsonator)
Be explicit that it causes mesmerisation and that clarity doesn't stop it.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/dat/descript/unrand.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/crawl-ref/source/dat/descript/unrand.txt b/crawl-ref/source/dat/descript/unrand.txt
index e25de09b14..c300a11eed 100644
--- a/crawl-ref/source/dat/descript/unrand.txt
+++ b/crawl-ref/source/dat/descript/unrand.txt
@@ -490,7 +490,8 @@ obsidian axe
An axe with a powerful curse placed on it by one of the lords of Pandemonium,
so that unsuspecting adventurers would unleash demons into this world. Beware,
-for it has ways of taking its wielder under its command...
+for it has ways of mesmerising its wielder, no matter how clear and focused
+their mind...
%%%%
consecrated labrys
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 18:00:24
|
at 8c1192f5f9b08ced477a45f729b60673932df925 (commit)
-----------------------------------------------------------------------
commit 8c1192f5f9b08ced477a45f729b60673932df925
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 14:15:21 2026 -0500
file tracking
commit cb46de9102f9b1a02c77148688900dbe85ad075c
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 14:09:54 2026 -0500
vaults and bugfixes
commit c22fa8430ee8465858b1df63d55a270d5145505e
Author: hellmonk <nld...@gm...>
Date: Mon Apr 6 16:08:24 2026 -0500
rubble golems
commit fd2901de83e08e41307fa10343b5c50244a59e2e
Author: hellmonk <nld...@gm...>
Date: Mon Apr 6 15:00:02 2026 -0500
forge servants
commit 5eb2d405bd739eb409c2b443c65e9273c112ed44
Author: hellmonk <nld...@gm...>
Date: Mon Apr 6 14:08:24 2026 -0500
glow worms
commit 196050d00679b544bc2e9b3fd44c565d985dc79c
Author: hellmonk <nld...@gm...>
Date: Mon Apr 6 13:37:45 2026 -0500
cursed embers
commit 62d3a77ad3e2ac434879eddfe2147cc393f34ce4
Author: hellmonk <nld...@gm...>
Date: Fri Apr 3 13:09:59 2026 -0500
soul forges
commit 30d78b0c407d6f2d706e208249d16cd4f50a7f4b
Author: hellmonk <nld...@gm...>
Date: Wed Apr 1 14:42:35 2026 -0500
armour forges
commit 74fa773dae45bae3c33f340b28127e7b53472c62
Author: hellmonk <nld...@gm...>
Date: Sun Mar 29 16:41:32 2026 -0500
weapon forges
commit a61c63c9fa21fc79db786ac1f4f7a646f5b8076e
Author: hellmonk <nld...@gm...>
Date: Fri Mar 27 13:24:17 2026 -0500
body forges
commit 5beff0547f5599b0dfabcf0fba56c2fd43eb82be
Author: hellmonk <nld...@gm...>
Date: Thu Mar 19 13:55:20 2026 -0500
Rust mites
Reusing the old giant mite tile, these are af_corrode monsters for an early portal.
commit 7c52200ffdb8ae3de48a564969b770b54cd0c2c3
Author: hellmonk <nld...@gm...>
Date: Mon Mar 16 22:28:35 2026 -0500
New weapon brand: Lightweight
This brand does not generate naturally and is intended to be used as a reward
in early vaults and portals. It generates only on slow (1.7 base delay or
greater) weapons and reduces their base delay by 0.4. This also reduces the
skill requirement for mindelay by 8 - quite a lot - at the expense of not
allowing a normal brand. Such a weapon could be useful as a low skill budget
option for some section of the early game, and could be rebranded later on
if continued skill investment is desirable.
-----------------------------------------------------------------------
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 17:50:09
|
at 24e4ae65b424d6f867a668beb9a57f25d10b3af8 (commit)
-----------------------------------------------------------------------
commit 24e4ae65b424d6f867a668beb9a57f25d10b3af8
Author: hellmonk <nld...@gm...>
Date: Tue Apr 28 12:47:55 2026 -0500
Wooden Wasps
An earlyish nonliving monster for future vault use. Weaker than a hornet in
every stat based metric, but flows through trees and casts sting.
-----------------------------------------------------------------------
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 05:00:15
|
via 92c20a70a4ea23510ed26bae67af06950abec0c3 (commit)
via f8c7cb33e8360837c8225bf4a5da57eb73cde473 (commit)
via 4261a0d8d4b4f3b5eb71af49d859186f35490a6c (commit)
via 4b21d4082cf16e7ee7616fd8bf3572143c9b4e70 (commit)
via c8e75114e27c2d4e3a14dd7b09cbf44d0bfc147c (commit)
via a2d44b8edc889c4c761d0518eafd37d80d6134dc (commit)
via 104ff16173ea076a823477b7ed4189aff16598cd (commit)
via 9c7bc4540e572598bccb54c68554d1333727d08f (commit)
via 8d6a9885904e3a3863f3eb2eec183d8bd8808577 (commit)
via 707f3ec179abc32ad7ecc3ed64a3c74c64858186 (commit)
via 9143438c7e2b349655b504b041fd2cca8688289f (commit)
via bb42b9d0493db19f1636027dadaba276dc59479d (commit)
from 60e9dc374779597be3a1f43f0eb6710d0b4c161a (commit)
-----------------------------------------------------------------------
commit 92c20a70a4ea23510ed26bae67af06950abec0c3
Author: regret-index <clo...@ho...>
Date: Mon Apr 13 22:02:41 2026 -0230
Add Gulch set-up functions, entries, layouts, and subvaults
This initial outing has six entry vaults each with different monsters,
and six layouts with four to seven subvaults arranged for each (for a
total of 31 subvaults, which should serve for initial testing variety
even if it'll need another few layouts before version release). Most
layouts focus on somewhat V-like corridors and chambers with rivers and
pools of scrap and mould and water, with some loose distribution of
pre-broken doors to help out the slice of monsters that otherwise can't
open them (though a surprising number already can).
Various notes beyond just implementation details:
* There's a theme function used both in individual segments and
layout connections alike, which by default uses a split of:
* A 60% chance for mould patches and regular fungi both, alongside
a sewage sovereign duo boss: the most distinct terrain and the
least weird boss with a natural theme pairing together both.
* A 30% chance for stacks of scrap alongside a scrapshell chimera
boss: less common due to being less distinct than mould patches,
but an easy way to show garbage in a non-gross capacity and to still
be fairly distinct from most branches.
* A 10% chance for shallow and deep water alongside a colossal amoeba
or few-headed slymdra boss: a rare chance to tutorialize the both of
these outside of the major pressures of the Slime Pits as players
have been slow to learn, while both almost always show up as lethal
threats, and with less stair restrictions than said branch.
* With the various encasing subvaults most of these Gulch layouts use,
this allows a reasonable chance of recognizably interweaving each of
these differing terrain features and firewood in differing segments.
As terrain theme set-up, they're used even in vaults not containing
the bosses themselves.
* Alongside the seven monsters implemented in previous commits, these
layouts have a few guests, in a mix of variety and trying to broaden
the branch beyond just the small number of monster made for it
* A small amount of alligators, anacondas, tyrant leeches, crawling
flesh cages, or hyper-rare slime creatures: mostly harmless fodder
to show non-mutated animals as well as mutated ones.
* Extremely rare formless jellyfish, great orb of eyes, glowing orange
brain, and torpor snail guests: the last of these passably fits the
animal debuff portal themes and can work all game long, while the
others help retroactively justify their presence in the increasingly
orderly confines of V.
* A 20% chance for several different layouts to pair thematically
suiting Gulch monsters with one of dragon draugr, radroaches,
ironbound mechanists, or deathcap ambushes- two guest monsters
directly from V, the previous mutant animals, and a monster that
is neat to rarely show before curse toes summon them.
* The last group of these could get their own thematically-emphasized
maps in the future, but the current batch of standard generic maps
currently leaves them at a small chance to emphasize and test the
newer monsters first.
* The item rewards are heavily themed towards poison, corrosion, hexes,
and Forgecraft, with a handful of thematic rewards alongside only a few
generic high-quality items. Through the inherent balancing factor of
using item groups that can roll matching or missing a midgame
character's build, they always contain:
* Two venom-branded top-tier weapons (with a small chance instead of
branded / enchanted hand cannons).
* Two of: randbooks of Alchemy / Hexes / Forgecraft paired with an
elemental school, manuals for those schools, or orbs and staves
with enchancers for the prior-mentioned schools.
* One of possibly-enchanted cloak of rPois / rCorr / boots and
bardings of flight / kite shields of rCorr / randart rPois and
rCorr and Chemistry jewellery / lighter Resonance ego armour.
* One random tier 3 or 4 talisman randart with either rPois or
rCorr as avoids interacting with the innate rPois or rCorr of
that talisman's form.
* They otherwise mostly contain gold and random other potions, with
small extra chances of potions of mutation.
* Also, to fit both the trash themes and to help out with the 5% chance
of getting smaller tutorializing slymdra, negatively-enchanted flaming
edged weapons (and likewise freezing non-edged weapons) are distributed
in piles near the start and end of each layout.
* It's been a decade since we last kept any portal todo plans in the
source code itself (with such removed from wizlab.des in 092858d), but
with the potential for quite a few other one-off rare map themes to
help provide vault variety in the fullness of time, I've left some
notes on both this and any future branch implementation (c.f. c33ae53)
at the bottom of the .des file.
commit f8c7cb33e8360837c8225bf4a5da57eb73cde473
Author: regret-index <clo...@ho...>
Date: Wed Apr 1 13:21:55 2026 -0230
New Gulch monster: scrapshell chimeras
The second, rarer boss-tier monster for Gulches crosses over a lot of
remaining themes at once, using disparate-parts mutant motifs to capture
various sewer animal associations alongside metallic experimentation to
stitch back into construct angles, mechanically getting a few last touches
of displacement and terrrain changing alongside (deliberately very
limited) contamination sources. They also experiment around with a motif
we're rarely using- summoners with exceptional resistances are mostly
exclusive to cursed body parts and mummies and uniques- alongside one
barely used at all, of summoners with significant melee capacities.
Scrapshell chimeras are mixes of insects, alligators, and snakes hiding
inside a highly-resistant, necromantically-attuned... shell of fused
scrap. (Their disparate animal-parts nature as cultivated experiments
hopefully also covers for these disparate themes.) In terms of stats,
they loosely resemble buffed golden dragons (more melee damage, additional
rF+ rC+ pips, and even more AC in exchange for zero EV) and mildly fast
swimming movement, but with rather different mechanics replacing those
breath attacks:
* They cast Murky Legion, summoning 2 glowmurk ghasts with a cap of 4.
These are variations on the drowned souls of merfolk avatars, but
with more speed and more health, and which replace doing one dying
attack of AF_DROWN damage with instead one dying normal attack that
spreads temporary shallow water for a few dozen turns (under both it
and what it hits) alongside a 66% chance to inflict ~15% contamination
(or malmutation against other monsters).
These serve as the only conventional summoners in the portal in nearly
all maps, as another deployment of water attacks to vary options beyond
Primal Wave and Waterstrike, and serve as another (very) cautious
deployment of potential mutation after the heavy reduction of permanent
sources in 0.34 (that should hopefully not be confused with the
portal-entry's temporary mutations most likely wearing off before then).
* They have passable direct melee offense with AF_DRAG plus exceptional
defenses for a summoner, nearly approaching dread liches on every
level besides EV. This should let them still be quite dangerous even
when ducking around corners and making it to the few chokepoints
Gulch layouts allow, occasionally pulling players out of such entirely
depending on their defenses.
These are intended to be somewhat rare Gulch bosses, with sewage sovereign
pairs taking up 60% of normal map bosses and Slime tutorializing guests
taking up another 10%, usually appearing alongside rusted inspectors to
make dealing with them possibly dip into other resources. Some people will
get permanent mutations from them, but it's always possible to kill their
ghasts before they get a hit in, and any summoner that can make people
sometimes care about killing the summons first is succeeding decently.
While scrapshell chimeras are exclusive to Gulch, their ghasts may also
have use in future Radiant Crater designs alongside the prior
telencephalons added for this portal.
The scrapshell tile is composited from porkchop's old alligator tile,
roctavian's edits to white_noise's giant geckos, Zmy's antique adder tile,
malwyn's antique fire crab tile, kilobyte's original generic spider tile,
a rejected phalanx beetle by LemurRobot, and the current peacekeeper tile
(not properly credited in 66c3619). The Murky Legion spell icon tile
combines Denzi's old Abjuration spell icon with ontoclasm's generic
summoning spell sigil, while the glowmurk ghast tile heavily adjusts
ontoclasm's old lorocyproca tile.
commit 4261a0d8d4b4f3b5eb71af49d859186f35490a6c
Author: DracoOmega <dra...@gm...>
Date: Sat Mar 21 06:54:54 2026 -0230
New Gulch monster: sewage sovereigns
[Committer's notes: DracoOmega implemented the Stampede spell and the
basic monster boilerplate for the monster.
These sizeable mutant pigs serve as the more common of the two unique
boss-tier monsters for Gulch, reflecting both the "musclebound hulk" type
of mutant as well as the urban legends of feral sewer swine in
Victorian-era Hampstead. Unlike the other Gulch-unique enemies mostly
focusing in on debuffs, these are deliberately somewhat simple in the same
avenue as tentacled monstrosities: they're mostly a standard melee
monster notable for their stats attached to a notable mechanic that will
get more homes over time.
Stats-wise, sewage sovereigns are amphibious nearly melee-only monsters
somewhat similiar to ghouls without undead resists and somewhat weaker
melee. Thematically, these colossal pigs have effectively become sewer
monarchs through both the luck of mutation and making it to new food
before most other present mutants. Mechanically, they justify their
somewhat low stats for a boss + said flavour position with one major
trick:
* A Stampede spell, somewhere between the 0.11 to 0.18 implementation
of boulder beetles and the Stampede effects of Gale Centaurs. This
buff spell can only be cast when a foe is lined up on the eight compass
directions, and makes them repeatedly move forward at double movespeed
with a dust cloud trail until they hit a wall or charge past their
foe's position. (This is much faster in both movement and in course
correction than the old boulder beetle behaviour, and shouldn't thus
have almost any of its old trivially-dodgeable patterns.) Those that
stand in the way of the charge automatically trampled forward as the
caster keeps charging forward, and get hit with melee attacks with
both +50% damage and increased accuracy, until they move out of the
way or the charge stops due to solid terrain / untraversible liquid.
(Much like other similiar effects like Stampede and Maxwell's Portable
Piledriver, this will also push back other allies and enemies behind
their foe.)
This is a unique experiment in displacement and monster movement alike
that should be reusable in several other (mostly centaur-themed) future
monsters that should be both intuitive and cute enough as a minigame
that still presents very lethal damage itself, as a variation on both
current boulder beetle charges and the weird behaviour of orbs of
destruction.
These will appear in duos 60% at the middle or end of all normal Gulch
layouts, using yak-style herding band behaviour to keep them together.
(Think of them as duelling kings). Their bulk in such narrowed corridors
should make them reasonably likely to Stampede all over players without
Translocations or sufficient allies, and with theme-matching company of
more mongrel wurms or fungal shamblers compared to the next boss's focus
on rusted inspectors, roaming sludgefish, telencephalon, and various guest
options. They also get to appear in ziggurat Lair floors over the small
number of extra skysharks, as the set is already screwing around a fair bit
with other most-dangerous beasts as stands. Other planned Stampede users
will mostly be in extended or uniques, so sewage sovereigns should still
reasonably stand out in three-rune games despite being otherwise somewhat
plain- if anything, lacking a debuff and presenting raw stats with a
dramatic name will hopefully help them stand out.
The sewage sovereign tile combines CanofWorms's current hog tile,
ontoclasm's jiangshi, and roctavian's rejected red devil and balrug tiles.
The Stampede spell icon combines ontoclasm's Haste spell icon and haste
potion icon, while DracoOmega made the stampede status icon from the
latter.]
commit 4b21d4082cf16e7ee7616fd8bf3572143c9b4e70
Author: DracoOmega <dra...@gm...>
Date: Sun Mar 22 18:50:13 2026 -0230
New Gulch(?) monster: telencephalon
[Committer's notes: DracoOmega implemented the unique HP-threshold
behaviour and boilerplate for this monster.
These goofy crystal-brain experiments, aside from contrasting with other
V constructs aside from crystal guardians, are future set-up for another
portal option: the Radiant Crater, a mix of crystal and space and magic
themes for D:13-15 and Orc:1-2 with a gimmick of nonliving monsters
and a clock of constantly-increasing magical contamination. As such,
these are a little aesthetically clashing with the rest of the Gulch in
being neither mutant nor scrap-metal alike, but should still function for
a very different intent as "rare monsters that wash up in this garbage
dump".
Thematically, they're a rather more arcane form of abandoned experiment,
combining crystal magic with mutant brains for unknown purposes. (The
secret lore contained in this commit message alone is that they're helmets
made for intelligence-raising purposes that worked extremely poorly.)
Mechanically, they somewhat resemble glowing orange brains as monsters
with full-LOS-affecting spells, cautious behaviour, the ability to open
doors, and no melee attacks, though with light omniresistance instead
of acid immunity, more AC, and fairly different spells:
* They have Call Down Lightning and Brain Bite but no regular attacks,
as another conjurer-support-type in these passably dense portal monster
arrangements, and to make them higher-profile targets even with
relatively lower damage numbers for their depth.
* They also have another iteration upon rakshasa and star jelly
HP-threshold behaviour with unique behaviour that ignores antimagic.
Telencephalons injured to 40% or less of their max health emit a
psychokinetic radius 3 knockback burst (akin to Wind Blast) alongside
an irresistable brief Mass Confusion effect against all hostiles.
(Much like star jellies, this then inflicts a self-debuff as a
visible cooldown timer of 50 to 65 turns afterwards before it can
activate this again.)
Aside from providing more unstable-construct flavour that further expands
psychic monster possibilities, these twin effects should reasonably
endanger ally builds when there's not a lot of explosions in the portal
otherwise, and still permit interesting counterplay to just immediately
firing penetrating missiles and bolts at such smite-attack telecephalons
instead of ducking around the corners and gateways the portal layout
provides. As stated prior, these don't show up anywhere normally other
than fairly rare Gulch spawns (though they _do_ get a Ziggurat pillar
vault placement to continue to inconvenience megazig divers), and would
work well as bosses for earlier space-themed portals.
Their tiles combine ontoclasm's edit of Denzi's randomized Pandemonium
lord brain with roctavian's arc blade tile and a public domain piece of
crystal by 7Soul1.]
commit c8e75114e27c2d4e3a14dd7b09cbf44d0bfc147c
Author: DracoOmega <dra...@gm...>
Date: Sun Mar 22 13:30:23 2026 -0230
New Gulch monster: roaming sludgefish
[Committer's notes: DracoOmega offered some help with BEAM_ANTIMAGIC
set-up, and left the rest off for me.
These psychic water-carrying fish continue to experiment around with the
associations between mental effects and antimagic, to screw around with
the ever-wide space of piscine themes without singularly forcing them to
be liquid-bound as got previous fish removed, and to provide uniquely
anti-mage + poison conjurer psychic mutant-types for Gulch all alike.
(As mobile conjurers, they also provide a twist on the projectile firing
of both electric eels and lava snakes.)
Thematically, these magic-mutant telekinetic fish still need to breathe
water and thus move around by carrying their own sewage sludge, acting
as a reverse diving bell spider seeking out prey to gather more magic.
Stat-wise, they loosely resemble kobold fleshcrafters as mages with
notable EV and decent cast rates, alongside rPois+++, cold-bloodedness,
and fast swimspeed. Mechanically, they have AF_ANTIMAGIC melee and two
different damaging spells:
* They have 3d13 Hurl Sludge, as is otherwise only used by fenstrider
witches (311c5d9). As with mongrel wurms' strong poison, these both
thematically fit the portal and experiment with additional high
rPois checks outside of poisonous clouds past the Lair branches,
while also getting in a second use of the relatively unique effect.
(As with fenstriders, sludgefish are also immune to toxic bogs,
though it barely lasts enough time to lure other monsters over it.)
* They also have a new 3d18 penetrating Bolt of Antimagic spell, using
the irresistable BEAM_ANTIMAGIC as will eventually be used anyway for
part of future weapon arts effects. This spell is not meant to be on a
lot of monsters in the future, but should provide more novelty to
MP-draining effects beyond melee attacks or the smiting effects of
Antimagic Gaze and Brain Bite, with limited range and EV checks both.
While this pair of spells isn't the flashiest of new conjurers effects,
roaming sludgefish should function as unique enough monsters between their
antimagic attacks and coming in the groups Gulch portals can easily
deploy. As with nearly all Gulch monsters, these are so specifically
flavoured that they're not intended to place elsewhere.
The roaming sludgefish's animated tiles combine Denzi's giant goldfish
with roctavian's old titanic slime creature. The Bolt of Antimagic icon
combines roctavian's Bolt of Cold icon and unused negative energy effects,
while the new vfx combines the latter with roctavian's small Ereshkigal
tiles.]
commit a2d44b8edc889c4c761d0518eafd37d80d6134dc
Author: DracoOmega <dra...@gm...>
Date: Sun Mar 22 13:03:33 2026 -0230
New Gulch monster: fungal shamblers
[Committer's notes: DracoOmega set up these monsters' attack flavours,
while I handled the rest of their set-up.
These mushroom-headed warrior-servitors cover a variety of different
roles. Within Gulches themselves, they provide a uniquely flashy
mechanical twist on the usual "generic melee-only random weapon" monsters
taken into the standard horror-parasite route. As additional fungal
monsters, they also serve as another late plant-holiness monster for
Fedhas to pacify (c.f. alderkings in 18c7c0e). They even directly connect
to a talisman form, as has grown increasingly disjoint between Crawl's
oppositional flavour and player tools with the many talisman additions of
0.33 and 0.34.
Thematically, these fungal shamblers are basically the burstshroom
equivalent of vine stalkers, as a parasitic mutant strain that took over
the bodies and equipment of intruders fed to them. (Unlike vine stalkers,
these are true plants that have completely replaced the original flesh,
since we don't have to worry about monster holiness handing out rTorment.)
Stats-wise, they somewhat resemble death knights as armoured warrior foes
(though they lack any of their draugr or spells). Mechanically, they fit
into the debuff-focused sewer-setting Gulch themes with an enemy version of
Spore Form:
* They have AF_WEAK weapon hits (including a ~31% chance to cleave or
reach!), as is otherwise only used on orange demons, and which will
noticeably impair melee characters in a portal with multiple anti-mage
monsters. By the time they're fought in a Vaults portal, most melee
characters should have Invocations, Throwing, or Evocations available
to pre-emptively avoid the debuff or finish off groups, and it's a
relatively rarer straightforward debuff we can easily afford to deploy
more often.
* They also have a second attack of a new AF_BURSTSHROOM attack flavour,
producing three burstshrooms behind whoever they hit if there's room
(i.e. no monsters, walls or water). Much like the spore form
burstshrooms, after a few turns they'll blow up for a 3x3 explosion of
3d12 damage that can't hurt allies and that has a 33% chance to daze
players (for most likely one turn). Aside from experimenting more with
being able to avoid damage zones on a delay (like e.g. the fulminant
prisms of 27c0888), this also helps them fit with other plant and
fungus-themed monsters (ballistomycetes explosions, thorn hunter cages,
curse toe summoning), and pins down players in a somewhat unique fashion
that still permits plenty of counterplay (like keeping one's back to
walls or deep water).
While these traits mean they can't be used in quite as many numbers as
deep trolls, orc knights, or vault guards get used in V, the portal is
but one floor already, so fungal shamblers should ideally serve as mildly
uncommon debuff-melee as a result (c.f. imperial myrmidons in 0950dd7).
Their fungal themes make them the only ones I'd be fine with placing
outside of Gulch or future portal vaults (e.g. foresty themes for a
lategame / late D portal or in Depths' growing fey themes itself), though
I am not explicitly placing them in other Depths vaults in this commit
for the sake of restraining the vast scope of this portal.
Their tiles combine roctavian's old orc warlord tile with a mushroom piece
from a CC0 commission released by Screen Smith Studios.]
commit 104ff16173ea076a823477b7ed4189aff16598cd
Author: regret-index <clo...@ho...>
Date: Sun Mar 29 18:07:47 2026 -0230
New Gulch monster: rusted inspectors
These glaring eye-worm constructs are meant to expand on the constructs
theme the Vaults rather mildly touch upon with ironbound mechanists and
peacekeeper bands, as a series of constructs thematically rejected for
normal Vaults patrolling and maintenance thus deployed in Gulches.
They experiment with more Gulch-standard debuffs, and provide another
variation on the insectoid subtheme Forgecraft has presented in bees and
beetles alike.
Stats-wise, these are somewhat close to death yaks with standard nonliving
resistances, more AC over EV, deconstructibility, the ability to open
doors, and ever-necessary amphibiousness. Mechanically, they continue to
pester players with differing debuffs:
* Their rust coat gives them AF_CORRODE attacks, as we're otherwise only
using on rust devils and Dispater. This should helps the metal walls
and pipes of Gulches within Vaults feel somewhat worn down (alongside
the rusted edge each metal wall tile has), and which makes their melee
reasonably intimidating for low-EV characters with a stronger brand but
far less high numbers than e.g. the comparable caustic shrikes of
Depths.
* They also cast the irresistable Diminish Magic, as is currently only
used by bes kemwar and zykzyls (via Enfeeble), as a debuff that
continues to experiment with weakening mages beyond just draining
MP, and as another means of weakening players through a notably
different mechanism than the prior melee attack brand.
They are meant to be support units more than individual threats, though
sturdier monsters ignoring resistances to inflict lesser debuffs should
play somewhat noticeably differently from the much more debilitating and
resistable debuffs shared across mages or emphasized on more organic eyes.
(If they turn out to be too ignorable, something leaning on them being
rejected for being unstable, like a remix on shock serpent discharges, may
be warranted; we'll see how this works out as a basic draft for now.) As
something deliberately made by the Vaults, they will be the only
Gulch-exclusive spawn that can spawn inside the portal entry vaults, where
they should still reasonably fit in V as a highly restricted guard
construct.
Their tiles are made from a combination of roctavian's salamander
firebrands and soldier ants alongside a CC0 fan Pokemon commissioned and
released by Screen Smith Studios.
commit 9c7bc4540e572598bccb54c68554d1333727d08f
Author: regret-index <clo...@ho...>
Date: Sat Mar 28 12:06:05 2026 -0230
New Gulch monster: mongrel wurms
These mutant natural-crossbreeds of various lesser dragons serve as loose
allusions to the many dragon-offshoots and dragon-hybrids of modern
fantasy, provides another multi-breath-weapon dragon to expand the total
identity of dragons beyond "one breath weapon + melee" while serving in an
extremely different role from golden dragons, and also iterate a little on
the presence of many lindwurms within V beyond just being the lesser
dragons packs for ironbound beastmasters. (Of the monsters being added to
Gulch here, they're the "smoothly-distorted-together chimera" variation on
mutant beasts here).
Stats-wise, they're somewhat like speed 12 amphibious lindwurms with
mild stat buffs and single levels of fire and poison resistance. As
visitors to the Vaults frequently deal with hasted lindwurms already,
they have a mechanically nasty mix of effects replacing that fire breath:
* They breathe Harpoon Shots, as a way to get swamp worm mechanics on
something thematically linked to swamp worms without explicitly being
named after a different branch, while also being rare enough as a
portal-exclusive monster to not diminish the spell's rare notability
on Harold / swamp worms / iron giants.
* They hack and cough up lobbed Scorch breath casts, as a clearly "weaker
and broken" elemental breath attack. There's very minimal other fire
resistance checks in the portal itself (other mongrel wurms and lucky
rolls from crawling flesh cages), but its mix of attributes- short
range to permit escape after being debuffed, more damaging in multiple
hits, reaching over allies- should work interestingly with something
that can repeatedly pull their foes in, while currently not being used
on non-ghost non-apostle monsters.
* They have AF_POISON_STRONG bites, as the main use of poison within
this portal, as an experimental additional notable rPois check past
the Lair branches alongside Poisonous Cloud, and as another possible
reason to fear being near close to them post-Harpoon shot.
As such, they hopefully feel appropriately like an upgrade to multiple Lair
branch monsters without singularly being any of them, in the nature of
Gulch being much close to the whole "torturous poison swamp" level motif
than Swamp itself does. As mutant drake-wurms, they count for Wyrmbane and
the dragon Ziggurat floor theme, but otherwise don't appear anywhere else,
as is the main intent for most new Gulch monsters.
Their tiles are composited from Denzi's old bone dragon tile, roctavian's
old mana viper tile + old generic spider tile + edit to Denzi's old giant
mite tile, and ontoclasm's old lava worm tile.
commit 8d6a9885904e3a3863f3eb2eec183d8bd8808577
Author: regret-index <clo...@ho...>
Date: Fri Mar 27 14:16:53 2026 -0230
New destructible "firewood": stacks of scrap
Piles of debris in 03d5c24 seem to have been a reasonably solid success in
the continued large space of firewood (destructible semi-decorative terrain
that block attacks) as both flavourful and either nearly
impossible to break or trivial but tactically-relevant to have decay. In
the same spirit of such, to help along the subtle pushing forward of
magical technology within this setting across Forgecraft and thunderhulks
and hand cannons, I'm extending this with a new decorative firewood option:
stacks of scrap.
These are further exaggerated from piles of debris in terms of being more
defensive but easier to break: these are elementally-omniresistant and
have reasonably high AC, but are otherwise easy to break with any number
of regular attacks. Tactically, this allows both players and enemies to
hurl around fire, cold, and lightning (alongside the usual poison and
negative energy) through them without actually breaking them as cover from
other attacks, letting them stand out from other types of firewood even
on non-thematic levels.
As is implied with the surrounding commits, these are used most notably
in Gulches to actually have some reasonably non-gross sewer trash present
within them, matching up with the constructs present there. They are
otherwise rarely deployed within some early goblin vaults (as a nod to
coglins), the Vaults proper (ever-thirsting for flavour + contrasting
against fleschrafter piles + a branch with constructs and coglins both),
and wizlab_maxwell (which has no explicit gimmick and therefore can do
with a little more help).
Tiles-wise, these repurpose quite a few Forgecraft monster tile sources:
Bloax's now-unused goliath beetle, ontoclasm's lightning spire and edits
of Bloax's metal wall tiles, Chrisblue's CC0 bombs, Denzi's old spear trap
and old iron golem and old shields, Coolio's deep dwarf death knight, and
roctavian's spellspark servitor, old guardian golem, and current killer
bee tiles. They also use a piece of a CC0 commission by Screen Smith
Studios that is used for one of the Gulch construct monsters in this commit
batch.
commit 707f3ec179abc32ad7ecc3ed64a3c74c64858186
Author: DracoOmega <dra...@gm...>
Date: Thu Mar 19 08:32:08 2026 -0230
New terrain feature: patches of mould
[Committer's notes: DracoOmega implemented these and wrote up their
description, but left the tiles and commit message up to me.
These experimental new features, implemented by DracoOmega after she
prepared the code for them in 7834c98, are another simple iteration on
blocking destructible "firewood" monsters as well as a means of trying out
more active features beyond the limitations of "step on a trap" or "suffer
for being on top of / next to this thing". (They also may show up in Pan
after significant layout revisions are done there.)
Mould patches automatically come with fungus on top of them, the same
firewood type seen in earlygame and Lair. Whenever their fungus is
destroyed, after 6 to 18 turns the first turn their tile isn't
occupied will have a new fungus monster spawn ontop. This is meant to
experiment with flora and firewood as something both destructible and
permanent both, while averting wandering monsters or fights always
removing them as happens after 0f5d254- it also characterizes fungi as
noticeably different from plants having all of their thematic variations
and match-ups with trees.
These features will only mostly show up in Gulch, as part of giving it
more than just more water in the portal. Patches of mould also show up
in a sparse number of Fedhas overflow altars as a means of tutorializing
their behaviour earlier than the portal, and which can continue to help
with Fedhas's vaults being a noticeable small bit of distinct thematic
variety in earlygame.
Mould patch tiles are heavily edited from CC0 overworld forest graphics
made by finalbossblues. There are two colour variations, with the default
ones being coloured after common fungus and toadstools versus all fungus
and mould in Gulch being coloured after burstshrooms, brain worms, and
radroaches. Fungi in Gulch also get two unique sets of fungus tiles to
help emphasize which fungi will respawn, both based off of a rejected
tree set by roctavian.]
commit 9143438c7e2b349655b504b041fd2cca8688289f
Author: regret-index <clo...@ho...>
Date: Thu Mar 26 12:05:11 2026 -0230
Gulch portal set-up
This new portal of a gutter Gulch is essentially meant to be a "hard mode"
Sewer placed much later than said portal's D:3-6 placement, with this
exclusively placed in Vaults:1-4. Its new feature, new firewood, new
monsters, and maps are seperated out in the following commits.
Thematically, these sewers serve as an experiment containment dumping
ground for the Vaults, as are otherwise fairly more coordinated than
other multi-theme branches in the game. Mechanically, this manifests in
debuff and mutagenic motifs: most notably, entering the portal instantly
inflicts three transient mutations. (This comes with making transient
mutations have messages for rMut resisting them, which feels like a
conspicuous absence with how rare rMut is these years.) Alongside this, 5/7
new monsters made nearly solely for this portal are mutated in differing
fashions, 4/7 are deliberate experiments, and 4/7 inflict debuffs. This
Gulch will also showcase new features and iterations on "firewood" monsters
(i.e. plants and other destructible terrain monsters) introduced in
following commits, and contain fairly less total amounts of water than the
previous Sewers, to help differentiate it more from the watery Lair branch
one has usually done before this.
This has a lot of different intended purposes:
* A new lategame portal helps provide lategame variety, with the earlier
D and Lair managing to present six threatening portals in sequence
across the sixteen floors of D:1-11 + Lair:1-5 (Sewers, Ossuaries,
Necropolis, Bailies, Ice Caves, Volcanoes, Gauntlets) compared to
the thirteen floors post-Lair-branches (V:1-4, Elf, Crypt, Depths)
having three (Necropolis, Desolation, Wizlabs). Both of the
non-game-long ones also could do with a fair bit less pressure-
Desolation's completely unique theme also means it can't vary much
past its portal-specific monsters, and Wizlabs have been pushed to
their gimmick and namesake limits. This new portal combines the
virtues of both: having Desolation's overarching specific theme and
unique reusable monsters helps achieve a consistent sense of going
to a uniquely distinct place in the dungeon, but also the
ever-so-recurring universal theme of "horrible wet semi-dungeon"
itself allows branching out into many different one-off guest-borrowing
maps.)
* As a portal placed in a singular branch, it can help directly elaborate
upon and emphasize the flavour of the branch it spawns in. While the
Vaults has managed to put ugly things in cages and slime creatures
under beastmaster ownership with the past few versions of changes, it's
still a branch that holds a bit of chaotic shapeshifters and slimy
organelles despite a much more organized structuring implied than e.g.
the Dungeon and Depths; having a portal designated as where chaotic
monsters are supposed to be kept (with some imperfect storage
thereupon) can help finish out justifying the presence of such.
* This is also an experimental ground to test a few other matters, even
beyond the earlier "another unique portal monster set" and "portal
that expands one branch's specific flavour" points up above. It is a
second shot at trying out a "hard mode" portal with a much larger gap
than Ice Caves and Glacial Chasms being so close to one another, which
should help with lessening the pressure stretching out the same loose
concept across more lengths of the game. The mould patches in an
upcoming commit are some of the first non-tree non-trap non-spell
features added in many versions, and periodically-active features as
7834c98 enables are components of interest to try out in a variety of
extended branches beyond the exact same iterations of the same three
liquids + five wall types. With the bad mutation nerfs and less
permanent bad mutations changes 0.34, we can experiment with them being
a cost for trying out a portal at all. Finally, the upcoming monsters
here will also experimentally reuse a number of effects established
for other purposes, whether in monster-castable scorch or Diminish
Spells or BEAM_ANTIMAGIC or burstshrooms or stampeding abilities.
(Hypothetically, in the far future, this could also become another branch
in roulette rotation, alternating with Crypt in the same way Desolation
was meant to alternate with Elf and how Spider was somewhat tested before
successfully becoming a real branch. There's a lot of insufficiencies in
current branches as stands, like with Orc / Snake / Tomb's monster variety
or the aimless lengths of Pan, as well as quite a few branches that didn't
work out, like Dwarf and Forest, that I'm not the most interested in
trying for something nearly as ambitious, but it could hypothetically
cover for the various efforts of this branch if other devs have interest
in pushing that far after e.g. Hell-Pan Roulette. If nothing else, it
could contain transient-mutation staircases to get the same
anti-stairdancing effects, as a subtitute for Crypt's Doom presence....)
commit bb42b9d0493db19f1636027dadaba276dc59479d
Author: regret-index <clo...@ho...>
Date: Wed Mar 25 11:21:20 2026 -0230
Gulch's new tile set
As with aaf212a, this commit is split from the following commits of portal
set-up and maps to make it easier to credit each tile, as well as to
distinguish these tiles from the upcoming new feature and new firewood in
this particular batch.
* The gateway tiles edit LemurRobot and Ontoclasm's sewer exit, entrance,
and collapsed passage tiles.
* Floor tiles combine roctavian's adjustments of Denzi's V floor tiles
with roctavian and ontoclasm's Slime floor tiles. Additional elements
include Darby's Lair floor mushrooms, a CC0 splatter of paint by Shade,
Sastreii's floor_studio papers, and various CC0 tiny jrpg item graphics
by finalbossblues, ARoachIFoundOnMyPillow, and Jetrel.
* Rock wall tiles combine Denzi's catacomb vault rock walls with
roctavian and ontoclasm's slimy rock walls plus Sastreii's Sewer rock
wall tiles.
* Stone wall tiles combine Sastreii's stone walls for Swamp and Sewers
with Bloax's adjustments to roctavian's V stone wall tiles.
* Metal wall tiles combine Darby's V metal wall tiles with roctavian and
due's edits to Denzi's Dis metal wall tiles.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/beam-type.h | 2 +-
crawl-ref/source/beam.cc | 8 +-
crawl-ref/source/branch-data.h | 11 +
crawl-ref/source/branch-type.h | 4 +
crawl-ref/source/branch.cc | 2 +
crawl-ref/source/dat/database/monspell.txt | 70 +
crawl-ref/source/dat/defaults/messages.txt | 2 +-
crawl-ref/source/dat/des/altar/overflow.des | 75 +-
.../source/dat/des/branches/vaults_rooms_hard.des | 40 +-
crawl-ref/source/dat/des/builder/dummy.des | 2 +-
crawl-ref/source/dat/des/portals/bazaar.des | 2 +-
crawl-ref/source/dat/des/portals/gulch.des | 1877 ++++++++++++++++++++
crawl-ref/source/dat/des/portals/wizlab.des | 22 +-
crawl-ref/source/dat/des/portals/ziggurat.des | 8 +-
crawl-ref/source/dat/des/variable/float.des | 8 +-
crawl-ref/source/dat/des/variable/large_themed.des | 20 +-
.../source/dat/des/variable/mini_monsters.des | 32 +-
crawl-ref/source/dat/descript/branches.txt | 13 +
crawl-ref/source/dat/descript/features.txt | 11 +
crawl-ref/source/dat/descript/monstatus.txt | 6 +
crawl-ref/source/dat/descript/monsters.txt | 64 +
crawl-ref/source/dat/descript/spells.txt | 20 +
crawl-ref/source/dat/dlua/dungeon.lua | 1 +
crawl-ref/source/dat/dlua/v_layouts.lua | 1 +
crawl-ref/source/dat/dlua/v_rooms.lua | 11 +
crawl-ref/source/dat/dlua/vault.lua | 2 +-
crawl-ref/source/dat/dlua/ziggurat.lua | 8 +-
crawl-ref/source/dat/mons/fungal-shambler.yaml | 18 +
crawl-ref/source/dat/mons/glowmurk-ghast.yaml | 18 +
crawl-ref/source/dat/mons/mongrel-wurm.yaml | 22 +
crawl-ref/source/dat/mons/roaming-sludgefish.yaml | 21 +
crawl-ref/source/dat/mons/rusted-inspector.yaml | 20 +
crawl-ref/source/dat/mons/scrapshell-chimera.yaml | 21 +
crawl-ref/source/dat/mons/sewage-sovereign.yaml | 19 +
crawl-ref/source/dat/mons/stack-of-scrap.yaml | 16 +
crawl-ref/source/dat/mons/telencephalon.yaml | 16 +
crawl-ref/source/describe.cc | 7 +
crawl-ref/source/directn.cc | 3 +-
crawl-ref/source/dungeon-feature-type.h | 10 +
crawl-ref/source/enchant-type.h | 1 +
crawl-ref/source/feature-data.h | 9 +
crawl-ref/source/files.cc | 1 +
crawl-ref/source/fineff.cc | 58 +
crawl-ref/source/fineff.h | 2 +-
crawl-ref/source/mapmark.h | 1 +
crawl-ref/source/melee-attack.cc | 69 +-
crawl-ref/source/melee-attack.h | 1 +
crawl-ref/source/mgen-enum.h | 1 +
crawl-ref/source/mon-act.cc | 102 +-
crawl-ref/source/mon-act.h | 2 +
crawl-ref/source/mon-cast.cc | 62 +
crawl-ref/source/mon-death.cc | 6 +-
crawl-ref/source/mon-ench.cc | 8 +-
crawl-ref/source/mon-ench.h | 2 +-
crawl-ref/source/mon-enum.h | 2 +
crawl-ref/source/mon-gear.cc | 12 +
crawl-ref/source/mon-info.cc | 4 +-
crawl-ref/source/mon-info.h | 1 +
crawl-ref/source/mon-pick-data.h | 18 +
crawl-ref/source/mon-place.cc | 2 +
crawl-ref/source/mon-spell.h | 40 +
crawl-ref/source/mon-util.cc | 5 +-
crawl-ref/source/monster-type.h | 22 +
crawl-ref/source/monster.cc | 13 +-
crawl-ref/source/movement.cc | 63 +-
crawl-ref/source/movement.h | 3 +
crawl-ref/source/mutation.cc | 2 +-
crawl-ref/source/rltiles/dc-corpse.txt | 6 +
crawl-ref/source/rltiles/dc-feat.txt | 9 +
crawl-ref/source/rltiles/dc-floor.txt | 28 +
crawl-ref/source/rltiles/dc-icons.txt | 1 +
crawl-ref/source/rltiles/dc-misc.txt | 4 +
crawl-ref/source/rltiles/dc-mon.txt | 25 +
crawl-ref/source/rltiles/dc-spells.txt | 3 +
crawl-ref/source/rltiles/dc-wall.txt | 27 +
.../source/rltiles/dngn/floor/floor_gulch0.png | Bin 0 -> 1935 bytes
.../source/rltiles/dngn/floor/floor_gulch1.png | Bin 0 -> 1966 bytes
.../source/rltiles/dngn/floor/floor_gulch2.png | Bin 0 -> 1991 bytes
.../source/rltiles/dngn/floor/floor_gulch3.png | Bin 0 -> 1942 bytes
.../source/rltiles/dngn/floor/floor_gulch4.png | Bin 0 -> 2183 bytes
.../source/rltiles/dngn/floor/floor_gulch5.png | Bin 0 -> 2201 bytes
.../source/rltiles/dngn/floor/floor_gulch6.png | Bin 0 -> 2147 bytes
.../source/rltiles/dngn/floor/floor_gulch7.png | Bin 0 -> 2300 bytes
.../source/rltiles/dngn/floor/floor_gulch8.png | Bin 0 -> 2181 bytes
.../source/rltiles/dngn/floor/floor_gulch9.png | Bin 0 -> 2217 bytes
.../rltiles/dngn/floor/floor_gulch_trash0.png | Bin 0 -> 2125 bytes
.../rltiles/dngn/floor/floor_gulch_trash1.png | Bin 0 -> 2178 bytes
.../rltiles/dngn/floor/floor_gulch_trash2.png | Bin 0 -> 2188 bytes
.../rltiles/dngn/floor/floor_gulch_trash3.png | Bin 0 -> 2094 bytes
.../rltiles/dngn/floor/floor_gulch_trash4.png | Bin 0 -> 2351 bytes
.../rltiles/dngn/floor/floor_gulch_trash5.png | Bin 0 -> 2224 bytes
.../rltiles/dngn/floor/floor_gulch_trash6.png | Bin 0 -> 2228 bytes
.../rltiles/dngn/floor/floor_gulch_trash7.png | Bin 0 -> 2294 bytes
.../source/rltiles/dngn/gateways/gulch_exit.png | Bin 0 -> 1831 bytes
.../source/rltiles/dngn/gateways/gulch_portal.png | Bin 0 -> 2336 bytes
.../rltiles/dngn/gateways/gulch_portal_rusted.png | Bin 0 -> 1992 bytes
crawl-ref/source/rltiles/dngn/mould_patch0.png | Bin 0 -> 2116 bytes
crawl-ref/source/rltiles/dngn/mould_patch1.png | Bin 0 -> 2037 bytes
.../rltiles/dngn/vaults/mould_patch_gulch0.png | Bin 0 -> 2280 bytes
.../rltiles/dngn/vaults/mould_patch_gulch1.png | Bin 0 -> 2382 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock0.png | Bin 0 -> 2818 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock1.png | Bin 0 -> 2772 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock2.png | Bin 0 -> 2822 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock3.png | Bin 0 -> 2774 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock4.png | Bin 0 -> 2875 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock5.png | Bin 0 -> 3105 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock6.png | Bin 0 -> 2861 bytes
crawl-ref/source/rltiles/dngn/wall/gulch_rock7.png | Bin 0 -> 3051 bytes
.../source/rltiles/dngn/wall/wall_metal_gulch0.png | Bin 0 -> 2266 bytes
.../source/rltiles/dngn/wall/wall_metal_gulch1.png | Bin 0 -> 2435 bytes
.../source/rltiles/dngn/wall/wall_metal_gulch2.png | Bin 0 -> 2389 bytes
.../source/rltiles/dngn/wall/wall_metal_gulch3.png | Bin 0 -> 2448 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch0.png | Bin 0 -> 1814 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch1.png | Bin 0 -> 2137 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch2.png | Bin 0 -> 1887 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch3.png | Bin 0 -> 2133 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch4.png | Bin 0 -> 2129 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch5.png | Bin 0 -> 2184 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch6.png | Bin 0 -> 2310 bytes
.../source/rltiles/dngn/wall/wall_stone_gulch7.png | Bin 0 -> 2426 bytes
crawl-ref/source/rltiles/effect/antimagic0.png | Bin 0 -> 8716 bytes
crawl-ref/source/rltiles/effect/antimagic1.png | Bin 0 -> 8786 bytes
crawl-ref/source/rltiles/effect/antimagic2.png | Bin 0 -> 8650 bytes
.../gui/spells/monster/bolt_of_antimagic.png | Bin 0 -> 1612 bytes
.../rltiles/gui/spells/monster/murky_legion.png | Bin 0 -> 8178 bytes
.../source/rltiles/gui/spells/monster/stampede.png | Bin 0 -> 6520 bytes
crawl-ref/source/rltiles/icon-sizes.txt | 1 +
crawl-ref/source/rltiles/misc/icons/stampede.png | Bin 0 -> 4497 bytes
.../rltiles/mon/aberrations/scrapshell_chimera.png | Bin 0 -> 9384 bytes
.../rltiles/mon/aberrations/telencephalon.png | Bin 0 -> 1671 bytes
.../rltiles/mon/animals/sewage_sovereign.png | Bin 0 -> 8265 bytes
.../rltiles/mon/aquatic/roaming_sludgefish0.png | Bin 0 -> 2741 bytes
.../rltiles/mon/aquatic/roaming_sludgefish1.png | Bin 0 -> 2715 bytes
.../rltiles/mon/aquatic/roaming_sludgefish2.png | Bin 0 -> 2706 bytes
.../rltiles/mon/aquatic/roaming_sludgefish3.png | Bin 0 -> 2727 bytes
.../source/rltiles/mon/dragons/mongrel_wurm.png | Bin 0 -> 1780 bytes
.../rltiles/mon/fungi_plants/fungal_shambler.png | Bin 0 -> 9633 bytes
.../rltiles/mon/fungi_plants/fungus_gulch0.png | Bin 0 -> 1715 bytes
.../rltiles/mon/fungi_plants/fungus_gulch1.png | Bin 0 -> 1638 bytes
.../rltiles/mon/fungi_plants/fungus_gulch2.png | Bin 0 -> 1665 bytes
.../rltiles/mon/fungi_plants/fungus_gulch3.png | Bin 0 -> 1678 bytes
.../mon/fungi_plants/fungus_gulch_patch0.png | Bin 0 -> 1937 bytes
.../mon/fungi_plants/fungus_gulch_patch1.png | Bin 0 -> 1849 bytes
.../mon/fungi_plants/fungus_gulch_patch2.png | Bin 0 -> 1933 bytes
.../mon/fungi_plants/fungus_gulch_patch3.png | Bin 0 -> 1866 bytes
.../rltiles/mon/nonliving/rusted_inspector.png | Bin 0 -> 8024 bytes
.../source/rltiles/mon/statues/stack_of_scrap0.png | Bin 0 -> 1903 bytes
.../source/rltiles/mon/statues/stack_of_scrap1.png | Bin 0 -> 1621 bytes
.../source/rltiles/mon/statues/stack_of_scrap2.png | Bin 0 -> 1794 bytes
.../source/rltiles/mon/undead/glowmurk_ghast.png | Bin 0 -> 9676 bytes
crawl-ref/source/spell-type.h | 3 +
crawl-ref/source/spl-damage.cc | 3 +
crawl-ref/source/spl-data.h | 33 +
crawl-ref/source/spl-summoning.cc | 1 +
crawl-ref/source/spl-zap.cc | 1 +
crawl-ref/source/stairs.cc | 16 +
crawl-ref/source/terrain.cc | 20 +-
crawl-ref/source/terrain.h | 1 +
crawl-ref/source/tilemcache.cc | 13 +-
crawl-ref/source/tilepick.cc | 24 +
crawl-ref/source/tileview.cc | 5 +
crawl-ref/source/timed-effects.cc | 45 +
crawl-ref/source/timed-effects.h | 1 +
crawl-ref/source/util/monster/monster-main.cc | 3 +
crawl-ref/source/zap-data.h | 18 +-
crawl-ref/source/zap-type.h | 1 +
166 files changed, 3141 insertions(+), 176 deletions(-)
create mode 100644 crawl-ref/source/dat/des/portals/gulch.des
create mode 100644 crawl-ref/source/dat/mons/fungal-shambler.yaml
create mode 100644 crawl-ref/source/dat/mons/glowmurk-ghast.yaml
create mode 100644 crawl-ref/source/dat/mons/mongrel-wurm.yaml
create mode 100644 crawl-ref/source/dat/mons/roaming-sludgefish.yaml
create mode 100644 crawl-ref/source/dat/mons/rusted-inspector.yaml
create mode 100644 crawl-ref/source/dat/mons/scrapshell-chimera.yaml
create mode 100644 crawl-ref/source/dat/mons/sewage-sovereign.yaml
create mode 100644 crawl-ref/source/dat/mons/stack-of-scrap.yaml
create mode 100644 crawl-ref/source/dat/mons/telencephalon.yaml
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch0.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch1.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch2.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch3.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch4.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch5.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch6.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch7.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch8.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch9.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash0.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash1.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash2.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash3.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash4.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash5.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash6.png
create mode 100644 crawl-ref/source/rltiles/dngn/floor/floor_gulch_trash7.png
create mode 100644 crawl-ref/source/rltiles/dngn/gateways/gulch_exit.png
create mode 100644 crawl-ref/source/rltiles/dngn/gateways/gulch_portal.png
create mode 100644 crawl-ref/source/rltiles/dngn/gateways/gulch_portal_rusted.png
create mode 100644 crawl-ref/source/rltiles/dngn/mould_patch0.png
create mode 100644 crawl-ref/source/rltiles/dngn/mould_patch1.png
create mode 100644 crawl-ref/source/rltiles/dngn/vaults/mould_patch_gulch0.png
create mode 100644 crawl-ref/source/rltiles/dngn/vaults/mould_patch_gulch1.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock0.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock1.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock2.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock3.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock4.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock5.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock6.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/gulch_rock7.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_metal_gulch0.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_metal_gulch1.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_metal_gulch2.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_metal_gulch3.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch0.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch1.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch2.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch3.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch4.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch5.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch6.png
create mode 100644 crawl-ref/source/rltiles/dngn/wall/wall_stone_gulch7.png
create mode 100644 crawl-ref/source/rltiles/effect/antimagic0.png
create mode 100644 crawl-ref/source/rltiles/effect/antimagic1.png
create mode 100644 crawl-ref/source/rltiles/effect/antimagic2.png
create mode 100644 crawl-ref/source/rltiles/gui/spells/monster/bolt_of_antimagic.png
create mode 100644 crawl-ref/source/rltiles/gui/spells/monster/murky_legion.png
create mode 100644 crawl-ref/source/rltiles/gui/spells/monster/stampede.png
create mode 100644 crawl-ref/source/rltiles/misc/icons/stampede.png
create mode 100644 crawl-ref/source/rltiles/mon/aberrations/scrapshell_chimera.png
create mode 100644 crawl-ref/source/rltiles/mon/aberrations/telencephalon.png
create mode 100644 crawl-ref/source/rltiles/mon/animals/sewage_sovereign.png
create mode 100644 crawl-ref/source/rltiles/mon/aquatic/roaming_sludgefish0.png
create mode 100644 crawl-ref/source/rltiles/mon/aquatic/roaming_sludgefish1.png
create mode 100644 crawl-ref/source/rltiles/mon/aquatic/roaming_sludgefish2.png
create mode 100644 crawl-ref/source/rltiles/mon/aquatic/roaming_sludgefish3.png
create mode 100644 crawl-ref/source/rltiles/mon/dragons/mongrel_wurm.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungal_shambler.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch0.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch1.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch2.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch3.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch_patch0.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch_patch1.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch_patch2.png
create mode 100644 crawl-ref/source/rltiles/mon/fungi_plants/fungus_gulch_patch3.png
create mode 100644 crawl-ref/source/rltiles/mon/nonliving/rusted_inspector.png
create mode 100644 crawl-ref/source/rltiles/mon/statues/stack_of_scrap0.png
create mode 100644 crawl-ref/source/rltiles/mon/statues/stack_of_scrap1.png
create mode 100644 crawl-ref/source/rltiles/mon/statues/stack_of_scrap2.png
create mode 100644 crawl-ref/source/rltiles/mon/undead/glowmurk_ghast.png
diff --git a/crawl-ref/source/beam-type.h b/crawl-ref/source/beam-type.h
index 45fc0c1766..d071b853dd 100644
--- a/crawl-ref/source/beam-type.h
+++ b/crawl-ref/source/beam-type.h
@@ -47,6 +47,7 @@ enum beam_type // bolt::flavour
BEAM_BOLAS,
BEAM_MERCURY,
BEAM_BAT_CLOUD,
+ BEAM_ANTIMAGIC,
// Enchantments
BEAM_SLOW,
@@ -83,7 +84,6 @@ enum beam_type // bolt::flavour
BEAM_VIRULENCE,
BEAM_AGILITY,
BEAM_SAP_MAGIC,
- BEAM_DRAIN_MAGIC,
BEAM_TUKIMAS_DANCE,
BEAM_RESISTANCE,
BEAM_UNRAVELLING,
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index bedaffee25..195908e87a 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -4446,7 +4446,7 @@ void bolt::affect_player()
if (flavour == BEAM_CRYSTALLISING && !one_chance_in(4))
you.vitrify(agent(), random_range(8, 18));
- if (flavour == BEAM_DRAIN_MAGIC)
+ if (flavour == BEAM_...
[truncated message content] |
|
From: <gi...@cr...> - 2026-04-28 02:20:10
|
via 60e9dc374779597be3a1f43f0eb6710d0b4c161a (commit)
from b5bb446ab73d3f157533e0e0f610b118c10cbf97 (commit)
-----------------------------------------------------------------------
commit 60e9dc374779597be3a1f43f0eb6710d0b4c161a
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 21:12:53 2026 -0500
Add a message for power leap (Lici)
It had no message at all.
Closes #4944
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/god-abil.cc | 2 ++
1 file changed, 2 insertions(+)
diff --git a/crawl-ref/source/god-abil.cc b/crawl-ref/source/god-abil.cc
index d37cf7d968..a603fc2a54 100644
--- a/crawl-ref/source/god-abil.cc
+++ b/crawl-ref/source/god-abil.cc
@@ -5537,6 +5537,8 @@ bool ru_power_leap()
wave.loudness = 2;
wave.explode();
+ mpr("You perform a powerful leap!");
+
// we need to exempt the player from damage.
for (adjacent_iterator ai(you.pos(), false); ai; ++ai)
{
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 00:55:11
|
via b5bb446ab73d3f157533e0e0f610b118c10cbf97 (commit)
from 98733c7c727bd976393125e360d259bd3bfd22d3 (commit)
-----------------------------------------------------------------------
commit b5bb446ab73d3f157533e0e0f610b118c10cbf97
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 19:48:50 2026 -0500
Don't shoot pacified mons with salvo (PaperRat)
Needs a separate check because they aren't good_neutral.
Closes #5226
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/throw.cc | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/crawl-ref/source/throw.cc b/crawl-ref/source/throw.cc
index 7da6786ddb..a0bf93b898 100644
--- a/crawl-ref/source/throw.cc
+++ b/crawl-ref/source/throw.cc
@@ -779,8 +779,11 @@ static vector<coord_def> _get_salvo_targets(const coord_def& orig_target, int nu
vector<monster*> to_check;
for (monster_near_iterator mi(&you, LOS_SOLID_SEE); mi; ++mi)
{
- if (mi->wont_attack() || mi->is_firewood() || mi->mid == primary)
+ if (mi->wont_attack() || mi->pacified() || mi->is_firewood()
+ || mi->mid == primary)
+ {
continue;
+ }
if (exists_ray(you.pos(), mi->pos(), opc_unblocked_shot, you.current_vision))
to_check.push_back(*mi);
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 00:25:20
|
via 98733c7c727bd976393125e360d259bd3bfd22d3 (commit)
from 1e28e0a36115be09d56e199ea651a46c314f6b4f (commit)
-----------------------------------------------------------------------
commit 98733c7c727bd976393125e360d259bd3bfd22d3
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 19:19:42 2026 -0500
Fix Klown Pie rF- duration (damerell)
Missing parentheses.
Closes #5065
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/beam.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index a30ed0bd2c..bedaffee25 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -4137,7 +4137,7 @@ static const vector<pie_effect> pie_effects = {
simple_monster_message(*mons,
" looks more vulnerable to fire.");
mons->add_ench(mon_enchant(ENCH_FIRE_VULN, beam.agent(),
- 15 + random2(11) * BASELINE_DELAY));
+ (15 + random2(11)) * BASELINE_DELAY));
}
else
{
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-28 00:20:21
|
via 1e28e0a36115be09d56e199ea651a46c314f6b4f (commit)
from ed61b23554bc42a23b6e57fb1b5149c7b310da9c (commit)
-----------------------------------------------------------------------
commit 1e28e0a36115be09d56e199ea651a46c314f6b4f
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 19:15:30 2026 -0500
Clarify wellspring talisman description (Odds)
Wellspring doesn't allow ranged stabs.
Closes #5222
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/dat/descript/items.txt | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt
index 8122aaf8fc..6644a33b53 100644
--- a/crawl-ref/source/dat/descript/items.txt
+++ b/crawl-ref/source/dat/descript/items.txt
@@ -1838,8 +1838,9 @@ wellspring talisman
A small amphora from which pours a seemingly unending quantity of water.
Transforms the wearer's flesh into elemental water, allowing them to move flexibly
-and reach to attack from a great distance. From time to time, they can even
-cause the water around them to rise up and drown their enemies.
+and reach to attack from a great distance, though without the precision needed
+to stab from range. From time to time, they can even cause the water around them
+to rise up and drown their enemies.
The malleability of this water even allows them to retain the benefits of their
physical mutations, but cold attacks can freeze it solid and fire may cause it
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 21:35:14
|
via ed61b23554bc42a23b6e57fb1b5149c7b310da9c (commit)
from 0c0b54a4231e698117f6c5395acc93fcaa567c3f (commit)
-----------------------------------------------------------------------
commit ed61b23554bc42a23b6e57fb1b5149c7b310da9c
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 16:33:45 2026 -0500
add hanchyan to credits
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/CREDITS.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/crawl-ref/CREDITS.txt b/crawl-ref/CREDITS.txt
index 8744fe9e20..3b2fca82c2 100644
--- a/crawl-ref/CREDITS.txt
+++ b/crawl-ref/CREDITS.txt
@@ -216,6 +216,7 @@
Brian Haase
Sophie Hamilton
Chris Hamons
+ hanchyan
Tomas Krag Hansen
Lexi Hattaway
Taylor Hedberg
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 21:25:09
|
via 0c0b54a4231e698117f6c5395acc93fcaa567c3f (commit)
from f704a977e0b8efcb03e0edf37bbbdffbf0f3a26f (commit)
-----------------------------------------------------------------------
commit 0c0b54a4231e698117f6c5395acc93fcaa567c3f
Author: TecchyToni <688...@us...>
Date: Tue Apr 28 06:21:10 2026 +0900
Add 'Scuttle off' to insult.txt (#5190)
Scuttle is a great word and adds some good flavor. Good for vocab
building.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/dat/database/insult.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/crawl-ref/source/dat/database/insult.txt b/crawl-ref/source/dat/database/insult.txt
index 3a21cec202..e168c6878e 100644
--- a/crawl-ref/source/dat/database/insult.txt
+++ b/crawl-ref/source/dat/database/insult.txt
@@ -89,6 +89,8 @@ Scamper hence
Scamper home
+Scuttle off
+
Slither away
Slither hence
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 21:15:15
|
via bbe0cd8b06336f0e31c6be14f41147cd2b6fcd95 (commit)
from 1e8f1aefc5dbe1ae0db6492358808ddee1ddca07 (commit)
-----------------------------------------------------------------------
commit bbe0cd8b06336f0e31c6be14f41147cd2b6fcd95
Author: hellmonk <nld...@gm...>
Date: Mon Apr 27 16:13:53 2026 -0500
bugfix
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/god-abil.cc | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/crawl-ref/source/god-abil.cc b/crawl-ref/source/god-abil.cc
index 0a0990ba03..1b695dc1e7 100644
--- a/crawl-ref/source/god-abil.cc
+++ b/crawl-ref/source/god-abil.cc
@@ -2190,7 +2190,7 @@ static map<curse_type, curse_data> _ashenzari_curses =
{ SK_FIRE_MAGIC },
} },
{ CURSE_ICE_MAGIC, {
- "Fire Magic", "Fire",
+ "Ice Magic", "Ice",
{ SK_ICE_MAGIC },
} },
{ CURSE_AIR_MAGIC, {
@@ -2259,6 +2259,7 @@ static bool _curse_is_removed(curse_type curse)
{
switch (curse)
{
+#if TAG_MAJOR_VERSION == 34
case CURSE_ELEMENTS:
case CURSE_SORCERY:
case CURSE_COMPANIONS:
@@ -2267,6 +2268,7 @@ static bool _curse_is_removed(curse_type curse)
case CURSE_FORTITUDE:
case CURSE_CUNNING:
return true;
+#endif
default:
return false;
}
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:55:10
|
via f704a977e0b8efcb03e0edf37bbbdffbf0f3a26f (commit)
via c9987553d49ad7253c2c15a9eeb12a3c6d838b21 (commit)
from 9e123638113f9ddae6db90e05beb39af86c49f25 (commit)
-----------------------------------------------------------------------
commit f704a977e0b8efcb03e0edf37bbbdffbf0f3a26f
Author: damerell <dam...@ch...>
Date: Mon Apr 27 21:54:53 2026 +0100
Add rest_wait_ignore_mp option (#5091)
For Troggies who swap to and from antimagic weapons and don't care if MP
are full, etc.
(cherry picked from commit a44d6c2e30122ae8655c229552f346ea1b736606)
(cherry picked from commit 44df99e921829b4ea6125d69da57ee80e0a4b00b)
I mentioned this on IRC in, er, 2024 and the reaction was positive, so
here it is.
commit c9987553d49ad7253c2c15a9eeb12a3c6d838b21
Author: damerell <dam...@ch...>
Date: Mon Apr 27 21:51:24 2026 +0100
Restore old raven quote (#5093)
Removed with ravens. More pleasing than the obvious Poe selection.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/docs/options_guide.txt | 6 ++++++
crawl-ref/source/dat/descript/quotes.txt | 6 ++++++
crawl-ref/source/initfile.cc | 1 +
crawl-ref/source/options.h | 3 +++
crawl-ref/source/player.cc | 7 +++++--
5 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt
index 16c9ddf0e6..f87a1d366c 100644
--- a/crawl-ref/docs/options_guide.txt
+++ b/crawl-ref/docs/options_guide.txt
@@ -1092,6 +1092,12 @@ rest_wait_both = false
when both HP and MP are fully restored, not when either one of
them is restored.
+rest_wait_ignore_mp = false
+ Never continue to rest because MP are depleted. This option
+ overrules rest_wait_both. It is provided for characters who
+ are intermittently wielding antimagic weapons and have no use
+ for MP.
+
rest_wait_ancestor = false
If rest_wait_ancestor is set to true then resting will only stop when
the ancestor's health is fully restored in addition to player HP or MP
diff --git a/crawl-ref/source/dat/descript/quotes.txt b/crawl-ref/source/dat/descript/quotes.txt
index 371eb11a94..733e221885 100644
--- a/crawl-ref/source/dat/descript/quotes.txt
+++ b/crawl-ref/source/dat/descript/quotes.txt
@@ -3744,6 +3744,12 @@ rakshasa
-_MahÄbhÄrata_, Adi Parva, Hidimva-vadha Parva, section CLIV. ca. 500 B.C.
trans. Kisari Mohan Ganguli, 1883.
%%%%
+raven
+
+âThe Hatter opened his eyes very wide on hearing this; but all he said was âWhy
+is a raven like a writing-desk?ââ
+ -Lewis Carroll, Aliceâs Adventures in Wonderland
+%%%%
reaper
âAll our times have come.
diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc
index ab8331d4a1..5e79390558 100644
--- a/crawl-ref/source/initfile.cc
+++ b/crawl-ref/source/initfile.cc
@@ -580,6 +580,7 @@ const vector<GameOption*> game_options::build_options_list()
new BoolGameOption(SIMPLE_NAME(dump_on_save), true),
new BoolGameOption(SIMPLE_NAME(rest_wait_both), false),
new BoolGameOption(SIMPLE_NAME(rest_wait_ancestor), false),
+ new BoolGameOption(SIMPLE_NAME(rest_wait_ignore_mp), false),
new BoolGameOption(SIMPLE_NAME(cloud_status), !is_tiles()),
new BoolGameOption(SIMPLE_NAME(always_show_zot), false),
new BoolGameOption(SIMPLE_NAME(always_show_gems), false),
diff --git a/crawl-ref/source/options.h b/crawl-ref/source/options.h
index 20a4e9be98..3bf394b547 100644
--- a/crawl-ref/source/options.h
+++ b/crawl-ref/source/options.h
@@ -824,6 +824,9 @@ public:
bool rest_wait_ancestor;// Stop resting only if the ancestor's HP
// is fully restored.
+ bool rest_wait_ignore_mp; // Completely disregard depleted MP when
+ // resting
+
int rest_wait_percent; // Stop resting after restoring this
// fraction of HP or MP
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 6aedd9a4c7..ed27a720df 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -4048,8 +4048,11 @@ void inc_mp(int mp_gain, bool silent)
if (!silent)
{
- if (_should_stop_resting(you.magic_points, you.max_magic_points))
+ if (_should_stop_resting(you.magic_points, you.max_magic_points)
+ && !Options.rest_wait_ignore_mp)
+ {
interrupt_activity(activity_interrupt::full_mp);
+ }
you.redraw_magic_points = true;
}
@@ -5832,7 +5835,7 @@ bool player::is_sufficiently_rested(bool starting) const
return (!player_regenerates_hp()
|| _should_stop_resting(hp, hp_max, !starting)
|| !hp_interrupts)
- && (!player_regenerates_mp()
+ && (!player_regenerates_mp() || Options.rest_wait_ignore_mp
|| _should_stop_resting(magic_points, max_magic_points, !starting)
|| !mp_interrupts)
&& (can_freely_move || !hp_interrupts);
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:40:15
|
via 9e123638113f9ddae6db90e05beb39af86c49f25 (commit)
from ec57a9309b9c99b8e3405c9d72d9ba9107fc1b3d (commit)
-----------------------------------------------------------------------
commit 9e123638113f9ddae6db90e05beb39af86c49f25
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:37:53 2026 +0100
Fix buggy descriptor with easy_floor_use. (#5229)
When using identify, brand or enchant scrolls with easy_floor_use, the
descriptor for the item selection prompt was "buggy".
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/item-use.cc | 1 +
1 file changed, 1 insertion(+)
diff --git a/crawl-ref/source/item-use.cc b/crawl-ref/source/item-use.cc
index 91be1fe753..3494fc3fdf 100644
--- a/crawl-ref/source/item-use.cc
+++ b/crawl-ref/source/item-use.cc
@@ -196,6 +196,7 @@ static string _oper_name(operation_types oper)
case OPER_TAKEOFF: return "take off";
case OPER_REMOVE: return "remove";
case OPER_UNEQUIP: return "unequip";
+ case OPER_ANY: return "select";
default:
return "buggy";
}
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:35:09
|
via ec57a9309b9c99b8e3405c9d72d9ba9107fc1b3d (commit)
from 91403ecfe33dd9df8be55299360fa2ab332f1c14 (commit)
-----------------------------------------------------------------------
commit ec57a9309b9c99b8e3405c9d72d9ba9107fc1b3d
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:31:53 2026 +0100
Add a force more for forbidden items on god joining (#5152)
Fixes #5147
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/dat/defaults/messages.txt | 1 +
crawl-ref/source/religion.cc | 1 +
2 files changed, 2 insertions(+)
diff --git a/crawl-ref/source/dat/defaults/messages.txt b/crawl-ref/source/dat/defaults/messages.txt
index fde55f04bd..3af36110ac 100644
--- a/crawl-ref/source/dat/defaults/messages.txt
+++ b/crawl-ref/source/dat/defaults/messages.txt
@@ -130,6 +130,7 @@ force_more_message += There is a(n entrance| portal| gateway) to.*on this level
force_more_message += Beware! This is a limited time offer
# Religion
+force_more_message += warns you to remove
force_more_message += press .* to convert to Beogh
force_more_message += welcomes you( back)?!
force_more_message += You have lost your religion
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 4795178b90..3cfab79f46 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -3366,6 +3366,7 @@ static void _god_welcome_handle_gear()
{
if (god_hates_item(*item))
{
+ // included in default force_more_message
mprf(MSGCH_GOD, "%s warns you to remove %s.",
uppercase_first(god_name(you.religion)).c_str(),
item->name(DESC_YOUR, false, false, false).c_str());
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:30:22
|
via 91403ecfe33dd9df8be55299360fa2ab332f1c14 (commit)
from 33839baa0f835bf3645a8bd119bba93882c56633 (commit)
-----------------------------------------------------------------------
commit 91403ecfe33dd9df8be55299360fa2ab332f1c14
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:25:50 2026 +0100
Don't spawn batty summons wandering (#5209)
Batty friends (like death scarabs) were spawning wandering if there were
no enemies in sight.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/mon-behv.cc | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/crawl-ref/source/mon-behv.cc b/crawl-ref/source/mon-behv.cc
index 8b84044082..88310a728b 100644
--- a/crawl-ref/source/mon-behv.cc
+++ b/crawl-ref/source/mon-behv.cc
@@ -744,7 +744,10 @@ void handle_behaviour(monster* mon)
// Batty monsters don't automatically reseek so that
// they'll flitter away, we'll reset them just before
// they get movement in handle_monsters() instead. -- bwr
- if ((proxFoe || mons_foe_is_marked(*mon)) && !mons_is_batty(*mon))
+ // The exception is friendly batty monsters targetting the player,
+ // who should seek the player.
+ if ((proxFoe || mons_foe_is_marked(*mon))
+ && (!mons_is_batty(*mon) || (isFriendly && mon->foe == MHITYOU)))
{
new_beh = BEH_SEEK;
break;
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:25:14
|
via 33839baa0f835bf3645a8bd119bba93882c56633 (commit)
from 928dce7b120d3ba8f663529a4b401733d796a892 (commit)
-----------------------------------------------------------------------
commit 33839baa0f835bf3645a8bd119bba93882c56633
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:24:23 2026 +0100
Correctly set targets on sculpted simulacra (#5215)
This prevents them wandering off.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/mon-death.cc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/crawl-ref/source/mon-death.cc b/crawl-ref/source/mon-death.cc
index d7c3bd53b6..25b6d876f5 100644
--- a/crawl-ref/source/mon-death.cc
+++ b/crawl-ref/source/mon-death.cc
@@ -2683,7 +2683,7 @@ item_def* monster_die(monster& mons, killer_type killer,
&& timeout)
{
mgen_data simu = mgen_data(MONS_SIMULACRUM, BEH_COPY, mons.pos(),
- BEH_FRIENDLY, MG_AUTOFOE | MG_FORCE_PLACE)
+ MHITYOU, MG_AUTOFOE | MG_FORCE_PLACE)
.set_summoned(&you, SPELL_SIMULACRUM, summ_dur(3), false);
simu.base_type = (monster_type)mons.props[SIMULACRUM_TYPE_KEY].get_int();
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:15:19
|
via 928dce7b120d3ba8f663529a4b401733d796a892 (commit)
from 06e84273288ac7257e3ba54e894c34d6d8512555 (commit)
-----------------------------------------------------------------------
commit 928dce7b120d3ba8f663529a4b401733d796a892
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:12:48 2026 +0100
Fix alistair's warning/uselessness issues (#5223)
Fix Alistair's intoxication so that:
- It is marked useless if only allies are in sight
- It warns when you're going to confuse an ally
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/spl-other.cc | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/crawl-ref/source/spl-other.cc b/crawl-ref/source/spl-other.cc
index e041c0b5c5..fe30b5ce37 100644
--- a/crawl-ref/source/spl-other.cc
+++ b/crawl-ref/source/spl-other.cc
@@ -13,6 +13,7 @@
#include "coordit.h"
#include "delay.h"
#include "env.h"
+#include "fight.h"
#include "god-companions.h"
#include "libutil.h"
#include "message.h"
@@ -24,6 +25,7 @@
#include "potion.h"
#include "religion.h"
#include "spl-util.h"
+#include "target.h"
#include "terrain.h"
#include "timed-effects.h"
#include "view.h"
@@ -427,18 +429,22 @@ spret cast_passwall(const coord_def& c, int pow, bool fail)
return spret::success;
}
+static int _intoxicate_can_affect(const actor *actor)
+{
+ const monster *mons = actor->as_monster();
+ return mons
+ && mons_intel(*mons) >= I_HUMAN
+ && !mons->clarity()
+ && mons->res_poison() < 3;
+}
+
static int _intoxicate_monsters(coord_def where, int pow, bool tracer)
{
monster* mons = monster_at(where);
- if (mons == nullptr
- || mons_intel(*mons) < I_HUMAN
- || mons->clarity()
- || mons->res_poison() >= 3)
- {
+ if (!mons || !_intoxicate_can_affect(mons))
return 0;
- }
- if (tracer && !you.can_see(*mons))
+ if (tracer && (!you.can_see(*mons) || mons_aligned(mons, &you)))
return 0;
if (!tracer && monster_resists_this_poison(*mons))
@@ -465,6 +471,10 @@ spret cast_intoxicate(int pow, bool fail, bool tracer)
return work > 0 ? spret::success : spret::abort;
}
+ targeter_radius hitfunc(&you, LOS_NO_TRANS);
+ if (stop_attack_prompt(hitfunc, "intoxicate", _intoxicate_can_affect))
+ return spret::abort;
+
fail_check();
mpr("You attempt to intoxicate your foes!");
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 20:10:22
|
via 06e84273288ac7257e3ba54e894c34d6d8512555 (commit)
via 7c1fc4285a8dab5150f4c30d6c843941087f891a (commit)
from dab29871b023f1d8b9d9a3e053155bffe36dccb0 (commit)
-----------------------------------------------------------------------
commit 06e84273288ac7257e3ba54e894c34d6d8512555
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:09:12 2026 +0100
Tweak tyrannical servant probabilities (#5160)
Because of the way random picking works, demons from the Mark of the
tyrant were becoming less likely at very high invo, probably encouraging
the player to stop at 26 invo.
We fix this by having the non-sentinel tyrant demons use distributions
with later peaks, and then giving sentinels a little bump so they are
about as probable as before.
The updates to probabilities for any tyrannical demons are:
Skill | old prob | new prob
19 | 14% | 14%
20 | 17% | 16%
21 | 30% | 28%
22 | 42% | 40%
23 | 50% | 46%
24 | 55% | 52%
25 | 55% | 57%
26 | 56% | 63%
27 | 53% | 64%
commit 7c1fc4285a8dab5150f4c30d6c843941087f891a
Author: CrawlOdds <cra...@gm...>
Date: Mon Apr 27 21:07:56 2026 +0100
Fix angry sphinxes timing out on recast (alenari) (#5214)
Mayhem'd sphinxes were poofing when recasting the spell due to their
custom spell cap logic. We move them into normal logic by giving them
separate caps per monster type, similar to XXX.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/god-abil.cc | 8 ++++----
crawl-ref/source/spl-summoning.cc | 15 ++++++++-------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/crawl-ref/source/god-abil.cc b/crawl-ref/source/god-abil.cc
index c1de7883db..d37cf7d968 100644
--- a/crawl-ref/source/god-abil.cc
+++ b/crawl-ref/source/god-abil.cc
@@ -6918,10 +6918,10 @@ static const vector<random_pick_entry<monster_type>> _makhleb_servants =
{ 17, 27, 220, SEMI, MONS_EXECUTIONER },
// Accessible only through the Mark of the Tyrant
- { 19, 27, 260, SEMI, MONS_TZITZIMITL },
- { 21, 27, 280, SEMI, MONS_ICE_FIEND },
- { 22, 27, 300, SEMI, MONS_BRIMSTONE_FIEND },
- { 26, 27, 150, SEMI, MONS_HELL_SENTINEL },
+ { 19, 30, 260, SEMI, MONS_TZITZIMITL },
+ { 21, 30, 280, SEMI, MONS_ICE_FIEND },
+ { 22, 30, 300, SEMI, MONS_BRIMSTONE_FIEND },
+ { 26, 27, 180, SEMI, MONS_HELL_SENTINEL },
};
static monster* _find_carnage_target(monster_type demon_type, coord_def& demon_spot)
diff --git a/crawl-ref/source/spl-summoning.cc b/crawl-ref/source/spl-summoning.cc
index b781188321..09c5f74d8f 100644
--- a/crawl-ref/source/spl-summoning.cc
+++ b/crawl-ref/source/spl-summoning.cc
@@ -421,11 +421,6 @@ spret cast_sphinx_sisters(const actor& caster, int pow, bool fail)
fail_check();
- // Remove old sphinxes first, so that we can ensure getting one of each type.
- for (monster_iterator mi; mi; ++mi)
- if (mi->was_created_by(caster, SPELL_SPHINX_SISTERS))
- monster_die(**mi, KILL_TIMEOUT, NON_MONSTER);
-
int dur = summ_dur(2);
mgen_data mdata = _summon_data(caster, MONS_SPHINX_MARAUDER, dur,
@@ -2415,6 +2410,7 @@ static const map<spell_type, summon_cap> summonsdata =
{ SPELL_SUMMON_MANA_VIPER, { 1, 3 } },
{ SPELL_CALL_IMP, { 1, 3 } },
{ SPELL_MONSTROUS_MENAGERIE, { 2, 3 } },
+ // Cap applied separately to the sphinx types.
{ SPELL_SPHINX_SISTERS, { 2, 2 } },
{ SPELL_SUMMON_HORRIBLE_THINGS, { 8, 8 } },
{ SPELL_FORGE_LIGHTNING_SPIRE, { 1, 1 } },
@@ -2533,6 +2529,9 @@ void summoned_monster(const monster *mons, const actor *caster,
cap = (mons->type == MONS_ABOMINATION_LARGE ? cap * 3 / 4
: cap * 1 / 4);
}
+ // Cap the two sphinx types separately.
+ else if (spell == SPELL_SPHINX_SISTERS)
+ cap = cap / 2;
// Only the simulacra themselves are capped with this spell. Blocks of ice
// are free.
else if (spell == SPELL_SIMULACRUM && mons->type != MONS_SIMULACRUM)
@@ -2562,9 +2561,11 @@ void summoned_monster(const monster *mons, const actor *caster,
if (summ.degree != spell)
continue;
- // Count large abominations and tentacled monstrosities separately.
+ // Count the different summons of various spells separately.
// (And don't count blocks of ice at all.)
- if ((spell == SPELL_SUMMON_HORRIBLE_THINGS || spell == SPELL_SIMULACRUM)
+ if ((spell == SPELL_SUMMON_HORRIBLE_THINGS
+ || spell == SPELL_SIMULACRUM
+ || spell == SPELL_SPHINX_SISTERS)
&& mi->type != mons->type)
{
continue;
--
Dungeon Crawl Stone Soup
|
|
From: <gi...@cr...> - 2026-04-27 19:55:15
|
via dab29871b023f1d8b9d9a3e053155bffe36dccb0 (commit)
via 48a7874ca41b0c6693c07f05b8c18cf6d7083a61 (commit)
from dc5f4587a6246f8ffacda58fe5672074fec9b077 (commit)
-----------------------------------------------------------------------
commit dab29871b023f1d8b9d9a3e053155bffe36dccb0
Author: Hellmonk <nld...@gm...>
Date: Mon Apr 27 14:53:23 2026 -0500
buff archery ego (#5095)
To make it more attractive, reduce enc to 1/3rd for ranged using it
instead of
half. This makes plate equivalent to acid scales for the purpose of
ranged.
Since there are already tradeoffs wrt strength requirement and evasion,
this
may help expand the archery ego's niche slightly.
commit 48a7874ca41b0c6693c07f05b8c18cf6d7083a61
Author: Monkooky <bui...@gm...>
Date: Mon Apr 27 14:50:13 2026 -0500
Update mon creation docs (#5224)
Adds instructions for the monster creation docs for actually
implementing monster tiles.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/docs/develop/monster_creation.txt | 5 +++++
crawl-ref/source/dat/descript/egos.txt | 2 +-
crawl-ref/source/player.cc | 2 +-
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/crawl-ref/docs/develop/monster_creation.txt b/crawl-ref/docs/develop/monster_creation.txt
index 209b3267b2..ea54b00b3f 100644
--- a/crawl-ref/docs/develop/monster_creation.txt
+++ b/crawl-ref/docs/develop/monster_creation.txt
@@ -102,6 +102,11 @@ These files handle the monster's visuals and other fluff. Become pretty today!
- Place it in an appropriate subdirectory.
- If you can't think of an appropriate subdir, leave it in /mon/ and it'll
eventually be sorted.
+- /source/rltiles/dc-mon.txt
+ -Find the line %sdir mon/<subdirectory>, based on the subdirectory you placed
+ the tile in.
+ -Add an entry with the name of the tile and the monster's enum somewhere below
+ that line.
- /source/rltiles/dc-corpse.txt
- Add an entry so the game will generate a squashed & bloody version
of the monster's tile for corpses.
diff --git a/crawl-ref/source/dat/descript/egos.txt b/crawl-ref/source/dat/descript/egos.txt
index 8c80e8e1ca..06dea2ce71 100644
--- a/crawl-ref/source/dat/descript/egos.txt
+++ b/crawl-ref/source/dat/descript/egos.txt
@@ -148,7 +148,7 @@ It enhances your Air magic.
%%%%
archery (Archery) armour ego
-It has half the normal encumbrance for the purpose of ranged combat.
+It has one-third the normal encumbrance for the purpose of ranged combat.
%%%%
attunement (Attunement) armour ego
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 20f892ae49..6aedd9a4c7 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -6149,7 +6149,7 @@ int player::unadjusted_body_armour_penalty(bool archery) const
if (!body_armour)
return 0;
- int rfactor = archery && you.wearing_ego(OBJ_ARMOUR, SPARM_ARCHERY) ? 2 : 1;
+ int rfactor = archery && you.wearing_ego(OBJ_ARMOUR, SPARM_ARCHERY) ? 3 : 1;
// PARM_EVASION is always less than or equal to 0
return max(0, -property(*body_armour, PARM_EVASION) / 10 / rfactor
--
Dungeon Crawl Stone Soup
|