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
(152) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <gi...@cr...> - 2025-07-22 03:50:15
|
via 561764f35a2c1a202ac98321f5b5af6fc4d2b119 (commit) from da159a28c5593fbeb62f542bf7ad74c60abf8768 (commit) ----------------------------------------------------------------------- commit 561764f35a2c1a202ac98321f5b5af6fc4d2b119 Author: Implojin <imp...@gm...> Date: Mon Jul 21 22:39:28 2025 -0500 qvfnyybj nabgure ehqr vgrz anzr Sbyybjvat sebz n0o03r459q. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/item-name.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crawl-ref/source/item-name.cc b/crawl-ref/source/item-name.cc index 72ce3c91c7..6ff6142a91 100644 --- a/crawl-ref/source/item-name.cc +++ b/crawl-ref/source/item-name.cc @@ -2408,7 +2408,8 @@ static string _unforbid(string name) "puvax", "snt", "avt", "avttre", "xvxr", "ovgpu", "juber", "tvzc", "ergneq", "phag", "pbba", "fdhnj", - "jbt", "qlxr", "ubzb", "genaal" + "jbt", "qlxr", "ubzb", "genaal", + "anmv" }; auto parts = split_string(" ", name); for (size_t i = 0; i < parts.size(); i++) -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-22 03:00:17
|
via da159a28c5593fbeb62f542bf7ad74c60abf8768 (commit) from d36b845a409c0b4b6bab2859d4ba2eac18682136 (commit) ----------------------------------------------------------------------- commit da159a28c5593fbeb62f542bf7ad74c60abf8768 Author: hellmonk <nld...@gm...> Date: Mon Jul 21 21:51:32 2025 -0500 Allow default targeting harmless friends Don't check that the monster is threatening when deciding whether or not to target them with ally-targeting spells, since those spells can be assumed to be beneficial. As far as I can tell, this only affects Percussive Tempering at the moment. Closes #4434. Fixes #4343. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/directn.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc index cc7616244e..563af40107 100644 --- a/crawl-ref/source/directn.cc +++ b/crawl-ref/source/directn.cc @@ -2883,7 +2883,7 @@ static void _describe_oos_square(const coord_def& where) static bool _want_target_monster(const monster *mon, targ_mode_type mode, targeter* hitfunc) { - if (!mons_is_threatening(*mon)) + if (!mons_is_threatening(*mon) && mode != TARG_FRIEND) return false; if (hitfunc && !hitfunc->affects_monster(monster_info(mon))) -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-22 02:45:14
|
via d36b845a409c0b4b6bab2859d4ba2eac18682136 (commit) from 525eb422377a87c00ea1131aecb8aae12b634b47 (commit) ----------------------------------------------------------------------- commit d36b845a409c0b4b6bab2859d4ba2eac18682136 Author: hellmonk <nld...@gm...> Date: Mon Jul 21 21:40:33 2025 -0500 Fix ally cloud death attribution (RypoFalem) Using a slightly different attribution message. Closes #4671. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/hiscores.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crawl-ref/source/hiscores.cc b/crawl-ref/source/hiscores.cc index 64976d20a7..0bebba0fb1 100644 --- a/crawl-ref/source/hiscores.cc +++ b/crawl-ref/source/hiscores.cc @@ -1423,6 +1423,9 @@ void scorefile_entry::init_death_cause(int dam, mid_t dsrc, if (mons->mid == MID_YOU_FAULTLESS) death_source_name = "themself"; + if (mons->mid == MID_ANON_FRIEND) + death_source_name = "an ally"; + if (mons->has_ench(ENCH_SHAPESHIFTER)) death_source_name += " (shapeshifter)"; else if (mons->has_ench(ENCH_GLOWING_SHAPESHIFTER)) -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-22 02:05:10
|
via 525eb422377a87c00ea1131aecb8aae12b634b47 (commit) from 4ac789b6285661837dd5120f94a9dcda6e0efe61 (commit) ----------------------------------------------------------------------- commit 525eb422377a87c00ea1131aecb8aae12b634b47 Author: WizardIke <ik...@ya...> Date: Tue Jul 22 14:03:50 2025 +1200 Fix a crash when examining a monster with unknown wand (#4499) There are various bugs that can result in a monster being in view with an unidentified wand and it would be better not to crash when examining them. For example, monsters opening doors or peeking down a stairscase in descent mode etc can result in you seeing monsters with unidentified wands. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/mon-info.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crawl-ref/source/mon-info.cc b/crawl-ref/source/mon-info.cc index cfe9a0efa4..a0c8037487 100644 --- a/crawl-ref/source/mon-info.cc +++ b/crawl-ref/source/mon-info.cc @@ -1866,8 +1866,7 @@ bool monster_info::has_spells() const } // Wand spells - const item_def* wand = inv[MSLOT_WAND].get(); - if (itemuse() >= MONUSE_STARTING_EQUIPMENT && wand) + if (get_wand_spell() != SPELL_NO_SPELL) return true; const mon_spellbook_type book = get_spellbook(*this); @@ -1908,7 +1907,9 @@ spell_type monster_info::get_wand_spell() const return SPELL_NO_SPELL; const wand_type wandtyp = static_cast<wand_type>(wand->sub_type); - ASSERT(wandtyp < NUM_WANDS); + // Don't count unidentified wands + if (wandtyp >= NUM_WANDS) + return SPELL_NO_SPELL; return spell_in_wand(wandtyp); } -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-22 00:05:15
|
via 4ac789b6285661837dd5120f94a9dcda6e0efe61 (commit) from 17903823d94ce39328fbfdf6120fdddecece2451 (commit) ----------------------------------------------------------------------- commit 4ac789b6285661837dd5120f94a9dcda6e0efe61 Author: David Lawrence Ramsey <poo...@gm...> Date: Mon Jul 21 19:00:57 2025 -0500 Fix typo (Flugkiller). Closes #4672. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/descript/mutations.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crawl-ref/source/dat/descript/mutations.txt b/crawl-ref/source/dat/descript/mutations.txt index 6bf3242408..06f972ee5c 100644 --- a/crawl-ref/source/dat/descript/mutations.txt +++ b/crawl-ref/source/dat/descript/mutations.txt @@ -1391,7 +1391,7 @@ resistance. electrospasm bane When you are damaged by electricity, you have a chance to become bound in place -and unable to move for a short length of time. This chance is decrease by your +and unable to move for a short length of time. This chance is decreased by your current level of electrical resistance. %%%% claustrophobia bane -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-21 22:20:11
|
via 17903823d94ce39328fbfdf6120fdddecece2451 (commit) via f1afc118e7520f5d9aaa82a7e9a3960265966717 (commit) via c60012f9c2790db15e42212a264ca5cef592e103 (commit) from c8c058ed602c7e783f1b8c1d7b1810a4241932e8 (commit) ----------------------------------------------------------------------- commit 17903823d94ce39328fbfdf6120fdddecece2451 Author: regret-index <clo...@ho...> Date: Mon Jul 21 19:38:07 2025 -0230 Quick fix-ups vault review (+ #4572, #4574, #4649) A fistful of minor adjustments, like fixing up some hidden or missing monsters, tweaking the flavour displays of various vaults, and moving a vault to the right file after its depths were changed. Alongside this, I've also put the midnight gem back in spin_cycle after eee5569 broke it (which fixes #4649), added a little bit of connectors to due_jungle_book after 57f10a3 introduced a teleport closet (which fixes #4574, and fixed up bad connector placements in swamp_pool_[3|4|5] as eadf994 mishandled (which fixes #4572). commit f1afc118e7520f5d9aaa82a7e9a3960265966717 Author: regret-index <clo...@ho...> Date: Mon Jul 21 18:27:29 2025 -0230 Juggernaut simulacrum tile (LemurRobot) Adjusted a little bit in colour and details from the submission. Now we just need a spectral juggernaut tile to finish off the full set. commit c60012f9c2790db15e42212a264ca5cef592e103 Author: regret-index <clo...@ho...> Date: Mon Jul 21 17:55:00 2025 -0230 Adjust various tiles old and new * The spell icon for Gloom was missed in 589dcd5, which this adds in properly. As before, it is composited from Denzi's old Abjuration icon plus ontoclasm's previous Dazzling Flash tile. * I've got some interest in making a new cyclops monster later this version, which inevitably ends up highlighting how CanOfWorms's Polyphemus tile added in de3053d isn't very easy to distinguish from the base cyclops itself. To try and help this state for the future, I've recoloured his cape and bracelets to hopefully stand out more against the default terrain colours of Shoals. * An accidental older draft of the dragon draugr tile added in 98bede3 and missed for being misspelt has been removed from the repository, while the old arenasprint orbs have been moved to rltiles/UNUSED after being removed in 9245ba7. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/des/arrival/small.des | 31 ++++++++++--------- .../source/dat/des/branches/depths_encompass.des | 2 ++ crawl-ref/source/dat/des/branches/lair.des | 19 +++++++++++- crawl-ref/source/dat/des/branches/orc.des | 18 ++++++----- crawl-ref/source/dat/des/branches/swamp.des | 8 ++--- crawl-ref/source/dat/des/portals/trove.des | 5 +-- crawl-ref/source/dat/des/variable/d_encompass.des | 2 +- crawl-ref/source/dat/des/variable/float.des | 2 +- .../source/dat/des/variable/mini_monsters.des | 34 ++------------------- .../monsters}/orb_of_electricity.png | Bin .../{mon/sprint => UNUSED/monsters}/orb_of_ice.png | Bin crawl-ref/source/rltiles/dc-mon.txt | 3 -- crawl-ref/source/rltiles/dc-spells.txt | 2 +- crawl-ref/source/rltiles/dc-zombie.txt | 1 + .../gui/spells/enchantment/dazzling_flash.png | Bin 7198 -> 0 bytes .../rltiles/gui/spells/enchantment/gloom.png | Bin 0 -> 7586 bytes .../rltiles/mon/undead/draugr/draugur_dragon.png | Bin 1401 -> 0 bytes .../mon/undead/simulacra/simulacrum_juggernaut.png | Bin 0 -> 1379 bytes crawl-ref/source/rltiles/mon/unique/polyphemus.png | Bin 561 -> 9359 bytes crawl-ref/source/spl-data.h | 2 +- crawl-ref/source/tilepick.cc | 3 +- 21 files changed, 64 insertions(+), 68 deletions(-) rename crawl-ref/source/rltiles/{mon/sprint => UNUSED/monsters}/orb_of_electricity.png (100%) rename crawl-ref/source/rltiles/{mon/sprint => UNUSED/monsters}/orb_of_ice.png (100%) delete mode 100644 crawl-ref/source/rltiles/gui/spells/enchantment/dazzling_flash.png create mode 100644 crawl-ref/source/rltiles/gui/spells/enchantment/gloom.png delete mode 100644 crawl-ref/source/rltiles/mon/undead/draugr/draugur_dragon.png create mode 100644 crawl-ref/source/rltiles/mon/undead/simulacra/simulacrum_juggernaut.png diff --git a/crawl-ref/source/dat/des/arrival/small.des b/crawl-ref/source/dat/des/arrival/small.des index 377457bd9b..fc1b537803 100644 --- a/crawl-ref/source/dat/des/arrival/small.des +++ b/crawl-ref/source/dat/des/arrival/small.des @@ -2654,31 +2654,33 @@ xxDxxxDxxxDxxxDxx ENDMAP ############################################################################## -NAME: sevenhm_arrival_forest_fort_small_1 -TAGS: arrival no_monster_gen -ORIENT: float -WEIGHT: 1 -KPROP: 1 = no_tele_into -NSUBST: { = { / T> , z = + / n+ -SUBST: T = TTG +NAME: sevenhm_arrival_forest_fort_small_1 +TAGS: arrival no_monster_gen +ORIENT: float +WEIGHT: 1 +KMONS: 12 = bullfrog / cane toad / yak +KPROP: 1 = no_tele_into +NSUBST: { = { / T> , z = + / n+ +SUBST: T = TTG : if crawl.one_chance_in(4) then SUBST: " : +, ' : . , - : ccc. : else SUBST: "'- : c : end -MONS: bullfrog / cane toad / yak / death yak w:1 / elephant +SHUFFLE: 2N / `` +SUBST: ` = t MAP ccccccccc cccctccccctcccc - cctt1tc...ct1ttcc - cccttttnc.{.cnttttccc + cctt1tc...ct2ttcc + cccttttnc.{.cNttttccc ccccccccn...ncccccccc WWcc..+.......+..ccWW @WWz..."'-----'"...zWW@ WWcc..+.......+..ccWW ccccccccn...ncccccccc - ccctttttc.{.ctttttccc - cctt1tc...ct1ttcc + cccttttNc.{.cnttttccc + cctt2tc...ct1ttcc cccctccccctcccc ccccccccc ENDMAP @@ -2835,8 +2837,9 @@ ORIENT: float COLOUR: W# = lightgreen NSUBST: W = 6:% / 7:# KITEM: % = nothing / w:5 river rat skeleton -MARKER: # = lua:fog_machine { cloud_type = "foul pestilence", pow_max = 10, \ - delay = 5, size = 5, excl_rad = 0 } +MARKER: # = lua:fog_machine { cloud_type = "foul pestilence", pow_min = 5, \ + pow_max = 10, delay = 30, size = 5, \ + start_clouds = 5, walk_dist = 3, excl_rad = 0 } KFEAT: %# = W KPROP: W#% = no_tele_into MAP diff --git a/crawl-ref/source/dat/des/branches/depths_encompass.des b/crawl-ref/source/dat/des/branches/depths_encompass.des index 1342e069eb..68c2b6b20c 100644 --- a/crawl-ref/source/dat/des/branches/depths_encompass.des +++ b/crawl-ref/source/dat/des/branches/depths_encompass.des @@ -795,6 +795,7 @@ MONS: spriggan defender w:30 / titan w:30 / ancient lich w:30 / \ draconian annihilator / draconian knight KMONS: Zd = draconian knight / draconian annihilator KITEM: d = midnight gem +KITEM: * = * KFEAT: z^ = harlequin's trap KFEAT: Z = enter_zot KFEAT: ~ = zot_statue @@ -818,6 +819,7 @@ SUBST: )]}> = ., e = ~, ?_ = ^, fghi"` = ' SUBST: defghi'"`Z?_ = . : end MARKER: Y = lua:props_marker { portal=1 } +: decorative_floor(_G, '*', "flower patch") FTILE: Z~'^ = floor_marble LFLOORTILE: floor_depthstone MAP diff --git a/crawl-ref/source/dat/des/branches/lair.des b/crawl-ref/source/dat/des/branches/lair.des index 3668632d51..6a00326c2e 100644 --- a/crawl-ref/source/dat/des/branches/lair.des +++ b/crawl-ref/source/dat/des/branches/lair.des @@ -3634,6 +3634,23 @@ PwwwwwwP;-+---;x".""""xx xx ENDMAP +NAME: nzn_masters_of_martial_movement +TAGS: no_pool_fixup no_monster_gen +DEPTH: Lair +KFEAT: D = altar_wu_jian +KFEAT: E = altar_uskayaw +MONS: patrolling boulder beetle +SUBST: W : W:50 w:40 l +MAP + x...@...x +xxW.W.W.Wxx +.W.W.W.W.W. +@.W.D1E.W.@ +.W.W.W.W.W. +xxW.W.W.Wxx + x...@...x +ENDMAP + NAME: nicolae_lair_grazing_beasts TAGS: no_pool_fixup patrolling transparent DEPTH: Lair @@ -4251,7 +4268,7 @@ xxxc*DE..qccccccc-cccWqcccGpGcccqqccc-cccccccq..HF*cc. xxxcGEEqqqccttaccp-pcccccGpYpGccnncp-pccattccqqqHHGcc. xxcccccccctq..qccc-----------------cccq..qtcccccccc.. .axacccatq.. .qtcccccccc+++cccccccctq. .qqtcccatq. - .......... .........8@@@....a..... ........ + .......... .........8@@@....a...@@ ........ ENDMAP ############################################################################## diff --git a/crawl-ref/source/dat/des/branches/orc.des b/crawl-ref/source/dat/des/branches/orc.des index 620f84b074..ddef7c9cac 100644 --- a/crawl-ref/source/dat/des/branches/orc.des +++ b/crawl-ref/source/dat/des/branches/orc.des @@ -217,22 +217,26 @@ ORIENT: float MONS: orc warrior, orc priest / orc wizard, orc w:100 / orc warrior : if you.absdepth() >= 10 and crawl.one_chance_in(10) then MONS: orc knight -SUBST: G = . +SUBST: ? = . : else -MONS: orc warrior -SUBST: G = 4 +MONS: orc warrior +SUBST: ? = 4 : end -SUBST: c = c:1000 x KFEAT: O = enter_orcish_mines +: if crawl.one_chance_in(100) then +SUBST: X = x +: else +SUBST: X = c +: end MAP ............................. .Iwwwwwwwwwwwwwwwwwwwwwwwwww. .wIwwwwwwwwwwwwwwwwwwwwwwwww. .ww2+cccccccccccccccccccccww. .ww.c.......3.3.3......w2cww. -.wwxx........3.3.......cccww. -.122........3.I.3.....G4Ocww. -.wwxx........3.3.......cccww. +.wwxx........3.3.......XXXww. +.122........3.I.3.....?4Ocww. +.wwxx........3.3.......XXXww. .ww.c.......3.3.3......w2cww. .ww2+cccccccccccccccccccccww. .wIwwwwwwwwwwwwwwwwwwwwwwwww. diff --git a/crawl-ref/source/dat/des/branches/swamp.des b/crawl-ref/source/dat/des/branches/swamp.des index f75757e85d..26ff5f6611 100644 --- a/crawl-ref/source/dat/des/branches/swamp.des +++ b/crawl-ref/source/dat/des/branches/swamp.des @@ -387,7 +387,7 @@ MAP '""w"tt twwww"t '""wwtt - ttw"t' + ttw"tt 'tt' ENDMAP @@ -401,7 +401,7 @@ MAP ''www't 'twwwwwtt wwwww"tt -'twww"tt' +'twww"ttt ttwww"tt ttw'tt ENDMAP @@ -414,8 +414,8 @@ KFEAT: 1 = deep_water SUBST: " = ttttw NSUBST: ' = 1:@ / * = ttW MAP - 't't' -tt"""t' + 't'tt +ttw""tt t"w1w"tt ww1ww"tt t"w1t"t diff --git a/crawl-ref/source/dat/des/portals/trove.des b/crawl-ref/source/dat/des/portals/trove.des index 05c4f859f5..c5ebc5ef47 100644 --- a/crawl-ref/source/dat/des/portals/trove.des +++ b/crawl-ref/source/dat/des/portals/trove.des @@ -766,8 +766,9 @@ ENDMAP # Layout directly adjusting due's trove_library. NAME: regret_index_trove_ozocubu : trove_setup(_G) -MONS: block of ice -# dream sheep / hell hog / alligator / anaconda / hydra / caustic shrike +MONS: dream sheep-shaped block of ice / hell hog-shaped block of ice / \ + anaconda-shaped block of ice / alligator-shaped block of ice / \ + hydra-shaped block of ice / caustic shrike-shaped block of ice w:2 NSUBST: d = 6:d / *:?, g = 6:g / *:? {{ trove_offense(_G, trove_weap_brand(_G, "freezing"), diff --git a/crawl-ref/source/dat/des/variable/d_encompass.des b/crawl-ref/source/dat/des/variable/d_encompass.des index 5df0b51a73..c6d09a3cb6 100644 --- a/crawl-ref/source/dat/des/variable/d_encompass.des +++ b/crawl-ref/source/dat/des/variable/d_encompass.des @@ -197,7 +197,7 @@ KFEAT: B = zot_statue KFEAT: Z = enter_zot KITEM: r = midnight gem NSUBST: (D = 1:Z -SUBST: f = B, 2 = t +SUBST: f = B, 2 = r : end : else SUBST: A&@ = a, _ = -, l = W diff --git a/crawl-ref/source/dat/des/variable/float.des b/crawl-ref/source/dat/des/variable/float.des index 4cf5ab6be5..eb14dd1c8e 100644 --- a/crawl-ref/source/dat/des/variable/float.des +++ b/crawl-ref/source/dat/des/variable/float.des @@ -2167,6 +2167,7 @@ NAME: onia_ninara_swampy_vault TAGS: no_pool_fixup no_monster_gen DEPTH: Lair:3-, !Lair:$, Depths, !Depths:$ ORIENT: float +SUBST: " = .:2 x:1 W:4 P:1 w:3, - = .:9 W:2 : if you.in_branch("Lair") then KMONS: 1 = tyrant leech / swamp worm w:50 / \ vampire mosquito band / goliath frog / swamp drake w:15 @@ -2193,7 +2194,6 @@ KFEAT: 1324P = W NSUBST: @ = 1:@ / *:X SUBST: x = w:30 x:4, X = x SUBST: ` = wwwxxt, ~ = w:9 x:1 t:1 -SUBST: " = .:2 x:1 W:4 P:1 w:3, - = .:9 W:2 KPROP: wP = no_tele_into MAP XXXXXXXXXXXXXXxxx@xxxxxxxxxxxxxxx diff --git a/crawl-ref/source/dat/des/variable/mini_monsters.des b/crawl-ref/source/dat/des/variable/mini_monsters.des index 3e2d7235c8..b1dcee25b2 100644 --- a/crawl-ref/source/dat/des/variable/mini_monsters.des +++ b/crawl-ref/source/dat/des/variable/mini_monsters.des @@ -351,23 +351,6 @@ MAP .... ENDMAP -NAME: nzn_masters_of_martial_movement -TAGS: no_pool_fixup no_monster_gen -DEPTH: Lair -KFEAT: D = altar_wu_jian -KFEAT: E = altar_uskayaw -MONS: patrolling boulder beetle -SUBST: W : W:50 w:40 l -MAP - x...@...x -xxW.W.W.Wxx -.W.W.W.W.W. -@.W.D1E.W.@ -.W.W.W.W.W. -xxW.W.W.Wxx - x...@...x -ENDMAP - NAME: nzn_sisyphean_effort DEPTH: D:9-12, Lair MONS: patrolling boulder beetle @@ -2555,7 +2538,7 @@ ENDMAP # Very hungry Elvish explorers and their campfire, mounts and pet. # Sometimes they have starved to death. NAME: beargit_elvish_explorers -DEPTH: D:12-, Depths, Swamp, Snake, Spider, Crypt +DEPTH: D:12-, Depths, Crypt TAGS: transparent patrolling no_monster_gen no_trap_gen : if you.in_branch("D") then : if you.depth() < 14 then @@ -2570,14 +2553,6 @@ MONS: deep elf knight; lajatang good_item . scale mail good_item MONS: elephant / dire elephant, warg / hell hound / raiju : end MONS: plant / fungus, nothing -: elseif you.in_branch("Swamp") or you.in_branch("Spider") -: or you.in_branch("Snake") then -MONS: deep elf archer; longbow good_item . quarterstaff \ - . robe good_item -MONS: deep elf knight; lajatang good_item . chain mail good_item -MONS: dire elephant -MONS: hell hound / raiju -MONS: fungus / nothing, nothing : elseif you.in_branch("Crypt") then KITEM: 1 = longbow good_item, quarterstaff, robe good_item KITEM: 2 = lajatang good_item, chain mail good_item @@ -2587,7 +2562,7 @@ KMONS: 3 = spectral hellephant KMONS: 4 = spectral shadow dragon KMONS: 6 = deep elf death mage w:30 / vampire mage / \ lich / ancient lich / dread lich -KITEM: P = rat +KITEM: P = rat skeleton SUBST: 5 = - : else # The elves have mastered the dungeon and allied with the darkness. @@ -2604,11 +2579,6 @@ COLOUR: t = brown TILE: t = dngn_tree_dead : set_feature_name("tree", "dead tree") FTILE: - = floor_crypt -: elseif you.in_branch("Swamp") then -SUBST: - = --....W, x = t -FTILE: -123456t = floor_grass -: elseif you.in_branch("Spider") then -SUBST: t = x : else FTILE: -123456t = floor_grass FTILE: P = floor_sand diff --git a/crawl-ref/source/rltiles/mon/sprint/orb_of_electricity.png b/crawl-ref/source/rltiles/UNUSED/monsters/orb_of_electricity.png similarity index 100% rename from crawl-ref/source/rltiles/mon/sprint/orb_of_electricity.png rename to crawl-ref/source/rltiles/UNUSED/monsters/orb_of_electricity.png diff --git a/crawl-ref/source/rltiles/mon/sprint/orb_of_ice.png b/crawl-ref/source/rltiles/UNUSED/monsters/orb_of_ice.png similarity index 100% rename from crawl-ref/source/rltiles/mon/sprint/orb_of_ice.png rename to crawl-ref/source/rltiles/UNUSED/monsters/orb_of_ice.png diff --git a/crawl-ref/source/rltiles/dc-mon.txt b/crawl-ref/source/rltiles/dc-mon.txt index 18faeb760c..d5dc2d53a7 100644 --- a/crawl-ref/source/rltiles/dc-mon.txt +++ b/crawl-ref/source/rltiles/dc-mon.txt @@ -1367,9 +1367,6 @@ nobody2 ## Sprint specials %sdir mon/sprint dimme MONS_DIMME -%rim 0 -orb_of_ice MONS_ORB_OF_ICE -orb_of_electricity MONS_ORB_OF_ELECTRICITY %rim 1 %include dc-zombie.txt diff --git a/crawl-ref/source/rltiles/dc-spells.txt b/crawl-ref/source/rltiles/dc-spells.txt index a7bde18744..35e9e20b65 100644 --- a/crawl-ref/source/rltiles/dc-spells.txt +++ b/crawl-ref/source/rltiles/dc-spells.txt @@ -44,10 +44,10 @@ cause_fear CAUSE_FEAR confuse CONFUSE confusing_touch CONFUSING_TOUCH corona CORONA -dazzling_flash DAZZLING_FLASH discord DISCORD enfeeble ENFEEBLE charming CHARMING +gloom GLOOM haste HASTE invisibility INVISIBILITY jinxbite JINXBITE diff --git a/crawl-ref/source/rltiles/dc-zombie.txt b/crawl-ref/source/rltiles/dc-zombie.txt index 74427de424..fa1340805a 100644 --- a/crawl-ref/source/rltiles/dc-zombie.txt +++ b/crawl-ref/source/rltiles/dc-zombie.txt @@ -131,6 +131,7 @@ simulacrum_spider MONS_SIMULACRUM_SPIDER simulacrum_slime MONS_SIMULACRUM_SLIME simulacrum_eye MONS_SIMULACRUM_EYE simulacrum_x MONS_SIMULACRUM_X +simulacrum_juggernaut MONS_SIMULACRUM_JUGGERNAUT simulacrum_dragon MONS_SIMULACRUM_DRAGON simulacrum_kraken MONS_SIMULACRUM_KRAKEN simulacrum_drake MONS_SIMULACRUM_DRAKE diff --git a/crawl-ref/source/rltiles/gui/spells/enchantment/dazzling_flash.png b/crawl-ref/source/rltiles/gui/spells/enchantment/dazzling_flash.png deleted file mode 100644 index c69ea3040d..0000000000 Binary files a/crawl-ref/source/rltiles/gui/spells/enchantment/dazzling_flash.png and /dev/null differ diff --git a/crawl-ref/source/rltiles/gui/spells/enchantment/gloom.png b/crawl-ref/source/rltiles/gui/spells/enchantment/gloom.png new file mode 100644 index 0000000000..e043206eee Binary files /dev/null and b/crawl-ref/source/rltiles/gui/spells/enchantment/gloom.png differ diff --git a/crawl-ref/source/rltiles/mon/undead/draugr/draugur_dragon.png b/crawl-ref/source/rltiles/mon/undead/draugr/draugur_dragon.png deleted file mode 100644 index 9942981ad9..0000000000 Binary files a/crawl-ref/source/rltiles/mon/undead/draugr/draugur_dragon.png and /dev/null differ diff --git a/crawl-ref/source/rltiles/mon/undead/simulacra/simulacrum_juggernaut.png b/crawl-ref/source/rltiles/mon/undead/simulacra/simulacrum_juggernaut.png new file mode 100644 index 0000000000..550b298467 Binary files /dev/null and b/crawl-ref/source/rltiles/mon/undead/simulacra/simulacrum_juggernaut.png differ diff --git a/crawl-ref/source/rltiles/mon/unique/polyphemus.png b/crawl-ref/source/rltiles/mon/unique/polyphemus.png index 40cd699d35..7867563543 100644 Binary files a/crawl-ref/source/rltiles/mon/unique/polyphemus.png and b/crawl-ref/source/rltiles/mon/unique/polyphemus.png differ diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index 7be84c76ec..837a42ca0e 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -2115,7 +2115,7 @@ static const struct spell_desc spelldata[] = 50, 2, 3, 0, - TILEG_DAZZLING_FLASH, + TILEG_GLOOM, }, { diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc index 3bd754869a..4b5a4a0204 100644 --- a/crawl-ref/source/tilepick.cc +++ b/crawl-ref/source/tilepick.cc @@ -1253,9 +1253,10 @@ static tileidx_t _zombie_tile_to_simulacrum(const tileidx_t z_tile) case TILEP_MONS_ZOMBIE_LARGE: case TILEP_MONS_ZOMBIE_OGRE: case TILEP_MONS_ZOMBIE_TROLL: - case TILEP_MONS_ZOMBIE_JUGGERNAUT: case TILEP_MONS_ZOMBIE_UGLY_THING: return TILEP_MONS_SIMULACRUM_LARGE; + case TILEP_MONS_ZOMBIE_JUGGERNAUT: + return TILEP_MONS_SIMULACRUM_JUGGERNAUT; case TILEP_MONS_ZOMBIE_QUADRUPED_SMALL: case TILEP_MONS_ZOMBIE_BEAR: case TILEP_MONS_ZOMBIE_DREAM_SHEEP: -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-21 20:55:14
|
via c8c058ed602c7e783f1b8c1d7b1810a4241932e8 (commit) via e980eeb3ff919ebb1c5cea645db740731e2776f9 (commit) from 6b72936f9e1b77d15931cd484ba2f6e48f227034 (commit) ----------------------------------------------------------------------- commit c8c058ed602c7e783f1b8c1d7b1810a4241932e8 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 18:23:26 2025 -0230 Fix show_paged_inventory option It was still showing the merged inventory immediately after opening. commit e980eeb3ff919ebb1c5cea645db740731e2776f9 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 18:22:35 2025 -0230 Allow using tab/shift+tab to switch between inventory pages (hollowman) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/cmd-keys.h | 2 ++ crawl-ref/source/invent.cc | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crawl-ref/source/cmd-keys.h b/crawl-ref/source/cmd-keys.h index d3b5960a58..87f5358fcc 100644 --- a/crawl-ref/source/cmd-keys.h +++ b/crawl-ref/source/cmd-keys.h @@ -373,7 +373,9 @@ {CK_DOWN, CMD_MENU_DOWN}, {CK_SHIFT_UP, CMD_MENU_LINE_UP}, {CK_RIGHT, CMD_MENU_RIGHT}, +{CK_TAB, CMD_MENU_RIGHT}, {CK_LEFT, CMD_MENU_LEFT}, +{CK_SHIFT_TAB, CMD_MENU_LEFT}, {CK_SHIFT_DOWN, CMD_MENU_LINE_DOWN}, {CK_SHIFT_LEFT, CMD_MENU_LINE_UP}, // some terms don't have shift-up/down available by default {CK_SHIFT_RIGHT, CMD_MENU_LINE_DOWN}, diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 937558b36f..eb88157d80 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -1458,7 +1458,7 @@ void display_inventory() flags |= MF_PAGED_INVENTORY; InvMenu menu(flags); - menu.load_inv_items(OSEL_ANY, -1); + menu.load_inv_items(Options.show_paged_inventory ? OSEL_GEAR : OSEL_ANY, -1); menu.set_type(menu_type::describe); menu.show(true); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-21 19:30:15
|
via 6b72936f9e1b77d15931cd484ba2f6e48f227034 (commit) via 9809850fe80f036d8486d9073c6eb52c042cb3ba (commit) via 82b35fe45686c40a1b949f3f831266f62afb9039 (commit) via 32cc9f1e2223cd480084ad0e191290f12ea408ff (commit) via ac8e67afc9925db7ad90d2915200244a4b1fce42 (commit) via 32dc36160ec11668ae7e4272cb0691817fa0ad0e (commit) via 265757be899d352db33b77ea011f072c2517a4cf (commit) via 829145972e47d3b2d2966c14f4aa241f2018dd73 (commit) via e9ddf008a973c54b322499860e80aad51f9ebfa3 (commit) from 345f232843c595c3db5d095245def53149ab243e (commit) ----------------------------------------------------------------------- commit 6b72936f9e1b77d15931cd484ba2f6e48f227034 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:56:44 2025 -0230 Don't force_more on allies getting doomed (for real this time) (Oneirical) commit 9809850fe80f036d8486d9073c6eb52c042cb3ba Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:53:38 2025 -0230 Slightly change item hotkey behavior in 'i'nventory menu Pressing a letter now jumps to the first item *below* the cursor (wrapping around, if necessary) rather than 'nearest'. This interacts better with using category hotkeys, like ?, to jump between categories, since the item you want will always be below that point, but may not be nearest that point. (And it turns out, the comment already claimed it did this, from when it used to do this during development.) commit 82b35fe45686c40a1b949f3f831266f62afb9039 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:43:38 2025 -0230 New option: show_paged_inventory If true, uses pages for the 'i' menu in the same way that the 'd'rop menu does by default. Defaults to false. commit 32cc9f1e2223cd480084ad0e191290f12ea408ff Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:20:04 2025 -0230 Fix consumable_shortcut and key mapping not working for baubles (Oneirical) commit ac8e67afc9925db7ad90d2915200244a4b1fce42 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:19:36 2025 -0230 Update drop menu help text to mention page behavior commit 32dc36160ec11668ae7e4272cb0691817fa0ad0e Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 16:19:20 2025 -0230 Remove disable-autopickup toggle from 'd'rop menu (Ge0FF) And automatically disable autopickup of dropped jewellery types (since that will almost always be the desired behavior since the inventory change). Technically there were still a few niche cases where this toggle could be useful, but it was argued that they weren't worth keeping this feature around for and I'm inclined to agree. commit 265757be899d352db33b77ea011f072c2517a4cf Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 15:58:20 2025 -0230 Improve jewellery autopickup exceptions Rather than doing 'skip picking up non-stacking rings/amulets you already have a copy of' via lua, create a new function that can answer the question of whether a piece of jewellery is strictly redundant with a little more nuance (as well as being easier to remember to maintain, since it doesn't rely on string matching). This properly accounts for an arbitrary number of current ring/amulet slots and how many copies of a given jewellery type usefully stack (ie: if you're wearing Justicar's Regalia while holding one of each amulet type, autopickup with be off for =Faith but not =Regeneration) It also stops picking up rings of a stacking type if you already have enough to fill all slots (ie: stopping at 2 for most characters). It is not *strictly* correct in all cases, but those should be niche. (For instance, octopodes will stop picking up rings of fire protection at 3, even though they might have rF- from some source. But in those cases, I think we can ask the player to manually grab more if they really want.) commit 829145972e47d3b2d2966c14f4aa241f2018dd73 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 12:13:56 2025 -0230 Remove a stray useless statement commit e9ddf008a973c54b322499860e80aad51f9ebfa3 Author: DracoOmega <dra...@gm...> Date: Mon Jul 21 12:13:17 2025 -0230 Fix options_guide description of consumable_slot (Ereinion) ^= was putting user-defined shortcuts *before* the default ones, causing them to be overriden and have no apparently effect. += should be used instead. ----------------------------------------------------------------------- Summary of changes: crawl-ref/docs/options_guide.txt | 7 +- crawl-ref/source/dat/database/help.txt | 7 +- .../source/dat/defaults/autopickup_exceptions.txt | 50 +----------- crawl-ref/source/dat/defaults/messages.txt | 2 +- crawl-ref/source/initfile.cc | 5 +- crawl-ref/source/invent.cc | 92 +++------------------- crawl-ref/source/invent.h | 20 +---- crawl-ref/source/item-prop-enum.h | 1 + crawl-ref/source/item-prop.cc | 38 +++++++++ crawl-ref/source/item-prop.h | 2 + crawl-ref/source/items.cc | 45 +++++++++-- crawl-ref/source/items.h | 2 + crawl-ref/source/l-item.cc | 14 ++++ crawl-ref/source/menu.cc | 22 +++--- crawl-ref/source/options.h | 4 +- 15 files changed, 142 insertions(+), 169 deletions(-) diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt index c6dd582d13..20e1e639e2 100644 --- a/crawl-ref/docs/options_guide.txt +++ b/crawl-ref/docs/options_guide.txt @@ -1405,7 +1405,7 @@ gear_slot ^= <regex>:<inventory letters> is on by default; overwrite mode can be disabled with a - in the list of letters. -consumable_shortcut ^= <item name>:<inventory letter> +consumable_shortcut += <item name>:<inventory letter> (Ordered list option, one value per line) Similar to gear_slot, but accepts only a single letter per consumable name and does not handle regex. @@ -1566,6 +1566,11 @@ single_column_item_menus = true This option is only available on local tiles and console; on WebTiles all menus are single-column regardless of the value of this option. +show_paged_inventory = false + If set to true, the 'i' menu will divide the player's items into + pages (gear, potions, scrolls, and evocable items) in the same way + that the 'd'rop menu does. + 3-h Message and Display Enhancements. ------------------------------------------ diff --git a/crawl-ref/source/dat/database/help.txt b/crawl-ref/source/dat/database/help.txt index 0d915d38ab..299f27795b 100644 --- a/crawl-ref/source/dat/database/help.txt +++ b/crawl-ref/source/dat/database/help.txt @@ -7,6 +7,8 @@ pick-up Use the usual navigation keys (<w>arrow</w> keys, <w>pgdn</w>/<w>pgup</w>, <w>home</w>, <w>end</w>) to select items, and <w>Space</w>/<w>.</w> to toggle whether the selected item will be picked up or dropped. Pressing an item's letter key will also toggle its pickup/drop state. +Gear, potions, scrolls, and evocable items are on separate pages which can be +switched between by <w>left arrow</w> and <w>right arrow</w>. Press <w>Return</w> to accept the current set of items. Entering a number before selecting by letter will toggle just that quantity of @@ -25,11 +27,6 @@ Global selects: <w>,</w> select all <w>*</w> invert all <w>-</w> <w>;</w> select last unequipped Note that for dropping, the <w>,</w> command uses the <w>drop_filter</w> option, which narrows the range of items to be (de)selected. The default is all useless items. - -<h>Disabling autopickup via the drop menu</h> -On the drop menu, items you select after pressing <w>\</w> will be marked with a <w>*</w> -instead of the usual <w>+</w>. Autopickup for these items will be disabled when you -leave the menu. To return to the normal selection mode, press <w>\</w> a second time. %%%% known-menu diff --git a/crawl-ref/source/dat/defaults/autopickup_exceptions.txt b/crawl-ref/source/dat/defaults/autopickup_exceptions.txt index 18eb6b5838..2cfffb3d82 100644 --- a/crawl-ref/source/dat/defaults/autopickup_exceptions.txt +++ b/crawl-ref/source/dat/defaults/autopickup_exceptions.txt @@ -28,32 +28,6 @@ ae += >horn of Geryon, <evoker ae += <good_item -# If you've sacrificed a hand, don't pick up pointless duplicate rings -:add_autopickup_func(function (it, name) -: local itsubtype = it.subtype() -: if it.class(true) == "jewellery" -: and you.mutation("missing a hand") == 1 and you.race() ~= "octopode" -: and (itsubtype == "ring of positive energy" -: or itsubtype == "ring of flight" -: or itsubtype == "ring of poison resistance" -: or itsubtype == "ring of wizardry" -: or itsubtype == "ring of protection from fire" -: or itsubtype == "ring of protection from cold" -: or itsubtype == "ring of resist corrosion" -: or itsubtype == "ring of see invisible" -: or itsubtype == "ring of magical power" -: or itsubtype == "ring of ice" -: or itsubtype == "ring of fire") then -: for inv in iter.invent_iterator:new(items.inventory()) do -: if it.class(true) == inv.class(true) -: and itsubtype == inv.subtype() then -: return false -: end -: end -: end -: return -:end) - : add_autopickup_func(function (it, name) : return it.stacks() or nil : end) @@ -61,26 +35,8 @@ ae += <good_item # Excluding most amulets as you only need one of each. Likewise for some # rings. Some items may already be excluded as bad_item, e.g. inaccuracy. :add_autopickup_func(function (it, name) -: if (not it.class(true) == "jewellery") or it.artefact then -: return -: end -: local itsubtype = it.subtype() -: if itsubtype == "amulet of faith" -: or itsubtype == "amulet of guardian spirit" -: or itsubtype == "amulet of magic regeneration" -: or itsubtype == "amulet of nothing" -: or itsubtype == "amulet of reflection" -: or itsubtype == "amulet of regeneration" -: or itsubtype == "amulet of the acrobat" -: or itsubtype == "ring of flight" -: or itsubtype == "ring of poison resistance" -: or itsubtype == "ring of resist corrosion" -: or itsubtype == "ring of see invisible" then -: for inv in iter.invent_iterator:new(items.inventory()) do -: if inv.class(true) == "jewellery" and inv.subtype() == itsubtype then -: return false -: end -: end +: if it.is_redundant then +: return false : end -: return +: return nil :end) diff --git a/crawl-ref/source/dat/defaults/messages.txt b/crawl-ref/source/dat/defaults/messages.txt index cafb79209d..fe972aea9a 100644 --- a/crawl-ref/source/dat/defaults/messages.txt +++ b/crawl-ref/source/dat/defaults/messages.txt @@ -152,7 +152,7 @@ force_more_message += You are slowing down force_more_message += You fall asleep # Banes -force_more_message += befalls you.... +force_more_message += befalls you\. force_more_message += upon you is lifted # Abyss exits and rune diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index f1ff2cb914..075faf32f1 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -550,6 +550,7 @@ const vector<GameOption*> game_options::build_options_list() set_menu_sort(frag); }), new BoolGameOption(SIMPLE_NAME(bad_item_prompt), true), + new BoolGameOption(SIMPLE_NAME(show_paged_inventory), false), new MultipleChoiceGameOption<slot_select_mode>( SIMPLE_NAME(assign_item_slot), SS_FORWARD, @@ -3104,8 +3105,6 @@ void game_options::update_consumable_shortcuts() report_error("Unknown consumable type: %s\n", entry.first.c_str()); continue; } - else - string str = string(1, entry.second); if (kind.base_type == OBJ_POTIONS) potion_shortcuts[kind.sub_type] = entry.second; @@ -3115,6 +3114,8 @@ void game_options::update_consumable_shortcuts() evokable_shortcuts[kind.sub_type] = entry.second; else if (kind.base_type == OBJ_MISCELLANY) evokable_shortcuts[kind.sub_type + NUM_WANDS] = entry.second; + else if (kind.base_type == OBJ_BAUBLES) + evokable_shortcuts[kind.sub_type + NUM_WANDS + NUM_MISCELLANY] = entry.second; } } diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index bcb71c3c9c..937558b36f 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -68,7 +68,7 @@ string InvTitle::get_text() const } InvEntry::InvEntry(const item_def &i) - : MenuEntry("", MEL_ITEM), item(&i), _has_star(false) + : MenuEntry("", MEL_ITEM), item(&i) { indent_no_hotkeys = true; // This gets the inventory coloring rules to apply by default: @@ -182,11 +182,6 @@ void InvEntry::select(int qty) MenuEntry::select(qty); } -bool InvEntry::has_star() const -{ - return _has_star; -} - string InvEntry::get_filter_text() const { return item_prefix(*item, false) + " " + get_text(); @@ -209,8 +204,6 @@ string InvEntry::_get_text_preface() const tstr << '-'; else if (selected_qty < quantity) tstr << '#'; - else if (_has_star) - tstr << '*'; else tstr << '+'; @@ -310,19 +303,13 @@ InvMenu::InvMenu(int mflags) : Menu((mflags & MF_NOSELECT) ? mflags : (mflags | MF_ARROWS_SELECT), "inventory"), type(menu_type::invlist), pre_select(nullptr), - title_annotate(nullptr), cur_osel(0), - _mode_special_drop(false) + title_annotate(nullptr), cur_osel(0) { menu_action = ACT_EXAMINE; // default if (!Options.single_column_item_menus) set_flags(get_flags() | MF_USE_TWO_COLUMNS); } -bool InvMenu::mode_special_drop() const -{ - return _mode_special_drop; -} - void InvMenu::set_type(menu_type t) { type = t; @@ -361,6 +348,7 @@ void InvMenu::set_title(const string &s) case 2: str = "Scrolls: "; break; case 3: str = "Evocable Items: "; break; } + str += " (Left/Right to switch category)"; set_title(new InvTitle(this, str, title_annotate)); return; } @@ -384,19 +372,12 @@ bool InvMenu::skip_process_command(int keyin) int InvMenu::pre_process(int key) { - if (type == menu_type::drop && key == '\\') - { - _mode_special_drop = !_mode_special_drop; - key = CK_NO_KEY; - } - else if (key == ';' + if (key == ';' && you.last_unequip != -1 && (type == menu_type::drop || type == menu_type::invlist)) { key = index_to_letter(you.last_unequip); } - else if (key == '-') - _mode_special_drop = false; return key; } @@ -519,38 +500,6 @@ string InvMenu::get_select_count_string(int) const return Menu::get_select_count_string(0); } -static bool _item_is_permadrop_candidate(const item_def &item) -{ - // Known, non-artefact items of the types you see on the '\' menu proper. - // (No disabling autopickup for "green fizzy potion", "+3 whip", etc.) - if (!item.is_identified()) - return false; - return item.base_type == OBJ_MISCELLANY - || item.base_type == OBJ_TALISMANS - || is_stackable_item(item) - || item_type_has_ids(item.base_type); -} - -void InvMenu::select_item_index(int idx, int qty) -{ - if (type != menu_type::drop) - return Menu::select_item_index(idx, qty); - - InvEntry *ie = static_cast<InvEntry*>(items[idx]); - - bool should_toggle_star = _item_is_permadrop_candidate(ie->item[0]) - && (ie->has_star() || _mode_special_drop); - - if (should_toggle_star) - { - // Toggle starred items back to selected-but-not-starred in this mode - // instead of turning them all the way off. - qty = _mode_special_drop ? -2 : 0; - ie->set_star(!ie->has_star()); - } - Menu::select_item_index(idx, qty); -} - bool InvMenu::examine_index(int i) { const bool do_actions = type == menu_type::describe; @@ -582,11 +531,6 @@ bool InvMenu::examine_index(int i) return true; } -void InvEntry::set_star(bool val) -{ - _has_star = val; -} - static bool _has_temp_unwearable_armour() { for (const auto &item : you.inv) @@ -1147,8 +1091,7 @@ vector<SelItem> InvMenu::get_selitems(bool include_offscreen) const for (MenuEntry *me : sel) { InvEntry *inv = dynamic_cast<InvEntry*>(me); - selected_items.emplace_back(inv->item->link, inv->selected_qty, - inv->item, inv->has_star()); + selected_items.emplace_back(inv->item->link, inv->selected_qty, inv->item); } if (include_offscreen) @@ -1509,7 +1452,12 @@ static int _invent_select(const char *title = nullptr, void display_inventory() { - InvMenu menu(MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL); + + int flags = MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL; + if (Options.show_paged_inventory) + flags |= MF_PAGED_INVENTORY; + + InvMenu menu(flags); menu.load_inv_items(OSEL_ANY, -1); menu.set_type(menu_type::describe); @@ -1521,23 +1469,9 @@ void display_inventory() } } -static string _drop_prompt(bool as_menu_title, bool menu_autopickup_mode) -{ - string prompt_base; - - if (as_menu_title && menu_autopickup_mode) - prompt_base = "Drop (and turn off autopickup for) what? "; - else if (as_menu_title) - prompt_base = "Drop what? (Left/Right to switch category) "; - else - prompt_base = "Drop what? "; - return prompt_base + slot_description() + " (_ for help)"; -} - -static string _drop_menu_titlefn(const Menu *m, const string &) +static string _drop_menu_titlefn(const Menu*, const string &) { - const InvMenu *invmenu = static_cast<const InvMenu *>(m); - return _drop_prompt(true, invmenu->mode_special_drop()); + return "Drop what? (Left/Right to switch category) " + slot_description() + " (_ for help)"; } /** diff --git a/crawl-ref/source/invent.h b/crawl-ref/source/invent.h index 7ee5b897a6..af663e06d8 100644 --- a/crawl-ref/source/invent.h +++ b/crawl-ref/source/invent.h @@ -48,10 +48,9 @@ struct SelItem int slot; int quantity; const item_def *item; - bool has_star; - SelItem() : slot(0), quantity(0), item(nullptr), has_star(false) { } - SelItem(int s, int q, const item_def *it = nullptr, bool do_star = false) - : slot(s), quantity(q), item(it), has_star(do_star) + SelItem() : slot(0), quantity(0), item(nullptr) { } + SelItem(int s, int q, const item_def *it = nullptr) + : slot(s), quantity(q), item(it) { } @@ -59,8 +58,7 @@ struct SelItem { return slot == o.slot && quantity == o.quantity - && item == o.item - && has_star == o.has_star; + && item == o.item; } }; @@ -113,8 +111,6 @@ public: virtual int highlight_colour(bool temp=false) const override; virtual void select(int qty = -1) override; - void set_star(bool); - bool has_star() const; virtual string get_filter_text() const override; @@ -123,7 +119,6 @@ public: private: void add_class_hotkeys(const item_def &i); - bool _has_star; }; class InvMenu : public Menu @@ -171,15 +166,11 @@ public: const menu_sort_condition *find_menu_sort_condition() const; void sort_menu(vector<InvEntry*> &items, const menu_sort_condition *cond); - // Drop menu only: if true, dropped items are removed from autopickup. - bool mode_special_drop() const; - void cycle_page(int dir); void set_page(int page); protected: void do_preselect(InvEntry *ie); - void select_item_index(int idx, int qty) override; bool examine_index(int i) override; int pre_process(int key) override; bool process_command(command_type cmd) override; @@ -199,9 +190,6 @@ protected: // Has no effect if that flag is not set. int cur_osel; vector<SelItem> offscreen_sel[4]; - -private: - bool _mode_special_drop; }; void get_class_hotkeys(const int type, vector<char> &glyphs); diff --git a/crawl-ref/source/item-prop-enum.h b/crawl-ref/source/item-prop-enum.h index b35f67ac4a..50cafe76a1 100644 --- a/crawl-ref/source/item-prop-enum.h +++ b/crawl-ref/source/item-prop-enum.h @@ -880,6 +880,7 @@ enum talisman_type enum bauble_type { BAUBLE_FLUX, + NUM_BAUBLES, }; enum special_gizmo_type diff --git a/crawl-ref/source/item-prop.cc b/crawl-ref/source/item-prop.cc index 3b53490380..d6adb7b5e5 100644 --- a/crawl-ref/source/item-prop.cc +++ b/crawl-ref/source/item-prop.cc @@ -37,6 +37,7 @@ #include "stringutil.h" #include "tag-version.h" #include "terrain.h" +#include "transform.h" #include "xom.h" #include "xp-evoker-data.h" @@ -3710,3 +3711,40 @@ bool item_grants_flight(const item_def& item) || item.base_type == OBJ_ARMOUR && item.brand == SPARM_FLYING || is_artefact(item) && artefact_property(item, ARTP_FLY); } + +// Returns the maximum number of copies of a particular type of jewellery that +// could be useful to wear simultaneously, under typical circumstances. +// (ie: rF over 3 pips can be useful to counteract rF- but is niche enough not +// to calculate here) +// +// (Used for default autopickup exceptions) +int jewellery_usefulness_limit(jewellery_type type) +{ + switch (type) + { + // Completely non-stacking + case RING_SEE_INVISIBLE: + case RING_RESIST_CORROSION: + case RING_FLIGHT: + case AMU_ACROBAT: + case AMU_GUARDIAN_SPIRIT: + case AMU_FAITH: + return 1; + + // Typically caps at 3, under most circumstances + case RING_PROTECTION_FROM_FIRE: + case RING_PROTECTION_FROM_COLD: + case RING_POSITIVE_ENERGY: + return 3; + + // Usually doesn't stack, but some forms care. + case RING_POISON_RESISTANCE: + if (get_form()->res_pois() < 0) + return 2; + else + return 1; + + default: + return INT_MAX; + } +} diff --git a/crawl-ref/source/item-prop.h b/crawl-ref/source/item-prop.h index daf3f77750..4e45a3d4f2 100644 --- a/crawl-ref/source/item-prop.h +++ b/crawl-ref/source/item-prop.h @@ -302,3 +302,5 @@ bool ring_plusses_matter(int ring_subtype); void remove_whitespace(string &str); void populate_fake_projectile(const item_def &wep, item_def &fake_proj); + +int jewellery_usefulness_limit(jewellery_type type); diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc index f0abd8f3c0..b2a5ca8f87 100644 --- a/crawl-ref/source/items.cc +++ b/crawl-ref/source/items.cc @@ -2170,6 +2170,9 @@ static int _letter_for_consumable(item_def& item, bool first_pickup) case OBJ_MISCELLANY: key = Options.evokable_shortcuts[item.sub_type + NUM_WANDS]; break; + case OBJ_BAUBLES: + key = Options.evokable_shortcuts[item.sub_type + NUM_WANDS + NUM_MISCELLANY]; + break; default: key = 0; } @@ -2930,16 +2933,19 @@ int item_autopickup_level(const item_def &item) return you.force_autopickup[item.base_type][_autopickup_subtype(item)]; } -static void _disable_autopickup_for_starred_items(vector<SelItem> &items) +static void _maybe_disable_autopickup_for_dropped_items(vector<SelItem> &items) { int autopickup_remove_count = 0; const item_def *last_touched_item; for (SelItem &si : items) { - if ((si.has_star || - (inventory_category_for(*si.item) == INVENT_CONSUMABLE - && si.item->is_identified())) - && item_autopickup_level(si.item[0]) != AP_FORCE_OFF) + const item_def& item = *si.item; + if (!item.is_identified() || is_artefact(item)) + continue; + + if ((inventory_category_for(item) == INVENT_CONSUMABLE + || item.base_type == OBJ_JEWELLERY) + && item_autopickup_level(si.item[0]) != AP_FORCE_OFF) { last_touched_item = si.item; ++autopickup_remove_count; @@ -2976,7 +2982,7 @@ void drop() return; } - _disable_autopickup_for_starred_items(tmp_items); + _maybe_disable_autopickup_for_dropped_items(tmp_items); _multidrop(tmp_items); } @@ -5098,3 +5104,30 @@ void maybe_split_nets(item_def &item, const coord_def& where) copy_item_to_grid(it, where); } + +// Returns whether an additional copy of a given item in the player's inventory +// would be strictly redundant with ones they already have. +bool jewellery_is_redundant(const item_def& item) +{ + if (item.base_type != OBJ_JEWELLERY || is_artefact(item)) + return false; + + const jewellery_type type = static_cast<jewellery_type>(item.sub_type); + const int slots = jewellery_is_amulet(type) ? you.equipment.num_slots[SLOT_AMULET] + : you.equipment.num_slots[SLOT_RING]; + const int limit = min(slots, jewellery_usefulness_limit(type)); + + // A new item would be useless if we already have as many copies as we can use. + int count = 0; + for (int i = 0; i < MAX_GEAR; ++i) + { + if (you.inv[i].is_type(OBJ_JEWELLERY, type)) + { + ++count; + if (count >= limit) + return true; + } + } + + return false; +} diff --git a/crawl-ref/source/items.h b/crawl-ref/source/items.h index 7a627780ba..ea8a456bd1 100644 --- a/crawl-ref/source/items.h +++ b/crawl-ref/source/items.h @@ -199,6 +199,8 @@ bool valid_item_index(int i); void maybe_split_nets(item_def &item, const coord_def& where); +bool jewellery_is_redundant(const item_def& item); + // stack_iterator guarantees validity so long as you don't manually // mess with item_def.link: i.e., you can kill the item you're // examining but you can't kill the item linked to it. diff --git a/crawl-ref/source/l-item.cc b/crawl-ref/source/l-item.cc index 4b9d95c110..45957aef27 100644 --- a/crawl-ref/source/l-item.cc +++ b/crawl-ref/source/l-item.cc @@ -1019,6 +1019,19 @@ IDEF(description) return 1; } +/*** Whether the current item is a piece of jewellery that the player already + * has as many copies as they can benefit from. + * @field description string + */ +IDEF(redundant) +{ + if (!item || !item->defined()) + return 0; + + lua_pushboolean(ls, jewellery_is_redundant(*item)); + + return 1; +} // DLUA-only functions static int l_item_do_pluses(lua_State *ls) @@ -1754,6 +1767,7 @@ static ItemAccessor item_attrs[] = { "is_in_shop", l_item_is_in_shop }, { "inscription", l_item_inscription }, { "description", l_item_description }, + { "is_redundant", l_item_redundant }, // dlua only past this point { "pluses", l_item_pluses }, diff --git a/crawl-ref/source/menu.cc b/crawl-ref/source/menu.cc index 1629886a1c..3b77de488e 100644 --- a/crawl-ref/source/menu.cc +++ b/crawl-ref/source/menu.cc @@ -2197,24 +2197,24 @@ int Menu::hotkey_to_index(int key, bool primary_only) // the start of the menu to the current position. (This means that in cases // where a menu has multiple entries with the same letter, we will select // the first one below the cursor, if one exists, and then wrap around if not.) - - int nearest_dist = INT_MAX; - int nearest_sel = -1; - for (int i = 0; i < final; ++i) + for (int i = max(0, last_hovered); i < final; ++i) { if (is_hotkey(i, key) && (!primary_only || items[i]->hotkeys[0] == key)) { - const int dist = abs(i - last_hovered); - if (dist < nearest_dist) - { - nearest_dist = dist; - nearest_sel = i; - } + return i; + } + } + for (int i = 0; i < last_hovered; ++i) + { + if (is_hotkey(i, key) + && (!primary_only || items[i]->hotkeys[0] == key)) + { + return i; } } - return nearest_sel; + return -1; } pair<int,int> Menu::hotkey_range(int key) diff --git a/crawl-ref/source/options.h b/crawl-ref/source/options.h index bf7bb1eff1..d474e1c534 100644 --- a/crawl-ref/source/options.h +++ b/crawl-ref/source/options.h @@ -641,7 +641,7 @@ public: vector<pair<string, char>> auto_consumable_letters; FixedVector<char, NUM_POTIONS> potion_shortcuts; FixedVector<char, NUM_SCROLLS> scroll_shortcuts; - FixedVector<char, NUM_WANDS + NUM_MISCELLANY> evokable_shortcuts; + FixedVector<char, NUM_WANDS + NUM_MISCELLANY + NUM_BAUBLES> evokable_shortcuts; bool pickup_thrown; // Pickup thrown missiles int travel_delay; // How long to pause between travel moves @@ -759,6 +759,8 @@ public: bool spell_menu; // 'z' starts with a full-screen menu bool easy_floor_use; // , selects the floor item if there's 1 bool bad_item_prompt; // Confirm before using a bad consumable + bool show_paged_inventory; // If true, use pages for the 'i' menu + // (just like the 'd'rop menu does). slot_select_mode assign_item_slot; // How free slots are assigned maybe_bool show_god_gift; // Show {god gift} in item names -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-21 02:10:14
|
at 67b45dadd6086a1b53f30d40bf73ead0e722df83 (commit) ----------------------------------------------------------------------- commit 67b45dadd6086a1b53f30d40bf73ead0e722df83 Author: hellmonk <nld...@gm...> Date: Sun Jul 20 21:08:15 2025 -0500 Make Natasha friendly on the orbrun Another hidden ending in the vein of Yiuf text. ----------------------------------------------------------------------- -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-20 21:50:26
|
via 345f232843c595c3db5d095245def53149ab243e (commit) from e651354df72fb8b8eaa7a33573c72fa5609f3e87 (commit) ----------------------------------------------------------------------- commit 345f232843c595c3db5d095245def53149ab243e Author: DracoOmega <dra...@gm...> Date: Sun Jul 20 19:18:06 2025 -0230 Fix consumable_shortcut not working properly for evokers (PaperRat) And potentially overwriting wand mappings in rare cases, even! ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/initfile.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index 01ddf0d76e..f1ff2cb914 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -3114,7 +3114,7 @@ void game_options::update_consumable_shortcuts() else if (kind.base_type == OBJ_WANDS) evokable_shortcuts[kind.sub_type] = entry.second; else if (kind.base_type == OBJ_MISCELLANY) - evokable_shortcuts[kind.sub_type] = entry.second + NUM_WANDS; + evokable_shortcuts[kind.sub_type + NUM_WANDS] = entry.second; } } -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-20 21:40:10
|
via e651354df72fb8b8eaa7a33573c72fa5609f3e87 (commit) via 121333a4858df1ce365f23b1bf5226c9d313503d (commit) via be495c2c6edfba6b5aca60a025466e7477332faf (commit) from 725f2bf89b83c88494685919e5542142a45bd49e (commit) ----------------------------------------------------------------------- commit e651354df72fb8b8eaa7a33573c72fa5609f3e87 Author: DracoOmega <dra...@gm...> Date: Sun Jul 20 19:05:24 2025 -0230 Fix outdated description for Sac Drink/Words (Oneirical) commit 121333a4858df1ce365f23b1bf5226c9d313503d Author: DracoOmega <dra...@gm...> Date: Sun Jul 20 19:04:37 2025 -0230 Fix broken colour tag on % screen while ostracised (Oneirical) commit be495c2c6edfba6b5aca60a025466e7477332faf Author: DracoOmega <dra...@gm...> Date: Sun Jul 20 19:03:55 2025 -0230 Don't prevent dropping unequippable gear (dilly) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/descript/ability.txt | 4 ++-- crawl-ref/source/invent.cc | 2 +- crawl-ref/source/output.cc | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crawl-ref/source/dat/descript/ability.txt b/crawl-ref/source/dat/descript/ability.txt index aaeb21e644..053a0d47c5 100644 --- a/crawl-ref/source/dat/descript/ability.txt +++ b/crawl-ref/source/dat/descript/ability.txt @@ -817,11 +817,11 @@ Sacrifices purity of body or mind, causing a single mutation. %%%% Sacrifice Words ability -Sacrifices the ability to use magical scrolls after being injured. +Sacrifices the ability to use magical scrolls unless badly injured. %%%% Sacrifice Drink ability -Sacrifices the ability to drink potions after being injured. +Sacrifices the ability to drink potions unless badly injured. %%%% Sacrifice Essence ability diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 0b5db0ab03..bcb71c3c9c 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -1409,7 +1409,7 @@ bool item_is_selected(const item_def &i, int selector) return i.base_type == OBJ_JEWELLERY || i.base_type == OBJ_TALISMANS; case OSEL_GEAR: - return item_is_selected(i, OSEL_EQUIPABLE) + return inventory_category_for(i) == INVENT_GEAR || i.base_type == OBJ_MISSILES; default: diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc index 9a6f127cc5..09bb09c692 100644 --- a/crawl-ref/source/output.cc +++ b/crawl-ref/source/output.cc @@ -403,7 +403,7 @@ static void _nowrap_eol_cprintf_touchui(const char *format, ...) #endif static string _god_powers(); -static formatted_string _god_asterisks(bool leading_space = false); +static string _god_asterisks(bool leading_space = false); static int _god_status_colour(int default_colour); // Colour for captions like 'Health:', 'Str:', etc. @@ -1509,7 +1509,7 @@ static void _redraw_title() god += you_worship(GOD_JIYVA) ? god_name_jiyva(true) : god_name(you.religion); NOWRAP_EOL_CPRINTF("%s", god.c_str()); - formatted_string piety = _god_asterisks(true); + formatted_string piety = formatted_string::parse_string(_god_asterisks(true)); textcolour(_god_status_colour(YELLOW)); const unsigned int textwidth = (unsigned int)(strwidth(species) + strwidth(god) + strwidth(piety) + 1); if (small_layout) @@ -2249,17 +2249,17 @@ static string _god_powers() return colour_string(name, _god_status_colour(god_colour(you.religion))); return colour_string(chop_string(name, 20, false) - + " [" + _god_asterisks().to_colour_string() + "]", + + " [" + _god_asterisks() + "]", _god_status_colour(god_colour(you.religion))); } -static formatted_string _god_asterisks(bool leading_space) +static string _god_asterisks(bool leading_space) { if (you_worship(GOD_NO_GOD)) - return formatted_string(""); + return ""; if (you_worship(GOD_GOZAG)) - return formatted_string(""); + return ""; string str; if (you_worship(GOD_XOM)) @@ -2289,7 +2289,7 @@ static formatted_string _god_asterisks(bool leading_space) str = string(prank, '*') + string(NUM_PIETY_STARS - prank, '.'); } - return formatted_string::parse_string((leading_space ? " " : "") + str); + return make_stringf("%s%s", leading_space ? " " : "", str.c_str()); } /** -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-19 22:55:16
|
via 725f2bf89b83c88494685919e5542142a45bd49e (commit) from 1d9b2a2d9d895fd0744b551bb47ea7c2468f2956 (commit) ----------------------------------------------------------------------- commit 725f2bf89b83c88494685919e5542142a45bd49e Author: regret-index <clo...@ho...> Date: Sat Jul 19 20:20:50 2025 -0230 Fix Ozocubu's trove failing to place (#4118) RypoFalem is correct that the shield egos shouldn't specify two weights for the same item, which entirely fails to place. To try and get some of the original intent of making the shields rarer, most of the other other items in its slot have been increased in total weight. Fixes #4118. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/des/portals/trove.des | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crawl-ref/source/dat/des/portals/trove.des b/crawl-ref/source/dat/des/portals/trove.des index f0f6017794..05c4f859f5 100644 --- a/crawl-ref/source/dat/des/portals/trove.des +++ b/crawl-ref/source/dat/des/portals/trove.des @@ -773,9 +773,9 @@ NSUBST: d = 6:d / *:?, g = 6:g / *:? trove_offense(_G, trove_weap_brand(_G, "freezing"), trove_standard_magic(_G, "ice", true), trove_good_talisman(_G, "rC"), "ice magic") -trove_defense(_G, "robe ego:resistance good_item / scarf ego:resistance w:5 / \ - ice dragon scales good_item / ice dragon scales randart" .. - " / " .. trove_ego_shield(_G, "cold_resistance w:1", "rC w:1"), +trove_defense(_G, "robe ego:resistance good_item w:15 / scarf ego:resistance / \ + ice dragon scales good_item w:15 / ice dragon scales randart" .. + " / " .. trove_ego_shield(_G, "cold_resistance", "rC"), trove_ego_gen_armour(_G, "cold_resistance", "rC"), trove_jewel_type(_G, "rC"), trove_cons(_G, {"identify w:1 q:3"}, -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-19 12:00:10
|
via 1d9b2a2d9d895fd0744b551bb47ea7c2468f2956 (commit) via 8052acedeece4ce4b9f96075280769d7f12da915 (commit) via 302e0d9ae39a3834cfaac2822f80506c3e2298b9 (commit) via 5969bbf2d0e1da04c89e953bd2301b8a1d9a3522 (commit) via 820aee5b568a1f944c9c347b322248cacbaa2212 (commit) from bd44c153c20f292a9553762e1000ff4a829e58c6 (commit) ----------------------------------------------------------------------- commit 1d9b2a2d9d895fd0744b551bb47ea7c2468f2956 Author: DracoOmega <dra...@gm...> Date: Sat Jul 19 09:28:25 2025 -0230 Don't prevent page up/down from working normally in drop menu. Yes, this makes < and > no longer swap pages (as had been requested), but I think interfering with pgup/pgdown is a worse sin. commit 8052acedeece4ce4b9f96075280769d7f12da915 Author: DracoOmega <dra...@gm...> Date: Sat Jul 19 09:25:32 2025 -0230 Fix a rare Nobody / shadow mimic crash (DewdropsOTG) If you brought Nobody to 0 HP, triggered Pyrric Recollection, rolled for a Dith shadow melee followup, and Nobody landed somewhere still in melee range of your shadow, the attack would crash (since Nobody still looked 'dead') Rather than check for this in shadow mimic specifically, I think it may be better to change the behavior of this assert (since there are several other things that can trigger it, and probably will be more in future). Now, attempting to attack a mid-revival monster just does nothing (but still takes time). It's perfectly valid for those to be on the grid, so this isn't really a 'bug', per se, and doesn't need to crash. This fixes #4668 commit 302e0d9ae39a3834cfaac2822f80506c3e2298b9 Author: DracoOmega <dra...@gm...> Date: Sat Jul 19 08:47:50 2025 -0230 Fix drop menu not sorting properly (Ogregutan) Apparently it was only using the default sort conditions at all because its type wasn't yet set to 'drop menu' until after items were added and sorted. This stopped being the case in 1ca2ae5. (But this also means that the sort_menu option for drop menus likely never worked properly before now, either.) commit 5969bbf2d0e1da04c89e953bd2301b8a1d9a3522 Author: DracoOmega <dra...@gm...> Date: Sat Jul 19 08:45:01 2025 -0230 Fix drop menu defaulting to wrong page sometimes If the player had zero items of a given inventory category (ie: gear, potions, scrolls, evocables), cycling through each page at start would land on something other then gear (since cycling skips empty pages.) Instead, view each page manually, to make sure we end up at the same default every time. commit 820aee5b568a1f944c9c347b322248cacbaa2212 Author: DracoOmega <dra...@gm...> Date: Sat Jul 19 08:43:13 2025 -0230 Fix misleading warning prompts when changing gear letters (DewdropsOTG) Adjusting the letter of 'dangerous' gear in your inventory would prompt you as if you were about to equip or unequip them. ----------------------------------------------------------------------- Summary of changes: crawl-ref/docs/options_guide.txt | 3 +- crawl-ref/source/adjust.cc | 20 ++++++-------- crawl-ref/source/adjust.h | 4 +-- crawl-ref/source/describe.cc | 2 +- crawl-ref/source/fight.cc | 17 ++++++++++-- crawl-ref/source/initfile.cc | 1 + crawl-ref/source/invent.cc | 59 ++++++++++++++++++++++++---------------- crawl-ref/source/invent.h | 1 + 8 files changed, 67 insertions(+), 40 deletions(-) diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt index debe155740..c6dd582d13 100644 --- a/crawl-ref/docs/options_guide.txt +++ b/crawl-ref/docs/options_guide.txt @@ -1369,7 +1369,8 @@ sort_menus = [menu:](true | false | auto:X)[:sort_order] By default pickup menus are sorted, and the sort criteria are: "equipped, basename, qualname, curse, qty". - Inv menus are sorted by "equipped, charged, usefulness". + Inv and drop menus are sorted by "equipped, charged, identified, + usefulness, slot". spell_slot ^= <regex>:<list of spell letters> (Ordered list option, one value per line) diff --git a/crawl-ref/source/adjust.cc b/crawl-ref/source/adjust.cc index 6b748ec52e..8db16402ab 100644 --- a/crawl-ref/source/adjust.cc +++ b/crawl-ref/source/adjust.cc @@ -29,13 +29,13 @@ void adjust() const int keyin = toalower(get_ch()); if (keyin == 'g') - adjust_item(OPER_EQUIP); + adjust_item(OSEL_GEAR); else if (keyin == 'p') - adjust_item(OPER_QUAFF); + adjust_item(OBJ_POTIONS); else if (keyin == 'r') - adjust_item(OPER_READ); + adjust_item(OBJ_SCROLLS); else if (keyin == 'v') - adjust_item(OPER_EVOKE); + adjust_item(OSEL_EVOKABLE); else if (keyin == 's') _adjust_spell(); else if (keyin == 'a') @@ -46,7 +46,7 @@ void adjust() canned_msg(MSG_HUH); } -void adjust_item(operation_types oper, item_def* to_adjust) +void adjust_item(int selector, item_def* to_adjust) { #ifdef USE_TILE_WEB ui::cutoff_point ui_cutoff_point; @@ -61,17 +61,15 @@ void adjust_item(operation_types oper, item_def* to_adjust) if (to_adjust) { if (inventory_category_for(*to_adjust) == INVENT_CONSUMABLE) - oper = item_to_oper(to_adjust); + selector = default_osel(item_to_oper(to_adjust)); else - oper = OPER_EQUIP; + selector = OSEL_GEAR; } if (!to_adjust) { - int sel = oper == OPER_EQUIP ? OSEL_GEAR : default_osel(oper); - const int from_slot = prompt_invent_item("Adjust which item?", - menu_type::invlist, sel, oper); + menu_type::invlist, selector, OPER_ANY); if (prompt_failed(from_slot)) return; @@ -82,7 +80,7 @@ void adjust_item(operation_types oper, item_def* to_adjust) const int to_slot = prompt_invent_item("Adjust to which letter? ", menu_type::invlist, - default_osel(oper), oper, + selector, OPER_ANY, invprompt_flag::unthings_ok | invprompt_flag::manual_list); if (to_slot == PROMPT_ABORT diff --git a/crawl-ref/source/adjust.h b/crawl-ref/source/adjust.h index 90df87bdf6..21ebc687ca 100644 --- a/crawl-ref/source/adjust.h +++ b/crawl-ref/source/adjust.h @@ -5,10 +5,10 @@ #pragma once -#include "operation-types.h" +#include "object-selector-type.h" struct item_def; void adjust(); -void adjust_item(operation_types oper = OPER_ANY, item_def* to_adjust = nullptr); +void adjust_item(int selector = OSEL_ANY, item_def* to_adjust = nullptr); void swap_inv_slots(item_def& to_adjust, int new_letter, bool verbose); diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 1c0784550c..1094894d5c 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -4009,7 +4009,7 @@ static bool _do_action(item_def &item, const command_type action) return true; drop_item(slot, item.quantity); break; - case CMD_ADJUST_INVENTORY: adjust_item(OPER_ANY, &you.inv[slot]); + case CMD_ADJUST_INVENTORY: adjust_item(0, &you.inv[slot]); break; case CMD_EVOKE: if (!check_warning_inscriptions(you.inv[slot], OPER_EVOKE)) diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc index aa18293e87..5c134f0208 100644 --- a/crawl-ref/source/fight.cc +++ b/crawl-ref/source/fight.cc @@ -430,8 +430,21 @@ bool fight_melee(actor *attacker, actor *defender, bool *did_hit, bool simu) ASSERT(defender); // XXX: change to actor &defender // A dead defender would result in us returning true without actually - // taking an action. - ASSERT(defender->alive()); + // taking an action. But allow just passing our turn if we try to attack a + // monster mid-revival (since they're still actually supposed to be there). + if (!defender->alive()) + { + if (defender->is_monster() + && (defender->as_monster()->flags & MF_PENDING_REVIVAL)) + { + return true; + } + else + { + die("%s trying to attack a dead %s", attacker->name(DESC_THE).c_str(), + defender->name(DESC_THE).c_str()); + } + } if (defender->is_player()) { diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index 1eb04127bf..01ddf0d76e 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -3418,6 +3418,7 @@ void game_options::set_menu_sort(const string &field) sort_menus.clear(); set_menu_sort("pickup: true"); set_menu_sort("inv: true : equipped, charged, identified, usefulness, slot"); + set_menu_sort("drop: true : equipped, charged, identified, usefulness, slot"); return; } diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 895e638bb9..0b5db0ab03 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -400,26 +400,42 @@ int InvMenu::pre_process(int key) return key; } +const static int modes[] = +{ + OSEL_GEAR, + OBJ_POTIONS, + OBJ_SCROLLS, + OSEL_EVOKABLE, +}; + void InvMenu::cycle_page(int dir) { + do + { + int new_osel = cur_osel; + new_osel += dir; + if (new_osel < 0) + new_osel = ARRAYSZ(modes) - 1; + if (new_osel >= static_cast<int>(ARRAYSZ(modes))) + new_osel = 0; + + set_page(new_osel); + } + // If this page is empty, go to the next one. + // XXX: (Theoretically, this could cause an infinite loop, but other code + // should already prevent opening a menu when you have no items.) + while (items.empty()); +} + +void InvMenu::set_page(int page) +{ + ASSERT(page >= 0 && page < static_cast<int>(ARRAYSZ(modes))); + if (!(flags & MF_PAGED_INVENTORY)) return; - const static int modes[] = - { - OSEL_GEAR, - OBJ_POTIONS, - OBJ_SCROLLS, - OSEL_EVOKABLE, - }; - - // Determine new page const int old_osel = cur_osel; - cur_osel += dir; - if (cur_osel < 0) - cur_osel = ARRAYSZ(modes) - 1; - if (cur_osel >= static_cast<int>(ARRAYSZ(modes))) - cur_osel = 0; + cur_osel = page; // Save selected items from our current page get_selected(&sel); @@ -433,12 +449,6 @@ void InvMenu::cycle_page(int dir) reset(); update_menu(true); - // If this page is empty, go to the next one. - // XXX: (Theoretically, this could cause an infinite loop, but other code - // should already prevent opening a menu when you have no items.) - if (items.empty()) - cycle_page(dir); - // If the player has selected items on this new page previously, restore // those selections. for (SelItem& sel_item : offscreen_sel[cur_osel]) @@ -479,12 +489,12 @@ bool InvMenu::process_command(command_type cmd) lastch = CK_ESCAPE; // XX is this correct? return is_set(MF_UNCANCEL) && !crawl_state.seen_hups; } - else if (cmd == CMD_MENU_LEFT || cmd == CMD_MENU_PAGE_UP) + else if (cmd == CMD_MENU_LEFT) { cycle_page(-1); return true; } - else if (cmd == CMD_MENU_RIGHT || cmd == CMD_MENU_PAGE_DOWN) + else if (cmd == CMD_MENU_RIGHT) { cycle_page(1); return true; @@ -1483,8 +1493,11 @@ static int _invent_select(const char *title = nullptr, // Cycle through all pages to properly apply pre-selections immediately. if (flags & MF_PAGED_INVENTORY) + { for (int i = 0; i < 4; ++i) - menu.cycle_page(1); + menu.set_page(i); + menu.set_page(0); + } menu.show(true); diff --git a/crawl-ref/source/invent.h b/crawl-ref/source/invent.h index 2cff466cab..7ee5b897a6 100644 --- a/crawl-ref/source/invent.h +++ b/crawl-ref/source/invent.h @@ -175,6 +175,7 @@ public: bool mode_special_drop() const; void cycle_page(int dir); + void set_page(int page); protected: void do_preselect(InvEntry *ie); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 18:15:11
|
via bd44c153c20f292a9553762e1000ff4a829e58c6 (commit) via ddc175b71db3e5e30be89bcb8db3c5b0f90795c6 (commit) via 7c270478f45cb984fb51f46a9c79657e6890f6ed (commit) from b117d8a9e7f2e9a6408b85e652c84bb349c154c1 (commit) ----------------------------------------------------------------------- commit bd44c153c20f292a9553762e1000ff4a829e58c6 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 15:41:38 2025 -0230 Allow < > to additionally switch pages in drop menu (dilly) And also refactor slightly. commit ddc175b71db3e5e30be89bcb8db3c5b0f90795c6 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 15:41:00 2025 -0230 Return 'i' menu to previous behavior Perhaps at some point of shuffling deck chairs, we will arrive at a better future. commit 7c270478f45cb984fb51f46a9c79657e6890f6ed Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 15:33:41 2025 -0230 Fix showing incorrect inventory pages in a number of menus (dilly) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/invent.cc | 68 +++++++++++++++++++++++----------------------- crawl-ref/source/invent.h | 1 - 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 8a7085b07e..895e638bb9 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -402,6 +402,9 @@ int InvMenu::pre_process(int key) void InvMenu::cycle_page(int dir) { + if (!(flags & MF_PAGED_INVENTORY)) + return; + const static int modes[] = { OSEL_GEAR, @@ -457,38 +460,35 @@ void InvMenu::cycle_page(int dir) update_title(); } -bool InvMenu::process_key(int key) -{ - if (key == CK_LEFT && (flags & MF_PAGED_INVENTORY)) - { - cycle_page(-1); - return true; - } - else if (key == CK_RIGHT && (flags & MF_PAGED_INVENTORY)) - { - cycle_page(1); - return true; - } - - return Menu::process_key(key); -} - bool InvMenu::process_command(command_type cmd) { - if (cmd == CMD_MENU_ACCEPT_SELECTION && (flags & MF_PAGED_INVENTORY)) - { - get_selected(&sel); - return false; - } - else if (cmd == CMD_MENU_EXIT && (flags & MF_PAGED_INVENTORY)) + if (flags & MF_PAGED_INVENTORY) { - // Must clear offscreen selection or exiting the menu will still act - // upon those items. - for (size_t i = 0; i < ARRAYSZ(offscreen_sel); ++i) - offscreen_sel[i].clear(); - sel.clear(); - lastch = CK_ESCAPE; // XX is this correct? - return is_set(MF_UNCANCEL) && !crawl_state.seen_hups; + if (cmd == CMD_MENU_ACCEPT_SELECTION) + { + get_selected(&sel); + return false; + } + else if (cmd == CMD_MENU_EXIT) + { + // Must clear offscreen selection or exiting the menu will still act + // upon those items. + for (size_t i = 0; i < ARRAYSZ(offscreen_sel); ++i) + offscreen_sel[i].clear(); + sel.clear(); + lastch = CK_ESCAPE; // XX is this correct? + return is_set(MF_UNCANCEL) && !crawl_state.seen_hups; + } + else if (cmd == CMD_MENU_LEFT || cmd == CMD_MENU_PAGE_UP) + { + cycle_page(-1); + return true; + } + else if (cmd == CMD_MENU_RIGHT || cmd == CMD_MENU_PAGE_DOWN) + { + cycle_page(1); + return true; + } } return Menu::process_command(cmd); @@ -1482,8 +1482,9 @@ static int _invent_select(const char *title = nullptr, menu.set_title(title); // Cycle through all pages to properly apply pre-selections immediately. - for (int i = 0; i < 4; ++i) - menu.cycle_page(1); + if (flags & MF_PAGED_INVENTORY) + for (int i = 0; i < 4; ++i) + menu.cycle_page(1); menu.show(true); @@ -1495,9 +1496,8 @@ static int _invent_select(const char *title = nullptr, void display_inventory() { - InvMenu menu(MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL - | MF_PAGED_INVENTORY); - menu.load_inv_items(OSEL_GEAR, -1); + InvMenu menu(MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL); + menu.load_inv_items(OSEL_ANY, -1); menu.set_type(menu_type::describe); menu.show(true); diff --git a/crawl-ref/source/invent.h b/crawl-ref/source/invent.h index b2d2ba4ec2..2cff466cab 100644 --- a/crawl-ref/source/invent.h +++ b/crawl-ref/source/invent.h @@ -181,7 +181,6 @@ protected: void select_item_index(int idx, int qty) override; bool examine_index(int i) override; int pre_process(int key) override; - bool process_key(int key) override; bool process_command(command_type cmd) override; string get_select_count_string(int count) const override; virtual bool skip_process_command(int keyin) override; -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 15:25:16
|
via b117d8a9e7f2e9a6408b85e652c84bb349c154c1 (commit) via 13e22a4e1b9ce4fa623913a91c99fb9dab7be964 (commit) via 8fab406d756587161dac8f83a8ae68798a78ae00 (commit) via 1ca2ae5227a956e7fc87e05e2f9c0de3d36e6e48 (commit) via a83e6f9d55fefd55eab61655bb351e9a8ee05d4e (commit) from 5bb89448b4a79aae45e433372bfde864c6bd2d45 (commit) ----------------------------------------------------------------------- commit b117d8a9e7f2e9a6408b85e652c84bb349c154c1 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 12:50:16 2025 -0230 More thoroughly prevent some crashes with inventory menus 89b82f3 was apparently insufficient (even if 0 was the most common case by far). I'm not 100% sure where non-zero non-letter slots are coming from, so I don't entirely like papering over it like this, but it's possible they're harmless. (Or at least, we can wait and see if any other problem happens besides this sort issue.) commit 13e22a4e1b9ce4fa623913a91c99fb9dab7be964 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 12:44:23 2025 -0230 Don't indefinitely wait to heal off poison in nonliving forms (Ogregutan) Transforming into something with infinite rPois while already poisoned merely suspends the poison, and it cannot be rested off in those forms. So don't waste time trying. commit 8fab406d756587161dac8f83a8ae68798a78ae00 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 12:42:13 2025 -0230 Don't automap a consumable to an occupied letter (Moanerette) Autoassignments set by consumable_shortcut neglected to consider that a player could have manually remapped an item to a reserved letter, and would give that out to the new item anyway. Now, it should fall back on another slot in this case, as if no default was set. commit 1ca2ae5227a956e7fc87e05e2f9c0de3d36e6e48 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 12:39:51 2025 -0230 Change how the drop/'i' menus work (various) In response to repeated struggles players expressed with the current setup (which can map multiple items to the same letter on 'd'/'i'), this changes these menus over to a multi-paged model. Each of the 4 inventory sub-types (gear, potions, scrolls, evocables) now display on a seperate page, which is accessed by left/right arrows. This means that each letter uniquely maps to a single item on each of these pages. Selections on previous pages are remembered (so the player can still multi-drop items of multiple categories). Some downsides is that it's no longer possible to see your complete inventory in a single list, and using ',' to drop all useless items no longer works (you'd need to cycle through each of the 4 pages manually to drop useless items of each type). But after discussing this with several players, I think this is the lesser of two evils; hopefully this will feel more intuitive for players to interact with. The implementation is a little rough, but a more elegant approach would seem to require considerably more menu code rewriting, and hopefully this can suffice. commit a83e6f9d55fefd55eab61655bb351e9a8ee05d4e Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 08:47:19 2025 -0230 Fix =g not letting you remap throwables (Undo) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/adjust.cc | 5 +- crawl-ref/source/invent.cc | 219 +++++++++++++++++++++----------- crawl-ref/source/invent.h | 19 ++- crawl-ref/source/items.cc | 20 ++- crawl-ref/source/menu.h | 1 + crawl-ref/source/object-selector-type.h | 1 + crawl-ref/source/travel.cc | 8 ++ 7 files changed, 194 insertions(+), 79 deletions(-) diff --git a/crawl-ref/source/adjust.cc b/crawl-ref/source/adjust.cc index 8a76f84e96..6b748ec52e 100644 --- a/crawl-ref/source/adjust.cc +++ b/crawl-ref/source/adjust.cc @@ -68,9 +68,10 @@ void adjust_item(operation_types oper, item_def* to_adjust) if (!to_adjust) { + int sel = oper == OPER_EQUIP ? OSEL_GEAR : default_osel(oper); + const int from_slot = prompt_invent_item("Adjust which item?", - menu_type::invlist, default_osel(oper), - oper); + menu_type::invlist, sel, oper); if (prompt_failed(from_slot)) return; diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 078c9b587e..8a7085b07e 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -310,7 +310,8 @@ InvMenu::InvMenu(int mflags) : Menu((mflags & MF_NOSELECT) ? mflags : (mflags | MF_ARROWS_SELECT), "inventory"), type(menu_type::invlist), pre_select(nullptr), - title_annotate(nullptr), _mode_special_drop(false) + title_annotate(nullptr), cur_osel(0), + _mode_special_drop(false) { menu_action = ACT_EXAMINE; // default if (!Options.single_column_item_menus) @@ -350,6 +351,20 @@ string slot_description() void InvMenu::set_title(const string &s) { + if ((flags & MF_PAGED_INVENTORY)) + { + string str; + switch (cur_osel) + { + case 0: str = "Gear: " + slot_description(); break; + case 1: str = "Potions: "; break; + case 2: str = "Scrolls: "; break; + case 3: str = "Evocable Items: "; break; + } + set_title(new InvTitle(this, str, title_annotate)); + return; + } + set_title(new InvTitle(this, s.empty() ? "Inventory: " + slot_description() : s, title_annotate)); @@ -385,59 +400,115 @@ int InvMenu::pre_process(int key) return key; } -bool InvMenu::process_key(int key) +void InvMenu::cycle_page(int dir) { - // Allow tab to move between item categories (since using item category - // hotkeys in the drop menu doesn't really work for this purpose as it will - // select many things at once instead). - if (key == CK_RIGHT || key == CK_LEFT) + const static int modes[] = { - // Find the first category below our current cursor position. - int start = last_hovered >= 0 ? last_hovered : 0; - int target = -1; - if (key == CK_RIGHT) - { - for (size_t i = start; i < items.size(); ++i) - { - if (items[i]->level == MEL_SUBTITLE) - { - target = i+1; - break; - } - } - } - // Find the first category above our current cursor position. - else if (key == CK_LEFT) + OSEL_GEAR, + OBJ_POTIONS, + OBJ_SCROLLS, + OSEL_EVOKABLE, + }; + + // Determine new page + const int old_osel = cur_osel; + cur_osel += dir; + if (cur_osel < 0) + cur_osel = ARRAYSZ(modes) - 1; + if (cur_osel >= static_cast<int>(ARRAYSZ(modes))) + cur_osel = 0; + + // Save selected items from our current page + get_selected(&sel); + offscreen_sel[old_osel] = get_selitems(); + deselect_all(); + + // Clear old entries and load new ones based on the new page + clear(); + load_inv_items(modes[cur_osel]); + update_more(); + reset(); + update_menu(true); + + // If this page is empty, go to the next one. + // XXX: (Theoretically, this could cause an infinite loop, but other code + // should already prevent opening a menu when you have no items.) + if (items.empty()) + cycle_page(dir); + + // If the player has selected items on this new page previously, restore + // those selections. + for (SelItem& sel_item : offscreen_sel[cur_osel]) + { + for (size_t i = 0; i < items.size(); ++i) { - for (int i = start - 2; i >= 0; --i) + InvEntry *inv = dynamic_cast<InvEntry*>(items[i]); + if (!inv) + continue; + + if (inv->item->link == sel_item.item->link) { - if (items[i]->level == MEL_SUBTITLE) - { - target = i+1; - break; - } + select_index(i, sel_item.quantity); + break; } } + } + get_selected(&sel); + update_title(); +} - // Stop if we didn't find any. - if (target < 0) - return true; - - // Otherwise, hover the first item of this category and try to display - // the entire category on screen (or as much as we can, anyway.) - auto snap_range = hotkey_range(items[target]->hotkeys.back()); - snap_in_page(snap_range.second); - set_hovered(snap_range.first); -#ifdef USE_TILE_WEB - webtiles_update_scroll_pos(true); -#endif - +bool InvMenu::process_key(int key) +{ + if (key == CK_LEFT && (flags & MF_PAGED_INVENTORY)) + { + cycle_page(-1); + return true; + } + else if (key == CK_RIGHT && (flags & MF_PAGED_INVENTORY)) + { + cycle_page(1); return true; } return Menu::process_key(key); } +bool InvMenu::process_command(command_type cmd) +{ + if (cmd == CMD_MENU_ACCEPT_SELECTION && (flags & MF_PAGED_INVENTORY)) + { + get_selected(&sel); + return false; + } + else if (cmd == CMD_MENU_EXIT && (flags & MF_PAGED_INVENTORY)) + { + // Must clear offscreen selection or exiting the menu will still act + // upon those items. + for (size_t i = 0; i < ARRAYSZ(offscreen_sel); ++i) + offscreen_sel[i].clear(); + sel.clear(); + lastch = CK_ESCAPE; // XX is this correct? + return is_set(MF_UNCANCEL) && !crawl_state.seen_hups; + } + + return Menu::process_command(cmd); +} + +string InvMenu::get_select_count_string(int) const +{ + if (flags & MF_PAGED_INVENTORY) + { + vector<SelItem> all_sel = get_selitems(true); + if (all_sel.empty()) + return ""; + + return make_stringf(" %d item%s", (int)all_sel.size(), + all_sel.size() > 1 ? "s" : ""); + } + + return Menu::get_select_count_string(0); +} + static bool _item_is_permadrop_candidate(const item_def &item) { // Known, non-artefact items of the types you see on the '\' menu proper. @@ -783,7 +854,7 @@ int sort_item_qty(const InvEntry *a) } int sort_item_slot(const InvEntry *a) { - return a->item->slot > 0 ? letter_to_index(a->item->slot) : 0; + return isalpha(a->item->slot) ? letter_to_index(a->item->slot) : 0; } bool sort_item_identified(const InvEntry *a) @@ -1060,7 +1131,7 @@ void InvMenu::do_preselect(InvEntry *ie) } } -vector<SelItem> InvMenu::get_selitems() const +vector<SelItem> InvMenu::get_selitems(bool include_offscreen) const { vector<SelItem> selected_items; for (MenuEntry *me : sel) @@ -1069,6 +1140,20 @@ vector<SelItem> InvMenu::get_selitems() const selected_items.emplace_back(inv->item->link, inv->selected_qty, inv->item, inv->has_star()); } + + if (include_offscreen) + { + for (int i = 0; i < static_cast<int>(ARRAYSZ(offscreen_sel)); ++i) + { + if (cur_osel == i) + continue; + + selected_items.insert(selected_items.end(), + offscreen_sel[i].begin(), + offscreen_sel[i].end()); + } + } + return selected_items; } @@ -1207,7 +1292,7 @@ vector<SelItem> select_items(const vector<const item_def*> &items, new_flags |= menu.get_flags() & MF_USE_TWO_COLUMNS; menu.set_flags(new_flags); menu.show(); - selected = menu.get_selitems(); + selected = menu.get_selitems(true); } return selected; } @@ -1313,6 +1398,10 @@ bool item_is_selected(const item_def &i, int selector) case OSEL_JEWELLERY_OR_TALISMAN: return i.base_type == OBJ_JEWELLERY || i.base_type == OBJ_TALISMANS; + case OSEL_GEAR: + return item_is_selected(i, OSEL_EQUIPABLE) + || i.base_type == OBJ_MISSILES; + default: return false; } @@ -1392,18 +1481,23 @@ static int _invent_select(const char *title = nullptr, if (title && menu.item_count()) menu.set_title(title); + // Cycle through all pages to properly apply pre-selections immediately. + for (int i = 0; i < 4; ++i) + menu.cycle_page(1); + menu.show(true); if (items) - *items = menu.get_selitems(); + *items = menu.get_selitems(true); return menu.getkey(); } void display_inventory() { - InvMenu menu(MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL); - menu.load_inv_items(OSEL_ANY, -1); + InvMenu menu(MF_SINGLESELECT | MF_ALLOW_FORMATTING | MF_SECONDARY_SCROLL + | MF_PAGED_INVENTORY); + menu.load_inv_items(OSEL_GEAR, -1); menu.set_type(menu_type::describe); menu.show(true); @@ -1414,29 +1508,6 @@ void display_inventory() } } -static string _drop_selitem_text(const vector<MenuEntry*> *s) -{ - bool extraturns = false; - - if (s->empty()) - return ""; - - for (MenuEntry *entry : *s) - { - const item_def *item = static_cast<item_def *>(entry->data); - if (item_is_equipped(*item)) - { - extraturns = true; - break; - } - } - - return make_stringf(" (%u%s turn%s)", - (unsigned int)s->size(), - extraturns? "+" : "", - s->size() > 1? "s" : ""); -} - static string _drop_prompt(bool as_menu_title, bool menu_autopickup_mode) { string prompt_base; @@ -1444,7 +1515,7 @@ static string _drop_prompt(bool as_menu_title, bool menu_autopickup_mode) if (as_menu_title && menu_autopickup_mode) prompt_base = "Drop (and turn off autopickup for) what? "; else if (as_menu_title) - prompt_base = "Drop what? "; + prompt_base = "Drop what? (Left/Right to switch category) "; else prompt_base = "Drop what? "; return prompt_base + slot_description() + " (_ for help)"; @@ -1470,13 +1541,13 @@ vector<SelItem> prompt_drop_items(const vector<SelItem> &preselected_items) // multi-select some items to drop _invent_select("", menu_type::drop, - OSEL_ANY, + OSEL_GEAR, -1, - MF_MULTISELECT | MF_ALLOW_FILTER | MF_SELECT_QTY, + MF_MULTISELECT | MF_ALLOW_FILTER | MF_SELECT_QTY | MF_PAGED_INVENTORY, _drop_menu_titlefn, &items, &Options.drop_filter, - _drop_selitem_text, + nullptr, &preselected_items); return items; diff --git a/crawl-ref/source/invent.h b/crawl-ref/source/invent.h index 541e3423a3..b2d2ba4ec2 100644 --- a/crawl-ref/source/invent.h +++ b/crawl-ref/source/invent.h @@ -54,6 +54,14 @@ struct SelItem : slot(s), quantity(q), item(it), has_star(do_star) { } + + bool operator== (const SelItem &o) const + { + return slot == o.slot + && quantity == o.quantity + && item == o.item + && has_star == o.has_star; + } }; typedef string (*invtitle_annotator)(const Menu *m, const string &oldtitle); @@ -158,7 +166,7 @@ public: void load_inv_items(int item_selector = OSEL_ANY, int excluded_slot = -1, function<MenuEntry* (MenuEntry*)> procfn = nullptr); - vector<SelItem> get_selitems() const; + vector<SelItem> get_selitems(bool include_offscreen = false) const; const menu_sort_condition *find_menu_sort_condition() const; void sort_menu(vector<InvEntry*> &items, const menu_sort_condition *cond); @@ -166,12 +174,16 @@ public: // Drop menu only: if true, dropped items are removed from autopickup. bool mode_special_drop() const; + void cycle_page(int dir); + protected: void do_preselect(InvEntry *ie); void select_item_index(int idx, int qty) override; bool examine_index(int i) override; int pre_process(int key) override; bool process_key(int key) override; + bool process_command(command_type cmd) override; + string get_select_count_string(int count) const override; virtual bool skip_process_command(int keyin) override; virtual bool is_selectable(int index) const override; virtual string help_key() const override; @@ -183,6 +195,11 @@ protected: invtitle_annotator title_annotate; string temp_title; + // Current tab in MF_PAGED_INVENTORY menus. + // Has no effect if that flag is not set. + int cur_osel; + vector<SelItem> offscreen_sel[4]; + private: bool _mode_special_drop; }; diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc index 84e2f42df0..f0abd8f3c0 100644 --- a/crawl-ref/source/items.cc +++ b/crawl-ref/source/items.cc @@ -2152,6 +2152,7 @@ static int _letter_for_consumable(item_def& item, bool first_pickup) { // If this is an identified item, first check the consumable_slot option to // see any default assignment and use this. + const operation_types oper = item_to_oper(&item); if (item.is_identified()) { char key = 0; @@ -2174,7 +2175,23 @@ static int _letter_for_consumable(item_def& item, bool first_pickup) } if (key > 0 && key != ' ') - return key; + { + // Verify that the player hasn't manually remapped something to this + // key already. (If they have, just jump to the next step.) + bool conflict = false; + for (int i = MAX_GEAR; i < ENDOFPACK; ++i) + { + if (you.inv[i].defined() && item_to_oper(&you.inv[i]) == oper + && you.inv[i].slot == key) + { + conflict = true; + break; + } + } + + if (!conflict) + return key; + } } if (!first_pickup) @@ -2230,7 +2247,6 @@ static int _letter_for_consumable(item_def& item, bool first_pickup) // Check which slots are strictly used already. bool used_slots[52] = {false}; - operation_types oper = item_to_oper(&item); for (int i = MAX_GEAR; i < ENDOFPACK; ++i) { if (you.inv[i].defined() && item_to_oper(&you.inv[i]) == oper diff --git a/crawl-ref/source/menu.h b/crawl-ref/source/menu.h index 74980a1a96..07e65d6585 100644 --- a/crawl-ref/source/menu.h +++ b/crawl-ref/source/menu.h @@ -280,6 +280,7 @@ enum MenuFlag MF_ARROWS_SELECT = 0x40000, ///< arrow keys select, rather than scroll MF_SHOW_EMPTY = 0x80000, ///< don't auto-exit empty menus MF_GRID_LAYOUT = 0x100000, ///< use a grid-style layout, filling by width first + MF_PAGED_INVENTORY = 0x200000, ///< uses left/right to switch between different inventory categories }; class UIMenu; diff --git a/crawl-ref/source/object-selector-type.h b/crawl-ref/source/object-selector-type.h index 53a2d329d3..0519d1d8fa 100644 --- a/crawl-ref/source/object-selector-type.h +++ b/crawl-ref/source/object-selector-type.h @@ -25,4 +25,5 @@ enum object_selector OSEL_ARTEFACT_WEAPON = -21, OSEL_MARKED_ITEMS = -22, OSEL_JEWELLERY_OR_TALISMAN = -23, + OSEL_GEAR = -24, // Equippable items + throwables }; diff --git a/crawl-ref/source/travel.cc b/crawl-ref/source/travel.cc index 779837dd47..4847b59a18 100644 --- a/crawl-ref/source/travel.cc +++ b/crawl-ref/source/travel.cc @@ -1121,6 +1121,14 @@ command_type travel() continue; } + // Poison doesn't wear off while in this state, so don't try waiting + // for it. + if (type == DUR_POISONING + && (you.is_nonliving() || you.is_lifeless_undead())) + { + continue; + } + // Save the player's position, so we can catch the degenerate case // where this results in us waiting indefinitely. you.props[AUTO_REST_STATUS_POS] = you.pos(); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 10:15:14
|
via 5bb89448b4a79aae45e433372bfde864c6bd2d45 (commit) from 40270de24b496199545ad74930e6ebe08fa8d01c (commit) ----------------------------------------------------------------------- commit 5bb89448b4a79aae45e433372bfde864c6bd2d45 Author: DracoOmega <dra...@gm...> Date: Fri Jul 18 07:40:59 2025 -0230 Fix draining Trove cost being 'be buggy' on overview screen (Ogregutan) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/dlua/lm_trove.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crawl-ref/source/dat/dlua/lm_trove.lua b/crawl-ref/source/dat/dlua/lm_trove.lua index 621ebcbd35..5abe742b79 100644 --- a/crawl-ref/source/dat/dlua/lm_trove.lua +++ b/crawl-ref/source/dat/dlua/lm_trove.lua @@ -137,6 +137,8 @@ function TroveMarker:overview_note (marker) return "lose all piety" elseif toll.type == "bane" then return "suffer the " .. crawl.bane_name(toll.bane) + elseif toll.type == "drain" then + return "suffer draining" else return "be buggy" end -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 06:20:14
|
via 40270de24b496199545ad74930e6ebe08fa8d01c (commit) via 7be9a2d591fed30882e97de44098567149e23a74 (commit) from 81d314105f3ee489e9f10e194fe7515a12a0a353 (commit) ----------------------------------------------------------------------- commit 40270de24b496199545ad74930e6ebe08fa8d01c Author: David Lawrence Ramsey <poo...@gm...> Date: Fri Jul 18 00:45:04 2025 -0500 Add a tile for the accursed mutation. Based on a palette-tweaked and edited version of UNUSED/gui/yred_dark_bargain.png. commit 7be9a2d591fed30882e97de44098567149e23a74 Author: David Lawrence Ramsey <poo...@gm...> Date: Fri Jul 18 01:06:22 2025 -0500 Rewrite desc for the "no potions" mutation. It's now consistently "You cannot drink." for both mummy and death-form players, which fits the "You cannot drink potions in your current state!" warning message elsewhere. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/mutation-data.h | 3 ++- crawl-ref/source/rltiles/dc-mutations.txt | 1 + crawl-ref/source/rltiles/gui/mutations/accursed.png | Bin 0 -> 2057 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 crawl-ref/source/rltiles/gui/mutations/accursed.png diff --git a/crawl-ref/source/mutation-data.h b/crawl-ref/source/mutation-data.h index cdc0bfbb34..cd80048da5 100644 --- a/crawl-ref/source/mutation-data.h +++ b/crawl-ref/source/mutation-data.h @@ -2529,7 +2529,7 @@ static const mutation_def mut_data[] = { MUT_NO_DRINK, 0, 1, mutflag::bad, "no potions", - {"You do not drink.", "", ""}, + {"You cannot drink.", "", ""}, {"Your mouth dries to ashes.", "", ""}, {"You gain the ability to drink.", "", ""}, TILEG_MUT_NO_DRINK, @@ -2818,6 +2818,7 @@ static const mutation_def mut_data[] = {"You recover more slowly from Doom and Banes.", "", ""}, {"You feel accursed.", "", ""}, {"You feel less accursed.", "", ""}, + TILEG_MUT_ACCURSED, }, // Makhleb-specific mutations diff --git a/crawl-ref/source/rltiles/dc-mutations.txt b/crawl-ref/source/rltiles/dc-mutations.txt index ea55cc1ab4..1bace84179 100644 --- a/crawl-ref/source/rltiles/dc-mutations.txt +++ b/crawl-ref/source/rltiles/dc-mutations.txt @@ -209,6 +209,7 @@ word_of_chaos WORD_OF_CHAOS # Per-species effects mutations hop_1 HOP hop_2 +accursed ACCURSED divine_attributes DIVINE_ATTRIBUTES forlorn FORLORN flat_hp_1 FLAT_HP diff --git a/crawl-ref/source/rltiles/gui/mutations/accursed.png b/crawl-ref/source/rltiles/gui/mutations/accursed.png new file mode 100644 index 0000000000..019f76a824 Binary files /dev/null and b/crawl-ref/source/rltiles/gui/mutations/accursed.png differ -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 02:20:11
|
via 81d314105f3ee489e9f10e194fe7515a12a0a353 (commit) via 89b82f3d1cf2e7c20c8dede848451ed986cd6b9b (commit) via 2adacdb53afa3d81e2363cc06fb42c3a3ca4f10b (commit) via b98de362c2a782b4f60ec34973d87c0d214565f3 (commit) from 1b205f4a7ac4a2671d3f2f83a1e1297cdf912134 (commit) ----------------------------------------------------------------------- commit 81d314105f3ee489e9f10e194fe7515a12a0a353 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 23:44:19 2025 -0230 Display the (P)ut on action when examining a talisman (Planckenstein) commit 89b82f3d1cf2e7c20c8dede848451ed986cd6b9b Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 23:43:49 2025 -0230 Fix a crash with displaying floor items in some item menus (Kush) One of the sort comparators only worked properly for items in the player's inventory, and if there were enough valid items on the ground (which had never been in the player's inventory before) to need sorting, the game would crash tying to populate the menu. commit 2adacdb53afa3d81e2363cc06fb42c3a3ca4f10b Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 21:11:29 2025 -0500 Stop adding "pair of" to gloves in Xom msgs. Since gloves' names all start with +0 and the like now, which produces incorrect messaging. commit b98de362c2a782b4f60ec34973d87c0d214565f3 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 21:10:00 2025 -0500 Choose more random slot items for Xom msgs. For cloaks, helmets, gloves, and boots, since multiple sets of them can be worn now. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/describe.cc | 1 + crawl-ref/source/invent.cc | 2 +- crawl-ref/source/xom.cc | 18 +++++------------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 88fffed13a..1c0784550c 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -3816,6 +3816,7 @@ static vector<command_type> _allowed_actions(const item_def& item) actions.push_back(CMD_WEAR_ARMOUR); break; case OBJ_JEWELLERY: + case OBJ_TALISMANS: if (item_is_equipped(item)) actions.push_back(CMD_REMOVE_JEWELLERY); else diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 0a3cdd872c..078c9b587e 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -783,7 +783,7 @@ int sort_item_qty(const InvEntry *a) } int sort_item_slot(const InvEntry *a) { - return letter_to_index(a->item->slot); + return a->item->slot > 0 ? letter_to_index(a->item->slot) : 0; } bool sort_item_identified(const InvEntry *a) diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc index 9ff62c6861..1cfe969691 100644 --- a/crawl-ref/source/xom.cc +++ b/crawl-ref/source/xom.cc @@ -3362,7 +3362,7 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_CLOAK)) + if (item_def* item = _xom_get_random_worn_slot_item(SLOT_CLOAK)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); string str = _get_xom_speech("cloak slot"); @@ -3381,7 +3381,7 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_HELMET)) + if (item_def* item = _xom_get_random_worn_slot_item(SLOT_HELMET)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); string str = _get_xom_speech("helmet slot"); @@ -3400,17 +3400,9 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_GLOVES)) + if (item_def* item = _xom_get_random_worn_slot_item(SLOT_GLOVES)) { - string gloves_name = item->name(DESC_BASENAME, false, false, false); - // XXX: If the gloves' name doesn't start with "pair of", make it do so, - // so that it always comes out as singular for grammar purposes. This - // happens with the Mad Mage's Maulers and Delatra's gloves; see - // item_def::name_aux(). - if (gloves_name.find("pair of ") != 0) - gloves_name = "pair of " + gloves_name; - - string name = "your " + gloves_name; + string name = "your " + item->name(DESC_BASENAME, false, false, false); string str = _get_xom_speech("gloves slot"); str = replace_all(str, "@your_item@", name); @@ -3419,7 +3411,7 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_LOWER_BODY)) + if (item_def* item = _xom_get_random_worn_slot_item(SLOT_LOWER_BODY)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); string str = _get_xom_speech("boots slot"); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 01:45:14
|
via 1b205f4a7ac4a2671d3f2f83a1e1297cdf912134 (commit) via d9fd00228f0f64cf0a4b821368443d99fbbbc2d8 (commit) via 6208bf039ecf2a77402194453867ef59a971f6c6 (commit) from 2f817d26c11d8105e9dd7db53aafa23ca71c40e6 (commit) ----------------------------------------------------------------------- commit 1b205f4a7ac4a2671d3f2f83a1e1297cdf912134 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 20:38:42 2025 -0500 Rearrange Xom message item checks. Check the offhand slot right after the weapon slot. commit d9fd00228f0f64cf0a4b821368443d99fbbbc2d8 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 19:45:16 2025 -0500 Genericise a Xom msg random item check. Instead of checking only the ring slot, have it take a slot. commit 6208bf039ecf2a77402194453867ef59a971f6c6 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 20:07:09 2025 -0500 Fix Xom msg refs to poltergeists' having heads. Use "form" instead of "head" for them. Adding an entire head_name() function for only the one species seems like overkill, so do it manually for now. Also, add another amulet message referencing the head. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/database/godspeak.txt | 6 ++-- crawl-ref/source/xom.cc | 46 +++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/crawl-ref/source/dat/database/godspeak.txt b/crawl-ref/source/dat/database/godspeak.txt index 37b35374f4..ee9c783ef7 100644 --- a/crawl-ref/source/dat/database/godspeak.txt +++ b/crawl-ref/source/dat/database/godspeak.txt @@ -495,13 +495,13 @@ Xom cloak slot @Your_item@ billows in an unfelt wind. -@Your_item@ briefly wraps itself around your head! +@Your_item@ briefly wraps itself around your @head@! @Your_item@ is briefly covered in lurid @any_colour_pattern@! %%%% Xom helmet slot -@Your_item@ leaps into the air, briefly spins, then lands back on your head! +@Your_item@ leaps into the air, briefly spins, then lands back on your @head@! %%%% Xom offhand slot @@ -522,6 +522,8 @@ Xom amulet slot @Your_item@ pulsates! @Your_item@ flares @any_glowing_colour@, then returns to normal. + +@Your_item@ briefly flies off and hovers over your @head@! %%%% Xom gizmo slot diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc index 91a1c7ddd1..9ff62c6861 100644 --- a/crawl-ref/source/xom.cc +++ b/crawl-ref/source/xom.cc @@ -3107,14 +3107,14 @@ static void _xom_fog(int /*sever*/) god_speaks(GOD_XOM, _get_xom_speech("cloud").c_str()); } -static item_def* _xom_get_random_worn_ring() +static item_def* _xom_get_random_worn_slot_item(equipment_slot item_slot) { - vector<item_def*> worn_rings = you.equipment.get_slot_items(SLOT_RING); + vector<item_def*> worn_slot_item = you.equipment.get_slot_items(item_slot); - if (worn_rings.empty()) + if (worn_slot_item.empty()) return nullptr; - return worn_rings[random2(worn_rings.size())]; + return worn_slot_item[random2(worn_slot_item.size())]; } static void _xom_pseudo_miscast(int /*sever*/) @@ -3351,10 +3351,10 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_CLOAK)) + if (item_def* item = you.equipment.get_first_slot_item(SLOT_OFFHAND)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); - string str = _get_xom_speech("cloak slot"); + string str = _get_xom_speech("offhand slot"); str = replace_all(str, "@your_item@", name); str = replace_all(str, "@Your_item@", uppercase_first(name)); @@ -3362,25 +3362,41 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_HELMET)) + if (item_def* item = you.equipment.get_first_slot_item(SLOT_CLOAK)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); - string str = _get_xom_speech("helmet slot"); + string str = _get_xom_speech("cloak slot"); str = replace_all(str, "@your_item@", name); str = replace_all(str, "@Your_item@", uppercase_first(name)); + /* XXX: The formless mutation doesn't technically mean you don't have a + * form; it means you don't have a head. */ + if (you.has_mutation(MUT_FORMLESS)) + { + str = replace_all(str, "@head@", + you.has_mutation(MUT_FORMLESS) ? "form" : "head"); + } + messages.push_back(str); } - if (item_def* item = you.equipment.get_first_slot_item(SLOT_OFFHAND)) + if (item_def* item = you.equipment.get_first_slot_item(SLOT_HELMET)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); - string str = _get_xom_speech("offhand slot"); + string str = _get_xom_speech("helmet slot"); str = replace_all(str, "@your_item@", name); str = replace_all(str, "@Your_item@", uppercase_first(name)); + /* XXX: The formless mutation doesn't technically mean you don't have a + * form; it means you don't have a head. */ + if (you.has_mutation(MUT_FORMLESS)) + { + str = replace_all(str, "@head@", + you.has_mutation(MUT_FORMLESS) ? "form" : "head"); + } + messages.push_back(str); } @@ -3422,6 +3438,14 @@ static void _xom_pseudo_miscast(int /*sever*/) str = replace_all(str, "@your_item@", name); str = replace_all(str, "@Your_item@", uppercase_first(name)); + /* XXX: The formless mutation doesn't technically mean you don't have a + * form; it means you don't have a head. */ + if (you.has_mutation(MUT_FORMLESS)) + { + str = replace_all(str, "@head@", + you.has_mutation(MUT_FORMLESS) ? "form" : "head"); + } + messages.push_back(str); } @@ -3436,7 +3460,7 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } - if (item_def* item = _xom_get_random_worn_ring()) + if (item_def* item = _xom_get_random_worn_slot_item(SLOT_RING)) { // Don't just say "your ring" here. We want to know which one. string name = "your " + item->name(DESC_QUALNAME, false, false, false); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-18 00:25:10
|
via 2f817d26c11d8105e9dd7db53aafa23ca71c40e6 (commit) from 84388fc2415b6b2ffccb1896a22d0924ba3c2d82 (commit) ----------------------------------------------------------------------- commit 2f817d26c11d8105e9dd7db53aafa23ca71c40e6 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 19:18:52 2025 -0500 Add Xom messages for the amulet slot. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/dat/database/godspeak.txt | 6 ++++++ crawl-ref/source/xom.cc | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/crawl-ref/source/dat/database/godspeak.txt b/crawl-ref/source/dat/database/godspeak.txt index 5e6adf53ce..37b35374f4 100644 --- a/crawl-ref/source/dat/database/godspeak.txt +++ b/crawl-ref/source/dat/database/godspeak.txt @@ -517,6 +517,12 @@ Xom boots slot @Your_item@ grows to a huge size, then shrinks back down! %%%% +Xom amulet slot + +@Your_item@ pulsates! + +@Your_item@ flares @any_glowing_colour@, then returns to normal. +%%%% Xom gizmo slot @Your_item@ jiggles! diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc index ebcd1d4c57..91a1c7ddd1 100644 --- a/crawl-ref/source/xom.cc +++ b/crawl-ref/source/xom.cc @@ -3414,6 +3414,17 @@ static void _xom_pseudo_miscast(int /*sever*/) messages.push_back(str); } + if (item_def* item = you.equipment.get_first_slot_item(SLOT_AMULET)) + { + string name = "your " + item->name(DESC_BASENAME, false, false, false); + string str = _get_xom_speech("amulet slot"); + + str = replace_all(str, "@your_item@", name); + str = replace_all(str, "@Your_item@", uppercase_first(name)); + + messages.push_back(str); + } + if (item_def* item = you.equipment.get_first_slot_item(SLOT_GIZMO)) { string name = "your " + item->name(DESC_BASENAME, false, false, false); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-17 22:40:14
|
via 84388fc2415b6b2ffccb1896a22d0924ba3c2d82 (commit) from 2c30cb724a28f5c94bdd4c139e4a30100f53c888 (commit) ----------------------------------------------------------------------- commit 84388fc2415b6b2ffccb1896a22d0924ba3c2d82 Author: David Lawrence Ramsey <poo...@gm...> Date: Thu Jul 17 17:35:32 2025 -0500 Fix typo. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/invent.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 8465a4e00e..0a3cdd872c 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -564,7 +564,7 @@ string no_selectables_message(int item_selector) case OSEL_AMULET: return "You aren't carrying any amulets."; case OSEL_JEWELLERY_OR_TALISMAN: - return "You aren't carrying any jewllery or talismans."; + return "You aren't carrying any jewellery or talismans."; case OSEL_LAUNCHING: return "You aren't carrying any items that might be thrown or fired."; case OSEL_EVOKABLE: -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-17 21:50:10
|
via 2c30cb724a28f5c94bdd4c139e4a30100f53c888 (commit) via 1458e82541da783d6fb0440c54235665463c1de9 (commit) via e9671bf27a1ed58cb8b5be203fb43f9650337dfc (commit) via 950e44d591b74fffda387e3b642d11adfd249423 (commit) via 7cc3d47e4f6f6006b9babb83d976b2773e35a42a (commit) via 758b7540862a2d61abc67fb4616358f35387d03c (commit) from 3f22ea3c6ad96d816a3d4ae7410ef3f1d9fabc5f (commit) ----------------------------------------------------------------------- commit 2c30cb724a28f5c94bdd4c139e4a30100f53c888 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:15:27 2025 -0230 Don't forbid Coglins from putting on talismans commit 1458e82541da783d6fb0440c54235665463c1de9 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:15:04 2025 -0230 Don't auto-remove a jewellery item while wearing a talisman (Planckenstein) If you had a single ring or amulet on at the same time as a talisman, the game would automatically remove it when you pressed (R) instead of asking which item you wanted to remove. commit e9671bf27a1ed58cb8b5be203fb43f9650337dfc Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:13:56 2025 -0230 Fix enter being broken in the (F)ire menu (Planckenstein) commit 950e44d591b74fffda387e3b642d11adfd249423 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:13:37 2025 -0230 Fix default hotkeys for !magic/!might both being m (Planckenstein) commit 7cc3d47e4f6f6006b9babb83d976b2773e35a42a Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:10:43 2025 -0230 Fix missing kauxes for a number of beam attacks (ebonnov) I'm not sure the full list, but a bunch of spells that used beams for damage but didn't fire normal projectiles were missing an aux_source, resulting in non-specific death messages. (Regular projectile beams would fill in their aux_source from their name member automatically, but many other uses of them would not.) There's a small chance something out there relied on this behavior, but hopefully not. commit 758b7540862a2d61abc67fb4616358f35387d03c Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 19:08:35 2025 -0230 Fix broken kauxes for LoS attack spells (gammafunk) Apparently broken since 733a6ea, causing Ozocubu's Refrigeration to produce death messages suggesting it was caused by the monster hitting you in melee instead (which is rather more noticable now that it is cast by Orbs of Winter, which have no attack...) This also simultaneously gives a unique kaux for dying to the Singing Sword's sonic wave, which I'm not sure it had before. Who will be the first to die to it, I wonder? (Will anyone?) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/beam.cc | 4 ++-- crawl-ref/source/dat/defaults/consumable_shortcuts.txt | 2 +- crawl-ref/source/invent.cc | 2 +- crawl-ref/source/item-use.cc | 6 ++++-- crawl-ref/source/mon-cast.cc | 2 -- crawl-ref/source/spl-damage.cc | 12 +++++++++++- crawl-ref/source/spl-monench.cc | 1 + 7 files changed, 20 insertions(+), 9 deletions(-) diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index ec29c6fd55..0dd1080e91 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -3185,11 +3185,11 @@ void bolt::internal_ouch(int dam) else if (MON_KILL(thrower)) { ouch(dam, KILLED_BY_BEAM, source_id, - aux_source.c_str(), true, + what, true, source_name.empty() ? nullptr : source_name.c_str()); } else // KILL_NON_ACTOR || (YOU_KILL && aux_source) - ouch(dam, KILLED_BY_WILD_MAGIC, source_id, aux_source.c_str()); + ouch(dam, KILLED_BY_WILD_MAGIC, source_id, what); } // [ds] Apply a fuzz if the monster lacks see invisible and is trying to target diff --git a/crawl-ref/source/dat/defaults/consumable_shortcuts.txt b/crawl-ref/source/dat/defaults/consumable_shortcuts.txt index ad186388bd..1b17f7f278 100644 --- a/crawl-ref/source/dat/defaults/consumable_shortcuts.txt +++ b/crawl-ref/source/dat/defaults/consumable_shortcuts.txt @@ -29,7 +29,7 @@ consumable_shortcut ^= potion of cancellation:C consumable_shortcut ^= potion of ambrosia:a consumable_shortcut ^= potion of invisibility:i consumable_shortcut ^= potion of experience:E -consumable_shortcut ^= potion of magic:m +consumable_shortcut ^= potion of magic:g consumable_shortcut ^= potion of berserk rage:B consumable_shortcut ^= potion of mutation:M consumable_shortcut ^= potion of resistance:r diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index aa455871a4..8465a4e00e 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -1887,7 +1887,7 @@ int prompt_invent_item(const char *prompt, // hacky, but lets the inscription checks below trip // TODO: this code should not rely on keyin, it breaks cmd // bindings - keyin = items[0].slot; + keyin = items[0].item->slot; } else if (other_valid_char != 0 && keyin == other_valid_char) { diff --git a/crawl-ref/source/item-use.cc b/crawl-ref/source/item-use.cc index 18701f45da..e5f2c6ae54 100644 --- a/crawl-ref/source/item-use.cc +++ b/crawl-ref/source/item-use.cc @@ -969,7 +969,9 @@ static bool _can_generically_use(operation_types oper) return false; } // can't differentiate between these two at this point - if (!you_can_wear(SLOT_RING, true) && !you_can_wear(SLOT_AMULET, true)) + if (you_can_wear(SLOT_RING, true) == false + && you_can_wear(SLOT_AMULET, true) == false + && you.transform_uncancellable) { mprf(MSGCH_PROMPT, "You can't %s jewellery%s.", oper == OPER_PUTON ? "wear" : "remove", @@ -1003,7 +1005,7 @@ bool use_an_item(operation_types oper, item_def *target) if (!target && oper == OPER_REMOVE && !Options.jewellery_prompt) { vector<item_def*> jewellery = you.equipment.get_slot_items(SLOT_ALL_JEWELLERY); - if (jewellery.size() == 1) + if (jewellery.size() == 1 && !you.active_talisman()) target = jewellery[0]; } diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc index 9939ff2cff..dba48d91cb 100644 --- a/crawl-ref/source/mon-cast.cc +++ b/crawl-ref/source/mon-cast.cc @@ -2654,8 +2654,6 @@ bool setup_mons_cast(const monster* mons, bolt &pbolt, spell_type spell_cast, pbolt.target = theBeam.target; pbolt.source = mons->pos(); pbolt.set_is_tracer(false); - if (pbolt.aux_source.empty() && !pbolt.is_enchantment()) - pbolt.aux_source = pbolt.name; return true; } diff --git a/crawl-ref/source/spl-damage.cc b/crawl-ref/source/spl-damage.cc index 73bfb1d056..a4170da441 100644 --- a/crawl-ref/source/spl-damage.cc +++ b/crawl-ref/source/spl-damage.cc @@ -603,7 +603,17 @@ static int _los_spell_damage_actor(const actor* agent, actor &target, you.pet_target = target.mindex(); } else if (hurted) - target.hurt(agent, hurted, beam.flavour); + { + kill_method_type ktype = KILLED_BY_BEAM; + if (beam.origin_spell == SPELL_DRAIN_LIFE) + ktype = KILLED_BY_DRAINING; + else if (beam.origin_spell == SPELL_OZOCUBUS_REFRIGERATION) + ktype = KILLED_BY_FREEZING; + + string aux = beam.origin_spell == SPELL_SONIC_WAVE ? "sonic wave" : ""; + + target.hurt(agent, hurted, beam.flavour, ktype, "", aux); + } // Cold-blooded creatures can be slowed. if (beam.origin_spell == SPELL_OZOCUBUS_REFRIGERATION diff --git a/crawl-ref/source/spl-monench.cc b/crawl-ref/source/spl-monench.cc index 765014d858..151c39198e 100644 --- a/crawl-ref/source/spl-monench.cc +++ b/crawl-ref/source/spl-monench.cc @@ -440,6 +440,7 @@ spret cast_percussive_tempering(const actor& caster, monster& target, int power, shockwave.is_explosion = true; shockwave.ex_size = 1; shockwave.origin_spell = SPELL_PERCUSSIVE_TEMPERING; + shockwave.aux_source = "blast of sparks and slag"; zappy(ZAP_PERCUSSIVE_TEMPERING, power, true, shockwave); shockwave.explode(true, true); -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-17 19:20:15
|
via 3f22ea3c6ad96d816a3d4ae7410ef3f1d9fabc5f (commit) via b23e77fdfe48ef81b6b208c3c3091cec09514759 (commit) via 83b025070fae1e1cf7b1c0dd02bfbbc1c876ff86 (commit) from 2aa8828f32cc0e6f1aafcf435c2fb752a8f2e421 (commit) ----------------------------------------------------------------------- commit 3f22ea3c6ad96d816a3d4ae7410ef3f1d9fabc5f Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 16:47:48 2025 -0230 Don't remap consumables with no default binding upon identifying (coraxio) They would automatically move to 'the first available letter' upon being identified, instead of just staying put. (This only applies to !moonshine using default settings, but players can always edit/remove those defaults.) commit b23e77fdfe48ef81b6b208c3c3091cec09514759 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 16:45:33 2025 -0230 Don't announce consumable remapping that happens at game start commit 83b025070fae1e1cf7b1c0dd02bfbbc1c876ff86 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 16:45:12 2025 -0230 Fix new characters never generating with more than one consumable type (Whichever was defined last was what they would end up with.) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/items.cc | 9 ++++++--- crawl-ref/source/ng-setup.cc | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/crawl-ref/source/items.cc b/crawl-ref/source/items.cc index 4e1a11c330..84e2f42df0 100644 --- a/crawl-ref/source/items.cc +++ b/crawl-ref/source/items.cc @@ -2148,7 +2148,7 @@ static bool _merge_wand_charges(const item_def &it, int &inv_slot, bool quiet) } // Returns the preferred letter for a given consumable item. -static int _letter_for_consumable(item_def& item) +static int _letter_for_consumable(item_def& item, bool first_pickup) { // If this is an identified item, first check the consumable_slot option to // see any default assignment and use this. @@ -2177,6 +2177,9 @@ static int _letter_for_consumable(item_def& item) return key; } + if (!first_pickup) + return item.slot; + // If there wasn't any, or this is unidentified, try to pick any available // letter that isn't 'reserved' by the consumable_slot option for this // sub-category of item. @@ -2260,7 +2263,7 @@ static int _assign_inventory_letter(item_def& item) if (inventory_category_for(item) == INVENT_GEAR) return index_to_letter(item.link); else - return _letter_for_consumable(item); + return _letter_for_consumable(item, true); } /** @@ -2283,7 +2286,7 @@ item_def *auto_assign_item_slot(item_def& item, bool quiet) if (inventory_category_for(item) == INVENT_CONSUMABLE) { const short old_slot = item.slot; - item.slot = _letter_for_consumable(item); + item.slot = _letter_for_consumable(item, false); if (item.slot != old_slot && !quiet) mprf_nocap("%c -> %s", old_slot, item.name(DESC_INVENTORY).c_str()); diff --git a/crawl-ref/source/ng-setup.cc b/crawl-ref/source/ng-setup.cc index 5452a0f8b6..80e4c950a1 100644 --- a/crawl-ref/source/ng-setup.cc +++ b/crawl-ref/source/ng-setup.cc @@ -110,7 +110,7 @@ item_def* newgame_make_item(object_class_type base, inventory_category category = inventory_category_for(base); int slot; int start = category == INVENT_CONSUMABLE ? MAX_GEAR : 0; - int end = category == INVENT_GEAR ? MAX_GEAR : 0; + int end = category == INVENT_GEAR ? MAX_GEAR : ENDOFPACK; for (slot = start; slot < end; ++slot) { item_def& item = you.inv[slot]; @@ -601,7 +601,7 @@ static void _setup_generic(const newgame_def& ng, if (!item.props.exists("adjusted")) { item.props["adjusted"] = true; - auto_assign_item_slot(item); + auto_assign_item_slot(item, true); } } -- Dungeon Crawl Stone Soup |
From: <gi...@cr...> - 2025-07-17 17:50:19
|
via 2aa8828f32cc0e6f1aafcf435c2fb752a8f2e421 (commit) via 6a5dc71c24c1e395d8ad98fd1a4cc6eac2ba07b9 (commit) via ff86fb1ae44d103b91982ed79f9937f9eb3fe2b8 (commit) via 2ee0592cccb24955cec6c80e3ae889d945327bb3 (commit) via a240211e49849f1eed3e4f922af07cda789f0406 (commit) via 95e1f2edf6e36a5583acb9d0f88f69bdfb581deb (commit) via 8f0873f1e596a738b6ce32dc17ea38cc34384c58 (commit) via 39c613d83245634ac3c12b0620e139d0b26bd03c (commit) via 928708bbf42150c8dcb9939b884021976306e65a (commit) via d6fc47bd0f42f45846781ac688f3c1cc1316fcfe (commit) via 70df15b1d4c8e5c30d5b2590723c9032006f4607 (commit) via b50b00bb3c40d1d7cfc3f0a903d9104de0a104a4 (commit) from 1673ddcb0ae94647088d2a3d4b12af2567f572dd (commit) ----------------------------------------------------------------------- commit 2aa8828f32cc0e6f1aafcf435c2fb752a8f2e421 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 15:02:55 2025 -0230 Change webtiles action panel sort order Now also sorts each sub-category by 'usefulness' to more closely mimic the default ordering in the inventory menus. (Also, I feel like 'letter' is less useful with the new default consumable_slot behavior.) Hopefully this doesn't end up being too controversial. commit 6a5dc71c24c1e395d8ad98fd1a4cc6eac2ba07b9 Author: DracoOmega <dra...@gm...> Date: Thu Jul 17 12:45:20 2025 -0230 Let command repeat work in local tiles while having an unaffordable ability This was a bit of work to track down, but essentially: in order to grey out unusable abilities on the local tiles ability bar, each time the screen is redrawn, check_ability_possible() is called. And enough_mp() and enough_hp() are both called from that function with abort_macros = true, which means that any time the usability of an ability is queried and you don't have enough HP or MP for it, macros and key-repeat are automatically cancelled. While that makes some sense when it's called during you actually trying to *use* the ability (and failing), it doesn't make sense when merely checking whether or not you *could*. And as the code for handling command repeat is piped through the normal input loop, this means that it redraws the screen at the start of each new command, which redraws the ability icons, which checks their usability, which then aborts the in-progress command repeat before it can even do anything. Now, it should not. I don't *think* making silent check_ability_possible() calls never interrupt macros on its own should cause any further problems - checking spell usability already didn't do so - and actually trying to use the ability and failing will still do so. commit ff86fb1ae44d103b91982ed79f9937f9eb3fe2b8 Author: DracoOmega <dra...@gm...> Date: Wed Jul 16 05:54:35 2025 -0230 Automatically disable autopickup of dropped consumables Since there's no longer any reason to drop them unless you don't want to see them in your inventory, do this automatically. commit 2ee0592cccb24955cec6c80e3ae889d945327bb3 Author: DracoOmega <dra...@gm...> Date: Wed Jul 16 05:46:42 2025 -0230 Make the 'next page' button in the local webtiles inventory more obvious It wasn't clear that clicking on it would do anything. (Also make it so that the display updates immediately when you click on it and not 'The next time you move the mouse after clicking on it') commit a240211e49849f1eed3e4f922af07cda789f0406 Author: DracoOmega <dra...@gm...> Date: Wed Jul 16 05:45:20 2025 -0230 Add a couple additional rows to the local tiles item panel Now that players are more likely to carry more items around at once. commit 95e1f2edf6e36a5583acb9d0f88f69bdfb581deb Author: DracoOmega <dra...@gm...> Date: Tue Jul 15 13:58:44 2025 -0230 Fix a minor text wrapping issue with the % screen commit 8f0873f1e596a738b6ce32dc17ea38cc34384c58 Author: DracoOmega <dra...@gm...> Date: Tue Jul 15 13:57:34 2025 -0230 Make talismans something you (P)up on instead of evoke Remaining on e(V)oke after the consumable inventory change would result in both consumables and non-consumables being on the same use screen, which could lead to key conflicts (and in general I feel is something that should be avoided as much as possible). So they are now something the player has to (P)ut on. This means they also must be in the player's inventory at all times (but revised inventory limits should make this a complete non-issue). Dropping a talisman automatically leaves the form, as one might expect, and the Begin Untransform ability has been removed. Save compat will put a copy of the player's current talisman into their inventory (which will sometimes duplicate it, but that is harmless; there's nothing you can *do* with a second identical one.). In the incredibly unlikely case someone has 52 pieces of equipment already in their inventory, it will untransform them and drop the appropriate talisman at their feet. But this would require them to have had nothing in their inventory *but* equipment, which seems profoudly unlikely. Your current talisman will also show up in % and dumps, which seems a nice minor benefit. I'm not touching Ash's Curse of Devices right now, pending planned Ash curse changes that will make that unnecessary. commit 39c613d83245634ac3c12b0620e139d0b26bd03c Author: DracoOmega <dra...@gm...> Date: Mon Jul 14 15:14:42 2025 -0230 Allow quick-scrolling between item categories with left/right arrows While this works in general inventory menus, it was foremost intended for the drop menu (where the 'jump to item category' shortcuts aren't really functional for that purpose, since they will also select all items of that category to be dropped). commit 928708bbf42150c8dcb9939b884021976306e65a Author: DracoOmega <dra...@gm...> Date: Mon Jul 14 13:29:38 2025 -0230 Expand inventory to alleviate most remaining inventory pressures Crawl's inventory limit wasn't very restrictive in a gameplay-affecting sense (players can carry an enormous number of tactical tools at once, and freely return to pick up strategic tools whenever they want), but just small enough that butting up against it still happened potentially many times a game, as autoexplore tries to grab items you don't especially care about and the player is forced to stop and figure out which of multiple items they'll never use is the one they'll never use *the most*. This interrupts the flow of gameplay and is generally a minor nuisance without much resulting gameplay value (as you can still carry *almost* everything you'd ever want to). However, Crawl's inventory system was very married to its 52 item limit in multiple ways, not least of which being: that's how many letters there are. Some previous proposals suggested expanding that in minor ways, but this is an attempt to have the final word on inventory limits, by splitting each consumable verb into its own category and essentially allowing you to hold every single consumable in the game at once *on top* of 52 pieces of equipment. This means it is now possible to have multiple items on (a), so long as each of those belongs to a different category: equipment (including throwables), potions, scrolls, and wands/evokabes. Since each of these is primarily used via separate commands, there is typically no risk of ambiguity (eg: ra, qa, Va, Wa will all unambiguously grab the single matching item). In fact, this very property allows for mapping specific consumables to specific letters via option, consistently from game to game (eg: qc can be made to always quaff curing), which I think may be a solid QoL improvement once players get used to it. For menus that show the entire inventory at once (eg: 'd'rop), pressing letters will now select the *nearest* item matching that letter. However there should be much less need to quickly drop things, so I hope this won't be a large inconvenience (and well worth the gain in other areas). And the game tries very, very hard to make sure no unidentified scroll and potions ever end up on the same letter, so the ?id menu should also be unambiguous. On a backend level, this expands you.inv[] to 127 slots, reserving all beyond [51] for consumables (in any order). While not strictly unlimited, this is enough room to simultaneously store every consumable currently in the game at once (including disjoint item sets) with room to spare. If, in future, this becomes untrue, it should be simple to expand that number. The first 52 slots retain their current behavior (ie: rearranging themselves when items change letter), while slots beyond 52 do not require their link and slot members to match (ie: they can change letter without being moved in the array). The item_slot option has been renamed gear_slot and functions only on equipment. A simpler consumable_shortcut option replaces it for consumables - mapping a single item to a single letter. This is enabled by default, with a full set of default values for all potions, scrolls, and wands. An important aspect of this option's behavior is that it will *never* map unidentified items to any letter reserved for a specific item. So one can ensure that, eg, blinking scrolls are always on rb and pressing rb could never result in reading a different scroll under any circumstance (beside the player manually putting it on b themselves). I think, once players get used to it, that this will be a meaningful QoL improvement. And overall, having to almost never care about inventory limits again, should be good for everyone. commit d6fc47bd0f42f45846781ac688f3c1cc1316fcfe Author: DracoOmega <dra...@gm...> Date: Sat Jul 12 10:40:19 2025 -0230 New sort_menus option: usefulness This sorts consumables by their current usefulness in descending order of Emergency, Good, Normal, Dangerous, Bad, Useless. It is enabled by default for actions like quaff and read, in anticipation of upcoming consumable inventory changes. commit 70df15b1d4c8e5c30d5b2590723c9032006f4607 Author: DracoOmega <dra...@gm...> Date: Sat Jul 12 10:32:09 2025 -0230 Mark ?silence as a 'dangerous' item It is likely even more double-edged than many scrolls the game aready marks as such, especially by lategame. commit b50b00bb3c40d1d7cfc3f0a903d9104de0a104a4 Author: DracoOmega <dra...@gm...> Date: Sat Jul 12 10:17:21 2025 -0230 Make the 'charged' sort_menus option work for evokers Empty wands haven't been a thing for several years, but evokers *are* something that can be 'empty' in one's inventory, so let's use it to for them instead. ----------------------------------------------------------------------- Summary of changes: crawl-ref/docs/crawl_manual.rst | 12 +- crawl-ref/docs/options_guide.txt | 36 ++- crawl-ref/source/ability-type.h | 2 + crawl-ref/source/ability.cc | 22 +- crawl-ref/source/acquire.cc | 4 +- crawl-ref/source/adjust.cc | 95 +++++-- crawl-ref/source/adjust.h | 8 +- crawl-ref/source/command.cc | 2 +- .../source/dat/defaults/consumable_shortcuts.txt | 49 ++++ crawl-ref/source/dat/descript/items.txt | 70 +++--- crawl-ref/source/dbg-asrt.cc | 2 +- crawl-ref/source/defines.h | 5 +- crawl-ref/source/describe.cc | 9 +- crawl-ref/source/evoke.cc | 80 ------ crawl-ref/source/files.cc | 5 + crawl-ref/source/initfile.cc | 45 +++- crawl-ref/source/invent.cc | 117 +++++++-- crawl-ref/source/invent.h | 1 + crawl-ref/source/item-def.h | 8 +- crawl-ref/source/item-name.cc | 14 +- crawl-ref/source/item-prop.cc | 21 ++ crawl-ref/source/item-use.cc | 234 ++++++++++------- crawl-ref/source/item-use.h | 5 + crawl-ref/source/items.cc | 280 +++++++++++++++++++-- crawl-ref/source/items.h | 15 +- crawl-ref/source/l-item.cc | 4 +- crawl-ref/source/menu.cc | 35 +-- crawl-ref/source/mutation.cc | 6 +- crawl-ref/source/ng-setup.cc | 12 +- crawl-ref/source/object-selector-type.h | 3 +- crawl-ref/source/options.h | 11 +- crawl-ref/source/output.cc | 63 +++-- crawl-ref/source/player-equip.cc | 6 +- crawl-ref/source/player.cc | 51 ++-- crawl-ref/source/player.h | 6 +- crawl-ref/source/quiver.cc | 11 +- crawl-ref/source/rltiles/dc-item.txt | 5 + .../commands/page_next.png} | Bin 4306 -> 4385 bytes .../commands/page_previous.png} | Bin 4306 -> 4386 bytes crawl-ref/source/skills.cc | 4 +- crawl-ref/source/tag-version.h | 2 + crawl-ref/source/tags.cc | 53 +++- crawl-ref/source/tiledoll.cc | 2 +- crawl-ref/source/tilepick.cc | 1 - crawl-ref/source/tilereg-inv.cc | 11 +- crawl-ref/source/tilesdl.cc | 2 +- crawl-ref/source/tileweb.cc | 14 +- crawl-ref/source/transform.cc | 53 ++-- crawl-ref/source/transform.h | 2 +- .../webserver/game_data/static/action_panel.js | 6 +- crawl-ref/source/wiz-fsim.cc | 4 +- crawl-ref/source/wiz-you.cc | 2 +- 52 files changed, 1050 insertions(+), 460 deletions(-) create mode 100644 crawl-ref/source/dat/defaults/consumable_shortcuts.txt copy crawl-ref/source/rltiles/{effect/shadow_shot2.png => gui/commands/page_next.png} (65%) copy crawl-ref/source/rltiles/{effect/shadow_shot0.png => gui/commands/page_previous.png} (65%) diff --git a/crawl-ref/docs/crawl_manual.rst b/crawl-ref/docs/crawl_manual.rst index 65ef639009..dcdc514207 100644 --- a/crawl-ref/docs/crawl_manual.rst +++ b/crawl-ref/docs/crawl_manual.rst @@ -710,7 +710,7 @@ adventures, how they are displayed, and what commands there are to use them: " amulets (use 'P'ut on and 'R'emove) \| staves (use 'w'ield) : spellbooks (use 'M'emorise and 'z'ap, 'Q' to quiver) -% talismans (use 'V' to evoke) +% talismans (use 'P'ut on and 'R'remove) } miscellaneous (use 'V' to evoke, 'Q' to quiver) $ gold (use 'g' to pick up) ======= ============= ================================================ @@ -949,10 +949,10 @@ Talismans allow their user to shift into a different form. Entering or leaving a form with a talisman requires a brief period of concentration, but otherwise, forms last until the user chooses to leave them. -More powerful talismans require some amount of Shapeshifting skill, without -which a user will find their maximum health reduced until they leave the form. -Shapeshifting skill also increases other benefits provided by talismans' forms, -though weaker talismans have a limit to how helpful skill can be. +Most talismans require some amount of Shapeshifting skill, without which a user +will find their maximum health reduced until they leave the form. Shapeshifting +skill also increases other benefits provided by talismans' forms, though weaker +talismans have a limit to how helpful skill can be. { Miscellaneous ======================================== @@ -2086,7 +2086,7 @@ Artificers Shapeshifters Shapeshifters use talismans to shift their body into different forms, granting them uncanny power but making them unable to use some items. - They enter the dungeon with two talismans, some flux baubles, and a + They enter the dungeon with two talismans, some flux baubles, and a potion of lignification. Wanderers diff --git a/crawl-ref/docs/options_guide.txt b/crawl-ref/docs/options_guide.txt index d0c1f42cc0..debe155740 100644 --- a/crawl-ref/docs/options_guide.txt +++ b/crawl-ref/docs/options_guide.txt @@ -1327,9 +1327,15 @@ sort_menus = [menu:](true | false | auto:X)[:sort_order] items on the floor. * charged: - Makes wands known or assumed to have some charges left appear - before wands known to be empty; irrelevant for all other item - types. + Makes evokers with available charges appear before those which + are empty; irrelevant for all other item types. + + * usefulness: + Sorts consumables by their current 'usefulness' in the + following order: Emergency (eg: ?blinking, !heal wounds), + Good (eg: ?acquirement), Normal, Dangerous (eg: !lignification), + Bad (eg: ?torment while worshipping a good god), and finally + permanently useless. You can ask for a descending order sort by prefixing one or more sort criteria with > as: @@ -1342,10 +1348,6 @@ sort_menus = [menu:](true | false | auto:X)[:sort_order] (Menu types must be specified as name:, with no space between name and colon.) - By default only pickup menus are sorted, and the sort criteria are: - "equipped, basename, qualname, curse, qty". - All other menus (drop, inv) will be sorted by inventory letter. - The menu selectors available are: pickup: All pickup menus, stash-search menus, etc. for items not @@ -1365,6 +1367,10 @@ sort_menus = [menu:](true | false | auto:X)[:sort_order] the last one matching will always take precedence, i.e. "any" as last setting would override any of the others. + By default pickup menus are sorted, and the sort criteria are: + "equipped, basename, qualname, curse, qty". + Inv menus are sorted by "equipped, charged, usefulness". + spell_slot ^= <regex>:<list of spell letters> (Ordered list option, one value per line) When you memorise any spell that matches the regex, it will assign @@ -1392,15 +1398,23 @@ spell_slot ^= <regex>:<list of spell letters> spell_slot lines): spell_slot += .*:ABCDEFGHIJKLMNOPQRSTUVWXYZ -item_slot ^= <regex>:<inventory letters> +gear_slot ^= <regex>:<inventory letters> (Ordered list option, one value per line) Uses the same interface as spell_slot, except that overwrite mode is on by default; overwrite mode can be disabled with a - in the list of letters. - Additionally, the item_slot option is applied on an item when it is - identified, so it can be moved to the right place even if it was - picked up unidentified. +consumable_shortcut ^= <item name>:<inventory letter> + (Ordered list option, one value per line) + Similar to gear_slot, but accepts only a single letter per consumable + name and does not handle regex. + + The game will try very hard to automatically assign a consumable to + any letter given a mapping by this option, unless it is an identified + item of a different category. (eg: 'potion of curing:c' will result + in no other potion ever being auto-assigned to 'c' and unidentified + scrolls also avoiding it where possible, since they share the ?id menu + together.) ability_slot ^= <regex>:<ability letters> (Ordered list option, one value per line) diff --git a/crawl-ref/source/ability-type.h b/crawl-ref/source/ability-type.h index 0df3439658..252bbd9b7e 100644 --- a/crawl-ref/source/ability-type.h +++ b/crawl-ref/source/ability-type.h @@ -59,7 +59,9 @@ enum ability_type // Death Form ABIL_SIPHON_ESSENCE, // Talismans +#if TAG_MAJOR_VERSION == 34 ABIL_BEGIN_UNTRANSFORM, +#endif ABIL_MUD_BREATH, // Coglins ABIL_INVENT_GIZMO, diff --git a/crawl-ref/source/ability.cc b/crawl-ref/source/ability.cc index 81231ddb77..c0662e2b0d 100644 --- a/crawl-ref/source/ability.cc +++ b/crawl-ref/source/ability.cc @@ -394,8 +394,6 @@ static vector<ability_def> &_get_ability_list() 0, 0, 0, -1, {}, abflag::delay }, { ABIL_END_TRANSFORMATION, "End Transformation", 0, 0, 0, -1, {}, abflag::none }, - { ABIL_BEGIN_UNTRANSFORM, "Begin Untransformation", - 0, 0, 0, -1, {}, abflag::none }, { ABIL_INVENT_GIZMO, "Invent Gizmo", 0, 0, 0, -1, {}, abflag::none }, @@ -1907,11 +1905,11 @@ static bool _check_ability_possible(const ability_def& abil, bool quiet = false) // Check that we can afford to pay the costs. // Note that mutation shenanigans might leave us with negative MP, // so don't fail in that case if there's no MP cost. - if (abil.get_mp_cost() > 0 && !enough_mp(abil.get_mp_cost(), quiet, true)) + if (abil.get_mp_cost() > 0 && !enough_mp(abil.get_mp_cost(), quiet, !quiet)) return false; const int hpcost = abil.get_hp_cost(); - if (hpcost > 0 && !enough_hp(hpcost, quiet)) + if (hpcost > 0 && !enough_hp(hpcost, quiet, !quiet)) return false; switch (abil.ability) @@ -2704,7 +2702,6 @@ unique_ptr<targeter> find_ability_targeter(ability_type ability) #endif case ABIL_EVOKE_TURN_INVISIBLE: case ABIL_END_TRANSFORMATION: - case ABIL_BEGIN_UNTRANSFORM: case ABIL_ZIN_VITALISATION: case ABIL_TSO_DIVINE_SHIELD: case ABIL_YRED_RECALL_UNDEAD_HARVEST: @@ -3351,17 +3348,6 @@ static spret _do_ability(const ability_def& abil, bool fail, dist *target, return_to_default_form(); break; - case ABIL_BEGIN_UNTRANSFORM: - if (transforming_is_unsafe(transformation::none)) - return spret::abort; - if (!i_feel_safe(true) && !yesno("Still begin untransforming?", true, 'n')) - { - canned_msg(MSG_OK); - return spret::abort; - } - start_delay<TransformDelay>(transformation::none, nullptr); - break; - case ABIL_INVENT_GIZMO: if (!coglin_invent_gizmo()) return spret::abort; @@ -4338,9 +4324,6 @@ bool player_has_ability(ability_type abil, bool include_unusable) && (!silenced(you.pos()) || include_unusable); case ABIL_END_TRANSFORMATION: return you.form != you.default_form && !you.transform_uncancellable; - case ABIL_BEGIN_UNTRANSFORM: - return you.form == you.default_form - && you.default_form != transformation::none; // TODO: other god abilities case ABIL_RENOUNCE_RELIGION: return !you_worship(GOD_NO_GOD); @@ -4415,7 +4398,6 @@ vector<talent> your_talents(bool check_confused, bool include_unusable, bool ign ABIL_IMBUE_SERVITOR, ABIL_IMPRINT_WEAPON, ABIL_END_TRANSFORMATION, - ABIL_BEGIN_UNTRANSFORM, ABIL_RENOUNCE_RELIGION, ABIL_CONVERT_TO_BEOGH, ABIL_EVOKE_BLINK, diff --git a/crawl-ref/source/acquire.cc b/crawl-ref/source/acquire.cc index d85413ca27..d90fc65c3c 100644 --- a/crawl-ref/source/acquire.cc +++ b/crawl-ref/source/acquire.cc @@ -1494,7 +1494,7 @@ static void _create_acquirement_item(item_def &item, string items_key, // XXX: This is ugly and only works because there can never be another // gizmo in our inventory, but move_item_to_inv() doesn't actually // return an index or anything else we can use. - for (int i = 0; i < ENDOFPACK; ++i) + for (int i = 0; i < MAX_GEAR; ++i) { if (you.inv[i].base_type == OBJ_GIZMOS) { @@ -1957,7 +1957,7 @@ static void _make_coglin_gizmos() bool coglin_invent_gizmo() { - if (inv_count() >= ENDOFPACK) + if (inv_count(INVENT_GEAR) >= MAX_GEAR) { mpr("You don't have room to hold a gizmo! Drop something first."); return false; diff --git a/crawl-ref/source/adjust.cc b/crawl-ref/source/adjust.cc index 2be422e456..8a76f84e96 100644 --- a/crawl-ref/source/adjust.cc +++ b/crawl-ref/source/adjust.cc @@ -10,6 +10,7 @@ #include "ability.h" #include "libutil.h" #include "invent.h" +#include "item-use.h" #include "items.h" #include "macro.h" #include "message.h" @@ -22,12 +23,19 @@ static void _adjust_ability(); void adjust() { - mprf(MSGCH_PROMPT, "Adjust (i)tems, (s)pells, or (a)bilities? "); + mprf(MSGCH_PROMPT, "Adjust (g)ear, (s)pells, (a)bilities, " + "(p)otions, sc(r)olls or e(v)okables? "); const int keyin = toalower(get_ch()); - if (keyin == 'i') - adjust_item(); + if (keyin == 'g') + adjust_item(OPER_EQUIP); + else if (keyin == 'p') + adjust_item(OPER_QUAFF); + else if (keyin == 'r') + adjust_item(OPER_READ); + else if (keyin == 'v') + adjust_item(OPER_EVOKE); else if (keyin == 's') _adjust_spell(); else if (keyin == 'a') @@ -38,7 +46,7 @@ void adjust() canned_msg(MSG_HUH); } -void adjust_item(int from_slot) +void adjust_item(operation_types oper, item_def* to_adjust) { #ifdef USE_TILE_WEB ui::cutoff_point ui_cutoff_point; @@ -49,29 +57,42 @@ void adjust_item(int from_slot) return; } - if (from_slot == -1) + // If asked to adjust a specific item, make sure we have the right category. + if (to_adjust) { - from_slot = prompt_invent_item("Adjust which item?", - menu_type::invlist, OSEL_ANY); + if (inventory_category_for(*to_adjust) == INVENT_CONSUMABLE) + oper = item_to_oper(to_adjust); + else + oper = OPER_EQUIP; + } + + if (!to_adjust) + { + const int from_slot = prompt_invent_item("Adjust which item?", + menu_type::invlist, default_osel(oper), + oper); if (prompt_failed(from_slot)) return; - mprf_nocap("%s", you.inv[from_slot].name(DESC_INVENTORY_EQUIP).c_str()); + to_adjust = &you.inv[from_slot]; + + mprf_nocap("%s", to_adjust->name(DESC_INVENTORY_EQUIP).c_str()); } const int to_slot = prompt_invent_item("Adjust to which letter? ", menu_type::invlist, - OSEL_ANY, OPER_ANY, + default_osel(oper), oper, invprompt_flag::unthings_ok | invprompt_flag::manual_list); if (to_slot == PROMPT_ABORT - || from_slot == to_slot) + || to_adjust->link == to_slot) { canned_msg(MSG_OK); return; } - swap_inv_slots(from_slot, to_slot, true); + ASSERT(to_adjust); + swap_inv_slots(*to_adjust, to_slot, true); you.wield_change = true; quiver::set_needs_redraw(); } @@ -192,22 +213,63 @@ static void _adjust_ability() swap_ability_slots(index1, letter_to_index(keyin)); } -void swap_inv_slots(int from_slot, int to_slot, bool verbose) +void swap_inv_slots(item_def& to_adjust, int to_slot, bool verbose) { + // Consumable adjustments are easiest. We only need to change letters and + // not move anything in the inventory array. + if (inventory_category_for(to_adjust) == INVENT_CONSUMABLE) + { + // Find if the new letter is used for any current item of the same + // operation type (ie: quaff), so that we can adjust the keybind on that + // item too. + const operation_types oper = item_to_oper(&to_adjust); + item_def* item2 = nullptr; + const int new_letter = index_to_letter(to_slot); + for (int i = MAX_GEAR; i < ENDOFPACK; ++i) + { + if (!you.inv[i].defined() || item_to_oper(&you.inv[i]) != oper) + continue; + + if (you.inv[i].slot == new_letter) + { + item2 = &you.inv[i]; + break; + } + } + + if (item2) + item2->slot = to_adjust.slot; + to_adjust.slot = index_to_letter(to_slot); + + if (verbose) + { + mprf_nocap("%s", to_adjust.name(DESC_INVENTORY_EQUIP).c_str()); + if (item2) + mprf_nocap("%s", item2->name(DESC_INVENTORY_EQUIP).c_str()); + } + + return; + } + + // Gear changes require moving items in the inventory array, which can + // invalidate many references that will need updating. + int new_quiver = -1; - if (you.quiver_action.item_is_quivered(from_slot)) + if (you.quiver_action.item_is_quivered(to_adjust)) new_quiver = to_slot; else if (you.quiver_action.item_is_quivered(to_slot)) - new_quiver = from_slot; + new_quiver = to_adjust.link; // Swap items. + const int from_slot = to_adjust.link; + item_def tmp = you.inv[to_slot]; you.inv[to_slot] = you.inv[from_slot]; you.inv[from_slot] = tmp; // Slot switching. tmp.slot = you.inv[to_slot].slot; - you.inv[to_slot].slot = index_to_letter(to_slot);//you.inv[from_slot].slot is 0 when 'from_slot' contains no item. + you.inv[to_slot].slot = index_to_letter(to_slot); //you.inv[from_slot].slot is 0 when 'from_slot' contains no item. you.inv[from_slot].slot = tmp.slot; you.inv[from_slot].link = from_slot; @@ -265,4 +327,7 @@ void swap_inv_slots(int from_slot, int to_slot, bool verbose) } if (you.last_unequip == from_slot) you.last_unequip = to_slot; + + if (you.cur_talisman == from_slot) + you.cur_talisman = to_slot; } diff --git a/crawl-ref/source/adjust.h b/crawl-ref/source/adjust.h index 85ef6986c1..90df87bdf6 100644 --- a/crawl-ref/source/adjust.h +++ b/crawl-ref/source/adjust.h @@ -5,6 +5,10 @@ #pragma once +#include "operation-types.h" + +struct item_def; + void adjust(); -void adjust_item(int from_slot = -1); -void swap_inv_slots(int slot1, int slot2, bool verbose); +void adjust_item(operation_types oper = OPER_ANY, item_def* to_adjust = nullptr); +void swap_inv_slots(item_def& to_adjust, int new_letter, bool verbose); diff --git a/crawl-ref/source/command.cc b/crawl-ref/source/command.cc index bc5cf64cc1..eed717b1a2 100644 --- a/crawl-ref/source/command.cc +++ b/crawl-ref/source/command.cc @@ -951,7 +951,7 @@ static void _add_formatted_keyhelp(column_composer &cols) _add_insert_commands(cols, 0, "<red>\"</red> : amulets (<w>%</w>ut on and <w>%</w>emove)", { CMD_WEAR_JEWELLERY, CMD_REMOVE_JEWELLERY }); _add_insert_commands(cols, 0, "<lightred>percent</lightred> : talismans (e<w>%</w>oke)", - { CMD_EVOKE }); + { CMD_WEAR_JEWELLERY, CMD_REMOVE_JEWELLERY }); _add_insert_commands(cols, 0, "<lightgrey>/</lightgrey> : wands (e<w>%</w>oke)", { CMD_EVOKE }); diff --git a/crawl-ref/source/dat/defaults/consumable_shortcuts.txt b/crawl-ref/source/dat/defaults/consumable_shortcuts.txt new file mode 100644 index 0000000000..ad186388bd --- /dev/null +++ b/crawl-ref/source/dat/defaults/consumable_shortcuts.txt @@ -0,0 +1,49 @@ +consumable_shortcut ^= scroll of identify:i +consumable_shortcut ^= scroll of teleportation:t +consumable_shortcut ^= scroll of fear:f +consumable_shortcut ^= scroll of noise:N +consumable_shortcut ^= scroll of summoning:s +consumable_shortcut ^= scroll of enchant weapon:w +consumable_shortcut ^= scroll of enchant armour:a +consumable_shortcut ^= scroll of torment:T +consumable_shortcut ^= scroll of immolation:I +consumable_shortcut ^= scroll of blinking:b +consumable_shortcut ^= scroll of revelation:r +consumable_shortcut ^= scroll of fog:g +consumable_shortcut ^= scroll of acquirement:A +consumable_shortcut ^= scroll of brand weapon:W +consumable_shortcut ^= scroll of vulnerability:V +consumable_shortcut ^= scroll of silence:S +consumable_shortcut ^= scroll of amnesia:x +consumable_shortcut ^= scroll of poison:p +consumable_shortcut ^= scroll of butterflies:s + +consumable_shortcut ^= potion of curing:c +consumable_shortcut ^= potion of heal wounds:w +consumable_shortcut ^= potion of haste:h +consumable_shortcut ^= potion of might:m +consumable_shortcut ^= potion of brilliance:b +consumable_shortcut ^= potion of attraction:A +consumable_shortcut ^= potion of enlightenment:e +consumable_shortcut ^= potion of cancellation:C +consumable_shortcut ^= potion of ambrosia:a +consumable_shortcut ^= potion of invisibility:i +consumable_shortcut ^= potion of experience:E +consumable_shortcut ^= potion of magic:m +consumable_shortcut ^= potion of berserk rage:B +consumable_shortcut ^= potion of mutation:M +consumable_shortcut ^= potion of resistance:r +consumable_shortcut ^= potion of lignification:L + +consumable_shortcut ^= wand of flame:a +consumable_shortcut ^= wand of acid:b +consumable_shortcut ^= wand of quicksilver:b +consumable_shortcut ^= wand of light:b +consumable_shortcut ^= wand of roots:c +consumable_shortcut ^= wand of warping:c +consumable_shortcut ^= wand of iceblast:c +consumable_shortcut ^= wand of mindburst:f +consumable_shortcut ^= wand of digging:d +consumable_shortcut ^= wand of charming:e +consumable_shortcut ^= wand of paralysis:e +consumable_shortcut ^= wand of polymorph:p diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt index 56cc3a6cd8..0b7c64e760 100644 --- a/crawl-ref/source/dat/descript/items.txt +++ b/crawl-ref/source/dat/descript/items.txt @@ -87,7 +87,7 @@ A jagged cluster of blades, almost impossible to grasp without injury. {{ local hands = you.hand() .. "s" return "Causes long, needle-thin blades to grow from the " .. - "user's " .. hands + "wearer's " .. hands }}, and smaller fragments of metal to grow inside their body, deforming them and reducing the effectiveness of body armour. Shapeshifting skill mitigates and eventually eliminates the latter effect, as well as increasing damage @@ -588,14 +588,14 @@ A fearsome weapon with a forked, razor-sharp blade. dragon-coil talisman An intricate carving, inlaid with dragon tooth and scale. {{ - local desc = "Transforms the user into a mighty" + local desc = "Transforms the wearer into a mighty" if you.race():find("Draconian") then - desc = desc .. " dragon. The user retains their innate colour, " .. + desc = desc .. " dragon. The wearer retains their innate colour, " .. "becomes resistant to poison, and their breath weapon's " .. "power and recharge rate are greatly increased." else - desc = desc .. " golden dragon. The user becomes resistant to fire, " .. + desc = desc .. " golden dragon. The wearer becomes resistant to fire, " .. "cold, and poison, and gains a powerful breath attack " .. "that inflicts all three types of damage at once, but " .. "only recharges as you gain XP." @@ -676,7 +676,7 @@ spreading it to enemies, you will return to your previous form. %%%% fortress talisman -A miniature battlement, carved from a piece of shell. Transforms the user into a +A miniature battlement, carved from a piece of shell. Transforms the wearer into a heavily armoured crab, fusing whatever body armour they are wearing into the shell in the process. In this form, they are slow-moving, but well-defended and even capable of wielding a weapon in their large main claw. They can also @@ -732,7 +732,7 @@ A pile of glittering gold coins. granite talisman A heavy stone icon, bearing the countenance of some long-forgotten king or god. -Transforms the user into a slow, stone statue. The user's stone body is +Transforms the wearer into a slow, stone statue. The wearer's stone body is immune to poison and miasma, and gains resistance to electricity, negative energy, and torment. Shapeshifting skill increases armour granted. %%%% @@ -799,8 +799,8 @@ A piece of metal headgear. hive talisman A preserved and decorated hive, still dripping with ambrosial nectar. Transforms -the user into a living beehive, filled with the buzz of countless insects -labouring inside them. The nectar produced within greatly increases the user's +the wearer into a living beehive, filled with the buzz of countless insects +labouring inside them. The nectar produced within greatly increases the wearer's health and magic regeneration and if they become seriously injured, angry bees will swarm out to defend their hive. %%%% @@ -822,7 +822,7 @@ while rendering its wearer more susceptible to fire. %%%% inkwell talisman -A small bottle filled with mystical ink. Transforms the user into a walking +A small bottle filled with mystical ink. Transforms the wearer into a walking scroll whose body is tattooed with the knowledge of a hundred mages. Being an omnibus of magical techniques gives them increased skill with all spell schools, which improves with Shapeshifting skill, but the form's ability to channel such @@ -901,7 +901,7 @@ A long, strong bow made of yew. %%%% lupine talisman -A painted eyepatch made from a scrap of wolf pelt. Transforms the user into a +A painted eyepatch made from a scrap of wolf pelt. Transforms the wearer into a vicious werewolf, muscles surging with predatory instinct. Killing enemies in this form will give a stacking bonus to your damage and accuracy, and slaying enough of them in a row will cause you to unleash a vicious howl that makes @@ -925,16 +925,16 @@ hated rivals, a patient reader can discover spells of electrifying power. maw talisman A miniature, desiccated head of some ferocious and hopefully extinct creature. -Transforms the user's midsection into a giant mouth, gnashing and ready to devour -foes. The mouth may devour slain creatures, healing the user to an extent increased -by the user's Shapeshifting skill and the power of the creature eaten. Skill also +Transforms the wearer's midsection into a giant mouth, gnashing and ready to devour +foes. The mouth may devour slain creatures, healing the wearer to an extent increased +by the wearer's Shapeshifting skill and the power of the creature eaten. Skill also increases the damage done by the maw. %%%% medusa talisman A fossilised jellyfish polyp, inscribed with sigils. Causes a mane of long -stinging tendrils to sprout from the user's head which lash out at nearby -enemies whenever the user attacks, poisoning them. When they feel their host's +stinging tendrils to sprout from the wearer's head which lash out at nearby +enemies whenever the wearer attacks, poisoning them. When they feel their host's life is in danger, they can even turn these poisoned foes to stone. %%%% midnight gem @@ -1143,8 +1143,8 @@ An ever-changing fragment of something primordial; its substance seems to undulate between flesh and bone and perhaps even metal. A sufficiently skilled shapeshifter can stabilise it into a useable - if unpredictable - form. -(If your Shapeshifting skill is at least 6, you can evoke this to transform it -into a random one of: Rimehorn, Scarab, Medusa, or Maw talismans.) +(If your Shapeshifting skill is at least 6, attempting to put this one will +transform it into a random one of: Rimehorn, Scarab, Medusa, or Maw talismans.) %%%% quad damage @@ -1171,7 +1171,7 @@ for every blow its wielder makes. quill talisman A spiny trinket reminiscent of a cactus. Causes sharp quills to grow all over -the user's body which may cause injury to anyone unwise enough to attack them +the wearer's body which may cause injury to anyone unwise enough to attack them in melee. %%%% rapier @@ -1180,7 +1180,7 @@ A slender, sharply pointed sword, with an uncommonly elegant design. %%%% riddle talisman -An intricate puzzlebox containing an unknowable prize. Transforms the user into +An intricate puzzlebox containing an unknowable prize. Transforms the wearer into a riddle-loving sphinx. In this form, they are {{ if you.race() == "Felid" then return "normally capable of wearing a cloak and barding (though your" .. @@ -1200,10 +1200,10 @@ matter how unwise this may be. rimehorn talisman A crude ornament carved from the horn of a rare arctic beast - so cold to the -touch that ice still clings to it. Transforms the user into a rime yak, a hardy +touch that ice still clings to it. Transforms the wearer into a rime yak, a hardy ungulate that is highly resistant to cold and whose breath is so frigid that it freezes the walls around itself as it fights. Being so attuned to arctic -temperatures also makes it easier for the user to cast Ice magic. +temperatures also makes it easier for the wearer to cast Ice magic. %%%% ring mail @@ -1311,7 +1311,7 @@ a favoured weapon of the Shining One's servants. sanguine talisman A vial of roiling blood that pulses with the beat of an unseen heart. Transforms -the user into a fearsome vampire - a creature that straddles the border between +the wearer into a fearsome vampire - a creature that straddles the border between life and undeath. They can drink the lifeblood of the living to heal themselves, and even turn those they slay stealthily into vampiric thralls, but do not heal in the presence of monsters. At great effort, they may scatter into a swarm of @@ -1334,13 +1334,13 @@ movement. %%%% scarab talisman -A small golden cameo of a beetle. Transforms the user into a sun scarab, a +A small golden cameo of a beetle. Transforms the wearer into a sun scarab, a fiery insect that carries around a mote of searing heat and light outside itself, like a tiny sun. This solar ember burns adjacent enemies whenever the scarab attacks, and can be healed by swapping with it. In addition, the scarab's own mandibles can reduce -enemies' fire resistance and Fire spells are easier for the user to cast. +enemies' fire resistance and Fire spells are easier for the wearer to cast. %%%% scarf @@ -1481,7 +1481,7 @@ it's quite similar to a halberd. %%%% serpent talisman -A jade snake coiled around a fossilised egg. Transforms the user into an +A jade snake coiled around a fossilised egg. Transforms the wearer into an amphisbaena - a legendary two-headed serpent. It is capable of wearing two pieces of headgear at once and its powerful coils can wind around foes and crush them to death, but its cold blood leaves it succeptible to being slowed by cold @@ -1536,7 +1536,7 @@ fastened on one end. spider talisman A strange charm made from shed arachnid exoskeletons bound together with silk. -Transforms the user into an agile jumping spider who can move swiftly towards +Transforms the wearer into an agile jumping spider who can move swiftly towards foes and inflict grievous damage on any it catches unaware. Its attacks can also ensnare its enemies in webs and it can leap briskly away from many dangers. %%%% @@ -1616,9 +1616,9 @@ scale armours, and gives its wearer resistance to electrical discharges. %%%% storm talisman -Lightning trapped, impossibly, in a bottle. Lets the user walk through the air -as a raging, lightning-filled tempest. The user's melee attacks are electrified -and strike all adjacent foes. The user also flies, gains immunity to poison, +Lightning trapped, impossibly, in a bottle. Lets the wearer walk through the air +as a raging, lightning-filled tempest. The wearer's melee attacks are electrified +and strike all adjacent foes. The wearer also flies, gains immunity to poison, miasma, petrification, constriction, and sticky flame, and also resists electricity. They can launch themselves as a lightning bolt, blasting through everything in their way. @@ -1630,14 +1630,14 @@ The scales of a swamp dragon. It confers resistance to poison on its wearer. talisman of death A grey-black vessel, infused with dark power through a sickening ritual. -Transforms the user into an undying offence against life itself. +Transforms the wearer into an undying offence against life itself. -Foes struck by user's melee weapons or hands are weakened, slowed, and drained. -The user can also heal themself by tormenting living foes nearby; Shapeshifting -skill increases the amount healed. Further, the user resists cold, has enhanced +Foes struck by wearer's melee weapons or hands are weakened, slowed, and drained. +The wearer can also heal themself by tormenting living foes nearby; Shapeshifting +skill increases the amount healed. Further, the wearer resists cold, has enhanced willpower, and is immune to poison, miasma, negative energy, and torment. -The user also gains some of the more dubious benefits of having an undead body. +The wearer also gains some of the more dubious benefits of having an undead body. They are vulnerable to holy damage and Dispel Undead, and cannot consume potions. %%%% there-and-back book @@ -1787,7 +1787,7 @@ A military axe with a long haft and a single-bladed head. wellspring talisman A small amphora from which pours a seemingly unending quantity of water. -Transforms the user's flesh into elemental water, allowing them to move flexibly +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. diff --git a/crawl-ref/source/dbg-asrt.cc b/crawl-ref/source/dbg-asrt.cc index 47d77fc973..ea4d9b829f 100644 --- a/crawl-ref/source/dbg-asrt.cc +++ b/crawl-ref/source/dbg-asrt.cc @@ -359,7 +359,7 @@ static void _dump_player(FILE *file) for (player_equip_entry& entry : you.equipment.items) { fprintf(file, " eq slot #%d, inv slot #%d", entry.slot, entry.item); - if (entry.item < 0 || entry.item >= ENDOFPACK) + if (entry.item < 0 || entry.item >= MAX_GEAR) { fprintf(file, " <invalid>\n"); continue; diff --git a/crawl-ref/source/defines.h b/crawl-ref/source/defines.h index 68d15561f3..9945934dc2 100644 --- a/crawl-ref/source/defines.h +++ b/crawl-ref/source/defines.h @@ -37,8 +37,9 @@ #endif #endif -// max size of inventory array {dlb}: -#define ENDOFPACK 52 +#define ENDOFPACK 127 // Max size of player inventory array +constexpr int MAX_GEAR = 52; // Max number of slots of gear inventory + // (and start of consumable inventory). // Max ghosts in a bones file. const int MAX_GHOSTS = 127; diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 2e6327e3f0..88fffed13a 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -2506,10 +2506,8 @@ static string _describe_lignify_ac() // Turn into a tree, check our resulting AC, and then turn back without // anyone being the wiser. unwind_var<player_equip_set> unwind_eq(you.equipment); - unwind_var<item_def> unwind_talisman(you.active_talisman); - unwind_var<transformation> unwind_form(you.form); - you.active_talisman.clear(); - you.form = transformation::tree; + unwind_var<int8_t> unwind_talisman(you.cur_talisman, -1); + unwind_var<transformation> unwind_form(you.form, transformation::tree); you.equipment.unmeld_all_equipment(true); you.equipment.meld_equipment(tree_form->blocked_slots, true); @@ -4010,7 +4008,8 @@ static bool _do_action(item_def &item, const command_type action) return true; drop_item(slot, item.quantity); break; - case CMD_ADJUST_INVENTORY: adjust_item(slot); break; + case CMD_ADJUST_INVENTORY: adjust_item(OPER_ANY, &you.inv[slot]); + break; case CMD_EVOKE: if (!check_warning_inscriptions(you.inv[slot], OPER_EVOKE)) return true; diff --git a/crawl-ref/source/evoke.cc b/crawl-ref/source/evoke.cc index 6d0bd35aa6..6d2bf4e4ea 100644 --- a/crawl-ref/source/evoke.cc +++ b/crawl-ref/source/evoke.cc @@ -163,12 +163,6 @@ int wand_power(spell_type wand_spell) void zap_wand(int slot, dist *_target) { - if (inv_count() < 1) - { - canned_msg(MSG_NOTHING_CARRIED); // why is this handled here?? - return; - } - if (!item_currently_evokable(slot == -1 ? nullptr : &you.inv[slot])) return; @@ -978,48 +972,6 @@ static bool _gravitambourine(dist *target) return true; } -static transformation _form_for_talisman(const item_def &talisman) -{ - if (you.using_talisman(talisman)) - return transformation::none; - return form_for_talisman(talisman); -} - -static bool _evoke_talisman(item_def &talisman) -{ - if (talisman.sub_type == TALISMAN_PROTEAN) - { - const talisman_type new_type = random_choose(TALISMAN_RIMEHORN, - TALISMAN_SCARAB, - TALISMAN_MEDUSA, - TALISMAN_MAW); - - mprf("%s responds to your shapeshifting skill and transforms into a %s!", - talisman.name(DESC_YOUR).c_str(), talisman_type_name(new_type).c_str()); - - talisman.sub_type = new_type; - return true; - } - - const transformation trans = _form_for_talisman(talisman); - if (!check_transform_into(trans, false, &talisman)) - return false; - if (transforming_is_unsafe(trans)) - return false; - if (!i_feel_safe(true) && !yesno("Still begin transforming?", true, 'n')) - { - canned_msg(MSG_OK); - return false; - } - - count_action(CACT_FORM, (int)trans); - start_delay<TransformDelay>(trans, &talisman); - if (god_despises_item(talisman, you.religion)) - excommunication(); - you.turn_is_over = true; - return true; -} - /// Does the item only serve to produce summons or allies? static bool _evoke_ally_only(const item_def &item, bool ident) { @@ -1063,35 +1015,6 @@ string cannot_evoke_item_reason(const item_def *item, bool temp, bool ident) return ""; } - if (item->base_type == OBJ_TALISMANS) - { - if (item->sub_type == TALISMAN_PROTEAN) - { - if (temp && you.skill(SK_SHAPESHIFTING) < 6) - { - return "you lack the shapeshifting skill to coax this " - "talisman into a stable form."; - } - else if (species_apt(SK_SHAPESHIFTING) == UNUSABLE_SKILL) - return "you can never gain the skill to use this talisman."; - else - return ""; - } - - const transformation trans = _form_for_talisman(*item); - const string form_unreason = cant_transform_reason(trans, false, temp); - if (!form_unreason.empty()) - return lowercase_first(form_unreason); - - if (you.form != you.default_form && temp) - return "you need to leave your temporary form first."; - - if (trans == transformation::hive && you_worship(GOD_OKAWARU)) - return "you have forsworn all allies in Okawaru's name."; - - return ""; - } - if (item->is_type(OBJ_BAUBLES, BAUBLE_FLUX)) { if (you.form == transformation::flux && temp) @@ -1174,9 +1097,6 @@ bool evoke_item(item_def& item, dist *preselect) zap_wand(item.link, preselect); return true; - case OBJ_TALISMANS: - return _evoke_talisman(item); - case OBJ_BAUBLES: mprf("You crush the flux bauble in your %s and feel its energy " "flooding your body.", you.hand_name(false).c_str()); diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc index 3b87f02d8e..34d011bb47 100644 --- a/crawl-ref/source/files.cc +++ b/crawl-ref/source/files.cc @@ -2059,6 +2059,11 @@ static void _fixup_transmuters() move_item_to_grid(&obj, you.pos(), true); del_spell_from_memory(p.first); } + if (you.props.exists("consolation_talisman")) + { + copy_item_to_grid(you.props["consolation_talisman"].get_item(), you.pos()); + you.props.erase("consolation_talisman"); + } } #endif diff --git a/crawl-ref/source/initfile.cc b/crawl-ref/source/initfile.cc index 1dd920756d..1eb04127bf 100644 --- a/crawl-ref/source/initfile.cc +++ b/crawl-ref/source/initfile.cc @@ -130,6 +130,7 @@ static bool _force_allow_explore(); static species_type _str_to_species(const string &str); static sound_mapping _interrupt_sound_mapping(const string &s); static pair<text_pattern,string> _slot_mapping(const string &s); +static pair<string, char> _consumable_mapping(const string &s); #ifdef USE_TILE static tag_pref _str_to_tag_pref(const string &opt) @@ -709,8 +710,10 @@ const vector<GameOption*> game_options::build_options_list() {"message_colour", "message_color"}, {}, true), new ListGameOption<colour_mapping>(menu_colour_mappings, {"menu_colour", "menu_color"}, {}, true), - new ListGameOption<pair<text_pattern,string>, OPTFUN(_slot_mapping)>(auto_item_letters, - {"item_slot"}, {}, true), + new ListGameOption<pair<text_pattern,string>, OPTFUN(_slot_mapping)>(auto_gear_letters, + {"gear_slot"}, {}, true), + new ListGameOption<pair<string, char>, OPTFUN(_consumable_mapping)>(auto_consumable_letters, + {"consumable_shortcut"}, {}, true, {[this]() { update_consumable_shortcuts(); }}), new ListGameOption<pair<text_pattern,string>, OPTFUN(_slot_mapping)>(auto_spell_letters, {"spell_slot"}, {}, true), new ListGameOption<pair<text_pattern,string>, OPTFUN(_slot_mapping)>(auto_ability_letters, @@ -2213,6 +2216,7 @@ static const char* config_defaults[] = "defaults/glyph_colours.txt", "defaults/messages.txt", "defaults/misc.txt", + "defaults/consumable_shortcuts.txt", }; void base_game_options::reset_loaded_state() @@ -3090,6 +3094,29 @@ void game_options::update_travel_terrain() } } +void game_options::update_consumable_shortcuts() +{ + for (const auto& entry : auto_consumable_letters) + { + item_kind kind = item_kind_by_name(entry.first); + if (kind.base_type == OBJ_UNASSIGNED) + { + report_error("Unknown consumable type: %s\n", entry.first.c_str()); + continue; + } + else + string str = string(1, entry.second); + + if (kind.base_type == OBJ_POTIONS) + potion_shortcuts[kind.sub_type] = entry.second; + else if (kind.base_type == OBJ_SCROLLS) + scroll_shortcuts[kind.sub_type] = entry.second; + else if (kind.base_type == OBJ_WANDS) + evokable_shortcuts[kind.sub_type] = entry.second; + else if (kind.base_type == OBJ_MISCELLANY) + evokable_shortcuts[kind.sub_type] = entry.second + NUM_WANDS; + } +} void game_options::update_use_animations() { @@ -3367,6 +3394,18 @@ static pair<text_pattern,string> _slot_mapping(const string &s) return make_pair(text_pattern(thesplit[0], true), thesplit[1]); } +static pair<string, char> _consumable_mapping(const string &s) +{ + vector<string> thesplit = split_string(":", s, true, false, 1); + if (thesplit.size() != 2) + { + mprf(MSGCH_ERROR, "Error parsing consumable mapping: '%s'\n", + s.c_str()); + return make_pair("", '-'); // pattern is marked as invalid + } + return make_pair(thesplit[0], thesplit[1][0]); +} + // Option syntax is: // sort_menu = [menu_type:]yes|no|auto:n[:sort_conditions] void game_options::set_menu_sort(const string &field) @@ -3378,7 +3417,7 @@ void game_options::set_menu_sort(const string &field) { sort_menus.clear(); set_menu_sort("pickup: true"); - set_menu_sort("inv: true : equipped, charged"); + set_menu_sort("inv: true : equipped, charged, identified, usefulness, slot"); return; } diff --git a/crawl-ref/source/invent.cc b/crawl-ref/source/invent.cc index 00ea7137a6..aa455871a4 100644 --- a/crawl-ref/source/invent.cc +++ b/crawl-ref/source/invent.cc @@ -97,7 +97,7 @@ InvEntry::InvEntry(const item_def &i) } if (i.base_type != OBJ_GOLD && in_inventory(i)) - add_hotkey(index_to_letter(i.link)); + add_hotkey(i.slot); else add_hotkey(' '); // dummy hotkey @@ -345,7 +345,7 @@ void InvMenu::set_preselect(const vector<SelItem> *pre) string slot_description() { - return make_stringf("%d/%d slots", inv_count(), ENDOFPACK); + return make_stringf("%d/%d gear slots", inv_count(INVENT_GEAR), MAX_GEAR); } void InvMenu::set_title(const string &s) @@ -385,6 +385,59 @@ int InvMenu::pre_process(int key) return key; } +bool InvMenu::process_key(int key) +{ + // Allow tab to move between item categories (since using item category + // hotkeys in the drop menu doesn't really work for this purpose as it will + // select many things at once instead). + if (key == CK_RIGHT || key == CK_LEFT) + { + // Find the first category below our current cursor position. + int start = last_hovered >= 0 ? last_hovered : 0; + int target = -1; + if (key == CK_RIGHT) + { + for (size_t i = start; i < items.size(); ++i) + { + if (items[i]->level == MEL_SUBTITLE) + { + target = i+1; + break; + } + } + } + // Find the first category above our current cursor position. + else if (key == CK_LEFT) + { + for (int i = start - 2; i >= 0; --i) + { + if (items[i]->level == MEL_SUBTITLE) + { + target = i+1; + break; + } + } + } + + // Stop if we didn't find any. + if (target < 0) + return true; + + // Otherwise, hover the first item of this category and try to display + // the entire category on screen (or as much as we can, anyway.) + auto snap_range = hotkey_range(items[target]->hotkeys.back()); + snap_in_page(snap_range.second); + set_hovered(snap_range.first); +#ifdef USE_TILE_WEB + webtiles_update_scroll_pos(true); +#endif + + return true; + } + + return Menu::process_key(key); +} + static bool _item_is_permadrop_candidate(const item_def &item) { // Known, non-artefact items of the types you see on the '\' menu proper. @@ -440,8 +493,7 @@ bool InvMenu::examine_index(int i) { // default behavior: examine inv item. You must override or use on_examine // if your items come from somewhere else, or this will cause crashes! - unsigned char select = ie->hotkeys[0]; - const int invidx = letter_to_index(select); + const int invidx = ie->item->link; ASSERT(you.inv[invidx].defined()); return describe_item(you.inv[invidx], nullptr, do_actions); } @@ -511,6 +563,8 @@ string no_selectables_message(int item_selector) return "You aren't carrying any pieces of jewellery."; case OSEL_AMULET: return "You aren't carrying any amulets."; + case OSEL_JEWELLERY_OR_TALISMAN: + return "You aren't carrying any jewllery or talismans."; case OSEL_LAUNCHING: return "You aren't carrying any items that might be thrown or fired."; case OSEL_EVOKABLE: @@ -521,8 +575,8 @@ string no_selectables_message(int item_selector) return "None of your equipped items are c... [truncated message content] |
From: <gi...@cr...> - 2025-07-17 16:40:18
|
via 370964d662a6fa7baa8f4b61e186df7dfab324b8 (commit) via 6246d46c736a6b6a564b215a93baa548969fd04e (commit) from 61dfde65f731c8c12635c7b49e8999e3d85ca5b1 (commit) ----------------------------------------------------------------------- commit 370964d662a6fa7baa8f4b61e186df7dfab324b8 Author: regret-index <clo...@ho...> Date: Thu Jul 17 14:08:45 2025 -0230 New tiles for old, new, and future armour egos Sources: * Body armour of Resonance: A CC0 set of weapon icons by Shade. * Body armour of Command: Ontoclasm's scroll of summoning and enchant armour icons. * Body armour of Death: Ontoclasm's draining / torment icon. * Hat of Sniping: Ontoclasm's old CTele icon. * Helmet (and orb) of Light: An edit of Ontoclasm's invisibility icon by Darby. * Gloves of parrying: Ontoclasm's reflection icon and old protection icon. * Amulet of Alchemy: Ontoclasm's old preservation icon. * Amulet of Dissipation: Ontoclasm's old Rod of Inaccuracy icon. * Amulet of Wildshape: Sastreii's unused Wand of Rending icon. * Orb of Glass: Ontoclasm's old rod of scattershot icon. * Orb of Power: Ontoclasm's old wand of magic dart icon and current Sword of Power tile. * Orb of Storms: Ontoclasm's fog and electrocution icons. (Armour of Archery, the elemental-enhancer aux armour set, and the Orb of Conjuring all keep their prior tiles.) commit 6246d46c736a6b6a564b215a93baa548969fd04e Author: regret-index <clo...@ho...> Date: Thu Jul 17 13:16:00 2025 -0230 Rename armour of preservation and staves of death * Cloaks of preservation are now named cloaks of corrosion resistance. The linking of preservation to corrosion resistance in 8388af8 was always a strange piece of misdirection (as the old preservation effect never prevented old permanent corrosion) notably splitting apart the effect between rings versus cloaks & shields, and the potion icon doesn't really reflect what opposing corrosion is themed after in Crawl. Their icon is now just ontoclasm's old amulet / current ring resistance icon. * Staves of death are now named staves of necromancy. The new Armour of Death ego added in prior commits has significant mechanical differences from the staff (+NecroWiz, HP-costing non-Necro spells, no rN). Also pertinently, the majority of school-enhancer staves match up with their spell school names (with the other exception being the whole "resistable-cold-versus-partially-resistable-ice space". Their icon is otherwise the same as prior. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/artefact.cc | 12 ++-- crawl-ref/source/dat/des/branches/abyss.des | 2 +- crawl-ref/source/dat/des/branches/crypt.des | 4 +- crawl-ref/source/dat/des/branches/hell.des | 2 +- crawl-ref/source/dat/des/branches/lair.des | 2 +- crawl-ref/source/dat/des/branches/pan.des | 2 +- crawl-ref/source/dat/des/branches/swamp.des | 4 +- crawl-ref/source/dat/des/builder/alphashops.des | 4 +- crawl-ref/source/dat/des/builder/shops.des | 6 +- crawl-ref/source/dat/des/portals/icecave.des | 6 +- crawl-ref/source/dat/des/portals/necropolis.des | 2 +- crawl-ref/source/dat/des/portals/wizlab.des | 4 +- crawl-ref/source/dat/des/sprint/arena_sprint.des | 2 +- crawl-ref/source/dat/des/variable/float.des | 2 +- crawl-ref/source/dat/descript/da/items.txt | 2 +- crawl-ref/source/dat/descript/de/quotes.txt | 2 +- crawl-ref/source/dat/descript/items.txt | 2 +- crawl-ref/source/dat/descript/quotes.txt | 2 +- crawl-ref/source/dat/descript/zh/items.txt | 2 +- crawl-ref/source/describe.cc | 6 +- crawl-ref/source/ghost.cc | 2 +- crawl-ref/source/god-item.cc | 2 +- crawl-ref/source/item-name.cc | 4 +- crawl-ref/source/item-prop-enum.h | 9 ++- crawl-ref/source/item-prop.cc | 68 ++++++++++----------- crawl-ref/source/makeitem.cc | 2 +- crawl-ref/source/mapdef.cc | 2 +- crawl-ref/source/melee-attack.cc | 4 +- crawl-ref/source/monster.cc | 4 +- crawl-ref/source/player.cc | 6 +- crawl-ref/source/rltiles/dc-item.txt | 4 +- crawl-ref/source/rltiles/item/amulet/i-alchemy.png | Bin 167 -> 5950 bytes .../source/rltiles/item/amulet/i-dissipation.png | Bin 275 -> 871 bytes .../source/rltiles/item/amulet/i-wildshape.png | Bin 177 -> 903 bytes .../rltiles/item/armour/brands/i-command.png | Bin 193 -> 802 bytes .../brands/i-corrosion-res.png} | Bin .../source/rltiles/item/armour/brands/i-death.png | Bin 176 -> 12513 bytes .../source/rltiles/item/armour/brands/i-glass.png | Bin 278 -> 825 bytes .../source/rltiles/item/armour/brands/i-light.png | Bin 2454 -> 6005 bytes .../rltiles/item/armour/brands/i-parrying.png | Bin 319 -> 807 bytes .../source/rltiles/item/armour/brands/i-power.png | Bin 0 -> 867 bytes .../rltiles/item/armour/brands/i-preservation.png | Bin 253 -> 0 bytes .../rltiles/item/armour/brands/i-resonance.png | Bin 316 -> 6180 bytes .../rltiles/item/armour/brands/i-sniping.png | Bin 344 -> 769 bytes .../source/rltiles/item/armour/brands/i-storms.png | Bin 0 -> 790 bytes .../{i-staff_death.png => i-staff_necromancy.png} | Bin crawl-ref/source/shopping.cc | 2 +- 47 files changed, 92 insertions(+), 87 deletions(-) copy crawl-ref/source/rltiles/item/{ring/i-r-corrosion.png => armour/brands/i-corrosion-res.png} (100%) create mode 100644 crawl-ref/source/rltiles/item/armour/brands/i-power.png delete mode 100644 crawl-ref/source/rltiles/item/armour/brands/i-preservation.png create mode 100644 crawl-ref/source/rltiles/item/armour/brands/i-storms.png rename crawl-ref/source/rltiles/item/staff/{i-staff_death.png => i-staff_necromancy.png} (100%) diff --git a/crawl-ref/source/artefact.cc b/crawl-ref/source/artefact.cc index 4fce0607e2..0068928434 100644 --- a/crawl-ref/source/artefact.cc +++ b/crawl-ref/source/artefact.cc @@ -336,11 +336,11 @@ static void _populate_armour_intrinsic_artps(const armour_type arm, } static map<stave_type, artefact_prop_type> staff_resist_artps = { - { STAFF_FIRE, ARTP_FIRE }, - { STAFF_COLD, ARTP_COLD }, - { STAFF_ALCHEMY, ARTP_POISON }, - { STAFF_DEATH, ARTP_NEGATIVE_ENERGY }, - { STAFF_AIR, ARTP_ELECTRICITY }, + { STAFF_FIRE, ARTP_FIRE }, + { STAFF_COLD, ARTP_COLD }, + { STAFF_ALCHEMY, ARTP_POISON }, + { STAFF_NECROMANCY, ARTP_NEGATIVE_ENERGY }, + { STAFF_AIR, ARTP_ELECTRICITY }, // nothing for conj or earth }; @@ -348,7 +348,7 @@ static map<stave_type, artefact_prop_type> staff_enhancer_artps = { { STAFF_FIRE, ARTP_ENHANCE_FIRE }, { STAFF_COLD, ARTP_ENHANCE_ICE }, { STAFF_ALCHEMY, ARTP_ENHANCE_ALCHEMY }, - { STAFF_DEATH, ARTP_ENHANCE_NECRO }, + { STAFF_NECROMANCY, ARTP_ENHANCE_NECRO }, { STAFF_AIR, ARTP_ENHANCE_AIR }, { STAFF_CONJURATION, ARTP_ENHANCE_CONJ }, { STAFF_EARTH, ARTP_ENHANCE_EARTH }, diff --git a/crawl-ref/source/dat/des/branches/abyss.des b/crawl-ref/source/dat/des/branches/abyss.des index eb82a0477f..13c0b53712 100644 --- a/crawl-ref/source/dat/des/branches/abyss.des +++ b/crawl-ref/source/dat/des/branches/abyss.des @@ -779,7 +779,7 @@ MONS: large abomination / ynoxinul / unseen horror / \ MONS: lich / hellephant / tentacled monstrosity / profane servitor / \ death drake / daeva / angel / bone dragon / balrug w:4 / \ shadow demon w:4 / executioner w:4 / hellion w:4 -ITEM: any book / mundane staff of death / robe randart / \ +ITEM: any book / mundane staff of necromancy / robe randart / \ orb ego:energy / gold q:100 w:2 ITEM: demon whip / demon blade / demon trident KFEAT: > = abyssal_stair diff --git a/crawl-ref/source/dat/des/branches/crypt.des b/crawl-ref/source/dat/des/branches/crypt.des index c5e3b62910..0a866c1957 100644 --- a/crawl-ref/source/dat/des/branches/crypt.des +++ b/crawl-ref/source/dat/des/branches/crypt.des @@ -94,7 +94,7 @@ function crypt_loot_plus(e, glyph) "eveningstar", "lajatang", top_rg, top_rg}) local high_weap = util.random_subset({"great sword", high_sb, "battleaxe", "glaive", "great mace", "lajatang"}, 2) - local staff = util.random_from({"staff of death randart", + local staff = util.random_from({"staff of necromancy randart", "any magical staff randart artprops:Necro"}) local drain_plus = crawl.random_range(1, 4) local weaps = util.random_subset({top_weap .. " ego:draining plus:" .. drain_plus, @@ -1770,7 +1770,7 @@ KMONS: C = mummy priest KMONS: 0 = zombie ITEM: any weapon good_item ego:draining, any weapon ego:pain ITEM: scroll of torment pre_id, randbook disc:necromancy numspells:3 -ITEM: staff of death pre_id +ITEM: staff of necromancy pre_id ITEM: amulet of regeneration randart good_item KITEM: $ = $ no_pickup KFEAT: D = altar_yredelemnul diff --git a/crawl-ref/source/dat/des/branches/hell.des b/crawl-ref/source/dat/des/branches/hell.des index bda3080118..a7ecec4b20 100644 --- a/crawl-ref/source/dat/des/branches/hell.des +++ b/crawl-ref/source/dat/des/branches/hell.des @@ -705,7 +705,7 @@ WEIGHT: 2 "any armour randart artprops:Will:1", "pearl dragon scales randart", "scroll of fog q:10", "quicksilver dragon scales randart", "any weapon randart artprops:Will:1", "any weapon randart artprops:rN:1", - "staff of death randart" }, 2 ) + "staff of necromancy randart" }, 2 ) -- Generically useful in all the Hells, a lot of scrolls and potions in bulk, -- but also rings of rN+ and willpower, which are useful in all the Hells, and diff --git a/crawl-ref/source/dat/des/branches/lair.des b/crawl-ref/source/dat/des/branches/lair.des index 3668632d51..8f89c7ae6c 100644 --- a/crawl-ref/source/dat/des/branches/lair.des +++ b/crawl-ref/source/dat/des/branches/lair.des @@ -4201,7 +4201,7 @@ ITEM: rapier ego:pain w:5 / rapier ego:draining w:5 \ / broad axe ego:draining / battleaxe ego:draining \ / executioner's axe ego:draining / shadow dragon scales \ / cigotuvi's embrace w:1 / amulet of regeneration randart \ - / ring of positive energy randart / staff of death \ + / ring of positive energy randart / staff of necromancy \ / book of necromancy / book of death / book of unlife \ / randbook owner:Kikubaaqudgha disc:necromancy \ / necronomicon w:1 diff --git a/crawl-ref/source/dat/des/branches/pan.des b/crawl-ref/source/dat/des/branches/pan.des index 70149edbfd..cc52e2e7be 100644 --- a/crawl-ref/source/dat/des/branches/pan.des +++ b/crawl-ref/source/dat/des/branches/pan.des @@ -2612,7 +2612,7 @@ ORIENT: float "any weapon good_item ego:pain | any weapon good_item ego:chaos | " .. "any weapon good_item ego:vampirism | demon blade good_item | " .. "demon trident good_item | demon whip good_item | " .. - "staff of death w:3 | scroll of torment q:2 w:5 | " .. + "staff of necromancy w:3 | scroll of torment q:2 w:5 | " .. "scroll of torment q:3 w:5 | randbook disc:necromancy") }} # 2/3 chance of nothing, 4/15 chance of gold, 1/15 chance of a lot of gold diff --git a/crawl-ref/source/dat/des/branches/swamp.des b/crawl-ref/source/dat/des/branches/swamp.des index f75757e85d..5fdfa53f41 100644 --- a/crawl-ref/source/dat/des/branches/swamp.des +++ b/crawl-ref/source/dat/des/branches/swamp.des @@ -2715,7 +2715,7 @@ NAME: nicolae_swamp_necromancy_gone_wrong TAGS: no_trap_gen patrolling MONS: 20-headed hydra zombie ITEM: scimitar good_item ego:none / glaive good_item ego:none \ - / broad axe good_item ego:none / staff of death / nothing w:40 + / broad axe good_item ego:none / staff of necromancy / nothing w:40 : item(dgn.good_aux_armour .. " / nothing w:60") ITEM: scroll of brand weapon / scroll of fear / scroll of teleportation \ / scroll of blinking / nothing w:40 @@ -3059,7 +3059,7 @@ ENDMAP NAME: tekkud_bubbles_buried_in_this_jungle TAGS: no_monster_gen DEPTH: Swamp -KMONS: 1 = fenstrider witch ; staff of alchemy | staff of death . \ +KMONS: 1 = fenstrider witch ; staff of alchemy | staff of necromancy . \ orb ego:wrath | orb ego:mayhem w:5 . robe KMONS: 2 = bog body KMONS: 3 = bloated husk diff --git a/crawl-ref/source/dat/des/builder/alphashops.des b/crawl-ref/source/dat/des/builder/alphashops.des index eeca4ffb45..92743c7fb4 100644 --- a/crawl-ref/source/dat/des/builder/alphashops.des +++ b/crawl-ref/source/dat/des/builder/alphashops.des @@ -88,7 +88,7 @@ "book of dreams", "book of the dragon", "dagger", "dragon-coil talisman", "demon blade", "demon trident", "demon whip", "dire flail", "double sword", "ring of dexterity", "manual of dodging", - "staff of death", "wand of digging", "dart", "book of dangerous friends", + "wand of digging", "dart", "book of dangerous friends", "book of displacement", "book of decay", "book of duality" } elseif s == "E" then i = { "manual of evocations", "potion of enlightenment", @@ -138,7 +138,7 @@ "book of maladies", "book of metalworking", "maxwell's memoranda", "my sojourn through swampland" } - elseif s == "N" then i = { "book of necromancy", + elseif s == "N" then i = { "book of necromancy", "staff of necromancy", "necronomicon", "scroll of noise", "manual of necromancy" } elseif s == "O" then i = { "orcbow" } diff --git a/crawl-ref/source/dat/des/builder/shops.des b/crawl-ref/source/dat/des/builder/shops.des index 07bfb2f459..44d210173a 100644 --- a/crawl-ref/source/dat/des/builder/shops.des +++ b/crawl-ref/source/dat/des/builder/shops.des @@ -1150,9 +1150,9 @@ SUBST: G : YlG : kfeat("s = general shop " .. shopname .. " ; \ : any weapon ego:draining w:15 | any weapon ego:pain | \ : any weapon ego:vampirism | any weapon ego:chaos w:1 | demon blade w:5 | \ -: demon trident w:5 | demon whip w:5 | scroll of torment | staff of death | \ -: book of necromancy | book of death | book of unlife | \ -: book of decay | book of the grave | \ +: demon trident w:5 | demon whip w:5 | scroll of torment | \ +: staff of necromancy | book of necromancy | book of death | \ +: book of unlife | book of decay | book of the grave | \ : randbook disc:necromancy w:5 | necronomicon w:1 | grand grimoire w:1 | \ : sceptre_of_torment w:1 | scythe_of_curses w:1 | majin-bo w:1 | \ : black_knights_barding w:1 | obsidian_axe w:1 | damnation w:1 | \ diff --git a/crawl-ref/source/dat/des/portals/icecave.des b/crawl-ref/source/dat/des/portals/icecave.des index 13c0cb6068..95cc9a704e 100644 --- a/crawl-ref/source/dat/des/portals/icecave.des +++ b/crawl-ref/source/dat/des/portals/icecave.des @@ -424,8 +424,8 @@ function ice_cave_common_loot(e, glyphs) end --[[ -Define one kitem glyph containing necromancy themed items, including -spellbooks, a manual, staff of death, and an artefact ring of positive energy. +Define one kitem glyph containing necromancy themed items, including books, +a manual, staff of necromancy, and an artefact ring of positive energy. @tab e The map environment. @string[opt="j"] glyphs Glyphs to use for the single KITEM statement. @@ -437,7 +437,7 @@ function ice_cave_necro_loot(e, glyphs) e.kitem(glyphs .. " = book of unlife / randbook disc:ice" .. " disc2:necromancy numspells:6" .. - "/ manual of necromancy w:5 / staff of death" .. + "/ manual of necromancy w:5 / staff of necromancy" .. "/ ring of positive energy randart") end diff --git a/crawl-ref/source/dat/des/portals/necropolis.des b/crawl-ref/source/dat/des/portals/necropolis.des index 7a365cde80..0bf2c9c8e2 100644 --- a/crawl-ref/source/dat/des/portals/necropolis.des +++ b/crawl-ref/source/dat/des/portals/necropolis.des @@ -4703,7 +4703,7 @@ NSUBST: $ = 2:e / *:$, % = 1:g* / *:% SUBST: ?! = % : end KMONS: O = player ghost -ITEM: staff of fire / staff of death / quarterstaff ego:spectral / \ +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 / \ lajatang ego:spectral / lajatang ego:pain / \ diff --git a/crawl-ref/source/dat/des/portals/wizlab.des b/crawl-ref/source/dat/des/portals/wizlab.des index 04ba8ea684..ace8105362 100644 --- a/crawl-ref/source/dat/des/portals/wizlab.des +++ b/crawl-ref/source/dat/des/portals/wizlab.des @@ -1287,7 +1287,7 @@ ITEM: protean talisman randart / maw talisman randart / \ serpent talisman randart / statue talisman w:8 / \ dragon-coil talisman / storm talisman w:8 / \ talisman of death w:2 -ITEM: staff of death pre_id, scroll of poison pre_id +ITEM: staff of necromancy pre_id, scroll of poison pre_id ITEM: w:5 any jewellery randart / w:5 hat_of_the_alchemist / \ cigotuvi's_embrace KFEAT: ? = fountain_eyes @@ -2358,7 +2358,7 @@ MONS: spriggan berserker zombie / titan zombie / spark wasp zombie /\ MONS: ancient champion / revenant soulmonger, laughing skull MONS: deep elf death mage / vampire mage / necromancer, halazid warlock ITEM: randbook disc:necromancy numspells:6 owner:Borgnjor w:5 / any book /\ - necronomicon / randbook disc:necromancy / staff of death w:5 /\ + necronomicon / randbook disc:necromancy / staff of necromancy w:5 /\ sanguine talisman / macabre finger necklace w:1 /\ sceptre of torment w:1 : local p = "good_item ego:pain w:3" diff --git a/crawl-ref/source/dat/des/sprint/arena_sprint.des b/crawl-ref/source/dat/des/sprint/arena_sprint.des index 078c53e964..1919aa7cc9 100644 --- a/crawl-ref/source/dat/des/sprint/arena_sprint.des +++ b/crawl-ref/source/dat/des/sprint/arena_sprint.des @@ -1096,7 +1096,7 @@ KFEAT: M = jewellery shop type:Timeless suffix:Talismans count:19 greed:7 use_a hive talisman | storm talisman | talisman of death KFEAT: N = weapon shop type:Staff suffix:Store count:9 use_all greed:30 ; \ staff of fire | staff of air | staff of earth | staff of cold |\ - staff of alchemy | staff of death | staff of conjuration + staff of alchemy | staff of necromancy | staff of conjuration KFEAT: Q = weapon shop type:Weapon suffix:Rack count:17 use_all greed:30 ; \ mundane quick blade | mundane demon blade |\ mundane triple sword | mundane broad axe |\ diff --git a/crawl-ref/source/dat/des/variable/float.des b/crawl-ref/source/dat/des/variable/float.des index f0544ee6b0..be73e89238 100644 --- a/crawl-ref/source/dat/des/variable/float.des +++ b/crawl-ref/source/dat/des/variable/float.des @@ -6207,7 +6207,7 @@ KMONS: 3 = salamander / large abomination w:5 KITEM: 1 = manual of fire magic w:5 / manual of necromancy w:5 / \ randbook disc:fire disc2:necromancy spells:scorch \ slevels:8 numspells:4 title:Dead_Stars, \ - staff of fire / staff of death / scroll of immolation q:3 / \ + staff of fire / staff of necromancy / scroll of immolation q:3 / \ scroll of torment q:3 / any weapon ego:flaming / \ any weapon ego:draining : else diff --git a/crawl-ref/source/dat/descript/da/items.txt b/crawl-ref/source/dat/descript/da/items.txt index 809f502270..46d1a36971 100644 --- a/crawl-ref/source/dat/descript/da/items.txt +++ b/crawl-ref/source/dat/descript/da/items.txt @@ -766,7 +766,7 @@ staff of conjuration Denne stav øger brugerens fremmaningers kraft. %%%% -staff of death +staff of necromancy Denne stav øger brugerens nekromantiske besværgelsers kraft og beskytter mod negativ energi. Hvis brugeren er kyndig i bÃ¥de vækkelser og nekromantik vil diff --git a/crawl-ref/source/dat/descript/de/quotes.txt b/crawl-ref/source/dat/descript/de/quotes.txt index f4c7be970f..3774790a9d 100644 --- a/crawl-ref/source/dat/descript/de/quotes.txt +++ b/crawl-ref/source/dat/descript/de/quotes.txt @@ -742,7 +742,7 @@ geleitet mich in das Dorf, in einer Mondlosen Nacht. Wenn du es einen Diener nennst kommst du schnell wie ein Pfeil in die Hölle.â -Mumon Ekai, _The Gateless Gate_, case 44. 1228. %%%% -staff of death +staff of necromancy â'Ich bin Aed Abaid von Ess Ruaid, das heiÃt, der gute Gott der Zauberei der Tuatha Dé Danann und die Ruad Rofhessa und Eochaid Ollathair sind meine drei diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt index 822794bac9..8c1f99c9a3 100644 --- a/crawl-ref/source/dat/descript/items.txt +++ b/crawl-ref/source/dat/descript/items.txt @@ -1570,7 +1570,7 @@ A staff that increases the power of conjurations cast by its wielder. If the wielder is skilled in Evocations and Conjurations, they can blast those they strike with pure energy. %%%% -staff of death +staff of necromancy A staff that increases the power of necromantic spells cast by its wielder, and protects them from negative energy. If the wielder is skilled in Evocations and diff --git a/crawl-ref/source/dat/descript/quotes.txt b/crawl-ref/source/dat/descript/quotes.txt index a31e023f11..f438a8c306 100644 --- a/crawl-ref/source/dat/descript/quotes.txt +++ b/crawl-ref/source/dat/descript/quotes.txt @@ -1883,7 +1883,7 @@ staff of conjuration <staff> %%%% -staff of death +staff of necromancy â'I am Aed Abaid of Ess Rúaid, that is, the good god of wizardry of the Tuatha Dé Danann, and the Rúad Rofhessa, and Eochaid Ollathair are my three names.â diff --git a/crawl-ref/source/dat/descript/zh/items.txt b/crawl-ref/source/dat/descript/zh/items.txt index a5685c0661..1136a79ca0 100644 --- a/crawl-ref/source/dat/descript/zh/items.txt +++ b/crawl-ref/source/dat/descript/zh/items.txt @@ -1222,7 +1222,7 @@ staff of conjuration å¦æä½¿ç¨è ç²¾éæ¿æ´»æè½åå¡è½éæ³ï¼ä»ä»¬å¯ä»¥ç¨çº¯è½éè½°å»æå»ä¸çäººï¼ é æä¸å¯ææç伤害ã %%%% -staff of death +staff of necromancy è¿æ ¹æ³æè½å¢å¼ºä½¿ç¨è æ½å±æ»çµæ¯çå¨åï¼å¹¶è½å¸®å©å ¶æµå¾¡è´è½éçå½±åã å¦æä½¿ç¨è ç²¾éæ¿æ´»æè½åæ»çµæ¯ï¼å°±è½è®©åå»ççµéæ¿åçæ¥ï¼ diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc index 442f94acdd..d8ddf6bcbd 100644 --- a/crawl-ref/source/describe.cc +++ b/crawl-ref/source/describe.cc @@ -2323,7 +2323,7 @@ static const char* _item_ego_desc(special_armour_type ego) return "it protects its wearer from the effects of negative energy."; case SPARM_ARCHMAGI: return "it increases the power of its wearer's magical spells."; - case SPARM_PRESERVATION: + case SPARM_CORROSION_RESISTANCE: return "it protects its wearer from the effects of acid and corrosion."; case SPARM_REFLECTION: return "it reflects blocked missile attacks back in the " @@ -5367,7 +5367,7 @@ static string _monster_staff_damage_string(const monster_info &mi, // From monster::skill const int evo_skill = mi.hd; int staff_skill; - if (staff == STAFF_DEATH) + if (staff == STAFF_NECROMANCY) staff_skill = mi.has_necromancy_spell() ? mi.hd : mi.hd / 2; else staff_skill = mi.is_actual_spellcaster() ? mi.hd : mi.hd / 3; @@ -5379,7 +5379,7 @@ static string _monster_staff_damage_string(const monster_info &mi, : staff == STAFF_COLD ? "cold" : staff == STAFF_AIR ? "elec" : staff == STAFF_EARTH ? "earth" - : staff == STAFF_DEATH ? "drain" + : staff == STAFF_NECROMANCY ? "drain" // pain? : staff == STAFF_ALCHEMY ? "poison" /*staff == STAFF_CONJURATION*/ : "conj"; diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc index ced6dc8f4a..ded692f0ae 100644 --- a/crawl-ref/source/ghost.cc +++ b/crawl-ref/source/ghost.cc @@ -497,7 +497,7 @@ void ghost_demon::init_player_ghost() case STAFF_FIRE: brand = SPWPN_FLAMING; break; case STAFF_COLD: brand = SPWPN_FREEZING; break; case STAFF_ALCHEMY: brand = SPWPN_VENOM; break; - case STAFF_DEATH: brand = SPWPN_PAIN; break; + case STAFF_NECROMANCY: brand = SPWPN_PAIN; break; case STAFF_AIR: brand = SPWPN_ELECTROCUTION; break; case STAFF_EARTH: brand = SPWPN_HEAVY; break; default: ; diff --git a/crawl-ref/source/god-item.cc b/crawl-ref/source/god-item.cc index 03901b3967..0f80e157e6 100644 --- a/crawl-ref/source/god-item.cc +++ b/crawl-ref/source/god-item.cc @@ -164,7 +164,7 @@ bool is_evil_item(const item_def& item, bool calc_unid) case OBJ_SCROLLS: return item.sub_type == SCR_TORMENT; case OBJ_STAVES: - return item.sub_type == STAFF_DEATH; + return item.sub_type == STAFF_NECROMANCY; case OBJ_ARMOUR: return get_armour_ego_type(item) == SPARM_DEATH; case OBJ_MISCELLANY: diff --git a/crawl-ref/source/item-name.cc b/crawl-ref/source/item-name.cc index e9e41c21e9..2c4d38d670 100644 --- a/crawl-ref/source/item-name.cc +++ b/crawl-ref/source/item-name.cc @@ -554,7 +554,7 @@ const char* special_armour_type_name(special_armour_type ego, bool terse) #if TAG_MAJOR_VERSION == 34 case SPARM_JUMPING: return "jumping"; #endif - case SPARM_PRESERVATION: return "preservation"; + case SPARM_CORROSION_RESISTANCE: return "corrosion resistance"; case SPARM_REFLECTION: return "reflection"; case SPARM_SPIRIT_SHIELD: return "spirit shield"; case SPARM_HURLING: return "hurling"; @@ -613,7 +613,7 @@ const char* special_armour_type_name(special_armour_type ego, bool terse) #if TAG_MAJOR_VERSION == 34 case SPARM_JUMPING: return "obsolete"; #endif - case SPARM_PRESERVATION: return "rCorr"; + case SPARM_CORROSION_RESISTANCE: return "rCorr"; case SPARM_REFLECTION: return "reflect"; case SPARM_SPIRIT_SHIELD: return "Spirit"; case SPARM_HURLING: return "hurl"; diff --git a/crawl-ref/source/item-prop-enum.h b/crawl-ref/source/item-prop-enum.h index f3f6a4a940..409cef0849 100644 --- a/crawl-ref/source/item-prop-enum.h +++ b/crawl-ref/source/item-prop-enum.h @@ -489,6 +489,9 @@ enum special_armour_type SPARM_FIRE_RESISTANCE, SPARM_COLD_RESISTANCE, SPARM_POISON_RESISTANCE, +#if TAG_MAJOR_VERSION > 34 + SPARM_CORROSION_RESISTANCE, +#endif SPARM_SEE_INVISIBLE, SPARM_INVISIBILITY, SPARM_STRENGTH, @@ -502,7 +505,9 @@ enum special_armour_type SPARM_RESISTANCE, SPARM_POSITIVE_ENERGY, SPARM_ARCHMAGI, - SPARM_PRESERVATION, +#if TAG_MAJOR_VERSION == 34 + SPARM_CORROSION_RESISTANCE, +#endif SPARM_REFLECTION, SPARM_SPIRIT_SHIELD, SPARM_HURLING, @@ -593,7 +598,7 @@ enum stave_type #if TAG_MAJOR_VERSION == 34 STAFF_ENERGY, #endif - STAFF_DEATH, + STAFF_NECROMANCY, STAFF_CONJURATION, #if TAG_MAJOR_VERSION == 34 STAFF_ENCHANTMENT, diff --git a/crawl-ref/source/item-prop.cc b/crawl-ref/source/item-prop.cc index 3f4868527f..9d51f04282 100644 --- a/crawl-ref/source/item-prop.cc +++ b/crawl-ref/source/item-prop.cc @@ -96,15 +96,15 @@ static const vector<ego_weight_tuple> HEAVY_BODY_EGOS = { // Total weight 50 static const vector<ego_weight_tuple> SHIELD_EGOS = { - { SPARM_RESISTANCE, 1 }, - { SPARM_FIRE_RESISTANCE, 4 }, - { SPARM_COLD_RESISTANCE, 4 }, - { SPARM_POISON_RESISTANCE, 4 }, - { SPARM_POSITIVE_ENERGY, 4 }, - { SPARM_NORMAL, 4 }, - { SPARM_PRESERVATION, 4 }, - { SPARM_REFLECTION, 9 }, - { SPARM_PROTECTION, 16 }, + { SPARM_RESISTANCE, 1 }, + { SPARM_FIRE_RESISTANCE, 4 }, + { SPARM_COLD_RESISTANCE, 4 }, + { SPARM_POISON_RESISTANCE, 4 }, + { SPARM_POSITIVE_ENERGY, 4 }, + { SPARM_NORMAL, 4 }, + { SPARM_CORROSION_RESISTANCE, 4 }, + { SPARM_REFLECTION, 9 }, + { SPARM_PROTECTION, 16 }, }; // would be nice to lookup the name from monster_for_armour, but that @@ -172,11 +172,11 @@ static const armour_def Armour_prop[] = { ARM_CLOAK, "cloak", 1, 0, 45, SLOT_CLOAK, SIZE_LITTLE, SIZE_LARGE, true, 0, { - { SPARM_POISON_RESISTANCE, 2 }, - { SPARM_WILLPOWER, 2 }, - { SPARM_STEALTH, 2 }, - { SPARM_PRESERVATION, 2 }, - { SPARM_AIR, 1 }, + { SPARM_POISON_RESISTANCE, 2 }, + { SPARM_WILLPOWER, 2 }, + { SPARM_STEALTH, 2 }, + { SPARM_CORROSION_RESISTANCE, 2 }, + { SPARM_AIR, 1 }, }}, { ARM_SCARF, "scarf", 0, 0, 50, SLOT_CLOAK, SIZE_LITTLE, SIZE_LARGE, true, 0, { @@ -271,25 +271,25 @@ static const armour_def Armour_prop[] = }}, { ARM_KITE_SHIELD, "kite shield", 8, -100, 70, SLOT_OFFHAND, SIZE_SMALL, SIZE_LARGE, true, 0,{ - { SPARM_FIRE_RESISTANCE, 4 }, - { SPARM_COLD_RESISTANCE, 4 }, - { SPARM_POISON_RESISTANCE, 4 }, - { SPARM_POSITIVE_ENERGY, 4 }, - { SPARM_NORMAL, 4 }, - { SPARM_PRESERVATION, 4 }, - { SPARM_REFLECTION, 13 }, - { SPARM_PROTECTION, 13 }, + { SPARM_FIRE_RESISTANCE, 4 }, + { SPARM_COLD_RESISTANCE, 4 }, + { SPARM_POISON_RESISTANCE, 4 }, + { SPARM_POSITIVE_ENERGY, 4 }, + { SPARM_NORMAL, 4 }, + { SPARM_CORROSION_RESISTANCE, 4 }, + { SPARM_REFLECTION, 13 }, + { SPARM_PROTECTION, 13 }, }}, { ARM_TOWER_SHIELD, "tower shield", 13, -150, 80, SLOT_OFFHAND, SIZE_MEDIUM, SIZE_GIANT, true, 0, { - { SPARM_FIRE_RESISTANCE, 3 }, - { SPARM_COLD_RESISTANCE, 3 }, - { SPARM_POISON_RESISTANCE, 3 }, - { SPARM_POSITIVE_ENERGY, 3 }, - { SPARM_PONDEROUSNESS, 3 }, - { SPARM_PRESERVATION, 5 }, - { SPARM_REFLECTION, 5 }, - { SPARM_PROTECTION, 15 }, + { SPARM_FIRE_RESISTANCE, 3 }, + { SPARM_COLD_RESISTANCE, 3 }, + { SPARM_POISON_RESISTANCE, 3 }, + { SPARM_POSITIVE_ENERGY, 3 }, + { SPARM_PONDEROUSNESS, 3 }, + { SPARM_CORROSION_RESISTANCE, 5 }, + { SPARM_REFLECTION, 5 }, + { SPARM_PROTECTION, 15 }, }}, // Following all ARM_ entries for the benefit of util/gather_items @@ -848,7 +848,7 @@ static const staff_def Staff_prop[] = #if TAG_MAJOR_VERSION == 34 { STAFF_ENERGY, "energy" }, #endif - { STAFF_DEATH, "death", SK_NECROMANCY, + { STAFF_NECROMANCY, "necromancy", SK_NECROMANCY, 63, ac_type::normal, BEAM_NEG }, { STAFF_CONJURATION, "conjuration", SK_CONJURATIONS, 50, ac_type::normal, BEAM_MMISSILE }, @@ -2619,7 +2619,7 @@ int get_armour_res_corr(const item_def &arm) ASSERT(arm.base_type == OBJ_ARMOUR); // intrinsic armour abilities - return get_armour_ego_type(arm) == SPARM_PRESERVATION + return get_armour_ego_type(arm) == SPARM_CORROSION_RESISTANCE || armour_type_prop(arm.sub_type, ARMF_RES_CORR); } @@ -2905,7 +2905,7 @@ bool gives_resistance(const item_def &item) || ego == SPARM_POISON_RESISTANCE || ego == SPARM_WILLPOWER || ego == SPARM_RESISTANCE - || ego == SPARM_PRESERVATION + || ego == SPARM_CORROSION_RESISTANCE || ego == SPARM_POSITIVE_ENERGY) { return true; @@ -2917,7 +2917,7 @@ bool gives_resistance(const item_def &item) || item.sub_type == STAFF_COLD || item.sub_type == STAFF_ALCHEMY || item.sub_type == STAFF_AIR - || item.sub_type == STAFF_DEATH) + || item.sub_type == STAFF_NECROMANCY) { return true; } diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc index 30c057792c..014bf3cd59 100644 --- a/crawl-ref/source/makeitem.cc +++ b/crawl-ref/source/makeitem.cc @@ -805,7 +805,7 @@ bool is_armour_brand_ok(int type, int brand, bool strict) case SPARM_PONDEROUSNESS: return true; - case SPARM_PRESERVATION: + case SPARM_CORROSION_RESISTANCE: case SPARM_AIR: #if TAG_MAJOR_VERSION > 34 return slot == SLOT_CLOAK || slot == SLOT_OFFHAND; diff --git a/crawl-ref/source/mapdef.cc b/crawl-ref/source/mapdef.cc index cc2fb1468c..49133edd76 100644 --- a/crawl-ref/source/mapdef.cc +++ b/crawl-ref/source/mapdef.cc @@ -4971,7 +4971,7 @@ int str_to_ego(object_class_type item_type, string ego_str) "resistance", "positive_energy", "archmagi", - "preservation", + "corrosion_resistance", "reflection", "spirit_shield", "hurling", diff --git a/crawl-ref/source/melee-attack.cc b/crawl-ref/source/melee-attack.cc index 39e34bc47c..233b037e17 100644 --- a/crawl-ref/source/melee-attack.cc +++ b/crawl-ref/source/melee-attack.cc @@ -3071,7 +3071,7 @@ string melee_attack::staff_message(stave_type staff, int dam) const defender->name(DESC_THE).c_str(), attack_strength_punctuation(dam).c_str()); - case STAFF_DEATH: + case STAFF_NECROMANCY: return make_stringf( "%s %s as negative energy consumes %s%s", defender->name(DESC_THE).c_str(), @@ -3114,7 +3114,7 @@ bool melee_attack::apply_staff_damage() dam /= 3; if (dam > 0) { - if (staff == STAFF_DEATH) + if (staff == STAFF_NECROMANCY) attacker->god_conduct(DID_EVIL, 4); else if (staff == STAFF_FIRE && defender->is_player()) maybe_melt_player_enchantments(flavour, dam); diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc index 83d0e020f1..145f2d7fc9 100644 --- a/crawl-ref/source/monster.cc +++ b/crawl-ref/source/monster.cc @@ -3893,7 +3893,7 @@ int monster::res_negative_energy(bool intrinsic_only) const u += get_jewellery_life_protection(env.item[jewellery], false); const item_def *w = primary_weapon(); - if (w && w->is_type(OBJ_STAVES, STAFF_DEATH)) + if (w && w->is_type(OBJ_STAVES, STAFF_NECROMANCY)) u++; } @@ -3936,7 +3936,7 @@ int monster::res_corr() const { u += wearing(OBJ_ARMOUR, ARM_ACID_DRAGON_ARMOUR); u += wearing_jewellery(RING_RESIST_CORROSION); - u += wearing_ego(OBJ_ARMOUR, SPARM_PRESERVATION); + u += wearing_ego(OBJ_ARMOUR, SPARM_CORROSION_RESISTANCE); u += scan_artefacts(ARTP_RCORR); } diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index 7c6571d7c2..7bed41c5b7 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -1396,7 +1396,7 @@ int player_res_corrosion(bool allow_random, bool temp, bool items) if (you.scan_artefacts(ARTP_RCORR) || you.wearing(OBJ_ARMOUR, ARM_ACID_DRAGON_ARMOUR) || you.wearing_jewellery(RING_RESIST_CORROSION) - || you.wearing_ego(OBJ_ARMOUR, SPARM_PRESERVATION)) + || you.wearing_ego(OBJ_ARMOUR, SPARM_CORROSION_RESISTANCE)) { return 1; } @@ -1536,7 +1536,7 @@ int player_spec_death() { int sd = 0; - sd += you.wearing(OBJ_STAVES, STAFF_DEATH); + sd += you.wearing(OBJ_STAVES, STAFF_NECROMANCY); sd += you.get_mutation_level(MUT_NECRO_ENHANCER); @@ -1705,7 +1705,7 @@ int player_prot_life(bool allow_random, bool temp, bool items) pl++; } - pl += you.wearing(OBJ_STAVES, STAFF_DEATH); + pl += you.wearing(OBJ_STAVES, STAFF_NECROMANCY); } // undead/demonic power diff --git a/crawl-ref/source/rltiles/dc-item.txt b/crawl-ref/source/rltiles/dc-item.txt index 4aa4ad8bcc..07098eca96 100644 --- a/crawl-ref/source/rltiles/dc-item.txt +++ b/crawl-ref/source/rltiles/dc-item.txt @@ -566,7 +566,7 @@ i-stealth BRAND_ARM_STEALTH i-resistance BRAND_ARM_RESISTANCE i-positive-energy BRAND_ARM_POSITIVE_ENERGY i-archmagi BRAND_ARM_ARCHMAGI -i-preservation BRAND_ARM_PRESERVATION +i-corrosion-res BRAND_ARM_CORROSION_RESISTANCE i-reflection BRAND_ARM_REFLECTION i-spirit BRAND_ARM_SPIRIT_SHIELD i-hurling BRAND_ARM_HURLING @@ -1195,7 +1195,7 @@ i-staff_poison STAFF_POISON # start TAG_MAJOR_VERSION == 34 i-staff_energy STAFF_ENERGY # end TAG_MAJOR_VERSION -i-staff_death STAFF_DEATH +i-staff_necromancy STAFF_NECROMANCY i-staff_conjuration STAFF_CONJURATION # start TAG_MAJOR_VERSION == 34 i-staff_enchantment STAFF_ENCHANTMENT diff --git a/crawl-ref/source/rltiles/item/amulet/i-alchemy.png b/crawl-ref/source/rltiles/item/amulet/i-alchemy.png index 68c13a1161..a34a4ff083 100644 Binary files a/crawl-ref/source/rltiles/item/amulet/i-alchemy.png and b/crawl-ref/source/rltiles/item/amulet/i-alchemy.png differ diff --git a/crawl-ref/source/rltiles/item/amulet/i-dissipation.png b/crawl-ref/source/rltiles/item/amulet/i-dissipation.png index d07b3db02e..4cff333e39 100644 Binary files a/crawl-ref/source/rltiles/item/amulet/i-dissipation.png and b/crawl-ref/source/rltiles/item/amulet/i-dissipation.png differ diff --git a/crawl-ref/source/rltiles/item/amulet/i-wildshape.png b/crawl-ref/source/rltiles/item/amulet/i-wildshape.png index 2c2f85974e..518167a72d 100644 Binary files a/crawl-ref/source/rltiles/item/amulet/i-wildshape.png and b/crawl-ref/source/rltiles/item/amulet/i-wildshape.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-command.png b/crawl-ref/source/rltiles/item/armour/brands/i-command.png index b0621be9b9..7d5e3a4164 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-command.png and b/crawl-ref/source/rltiles/item/armour/brands/i-command.png differ diff --git a/crawl-ref/source/rltiles/item/ring/i-r-corrosion.png b/crawl-ref/source/rltiles/item/armour/brands/i-corrosion-res.png similarity index 100% copy from crawl-ref/source/rltiles/item/ring/i-r-corrosion.png copy to crawl-ref/source/rltiles/item/armour/brands/i-corrosion-res.png diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-death.png b/crawl-ref/source/rltiles/item/armour/brands/i-death.png index 3764e1e3fd..7b91a5f1b0 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-death.png and b/crawl-ref/source/rltiles/item/armour/brands/i-death.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-glass.png b/crawl-ref/source/rltiles/item/armour/brands/i-glass.png index ad3a923ef2..ada9ba69e7 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-glass.png and b/crawl-ref/source/rltiles/item/armour/brands/i-glass.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-light.png b/crawl-ref/source/rltiles/item/armour/brands/i-light.png index cdb866d4dd..60b908cbd4 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-light.png and b/crawl-ref/source/rltiles/item/armour/brands/i-light.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-parrying.png b/crawl-ref/source/rltiles/item/armour/brands/i-parrying.png index 0ec8c620b7..6a4c37a08f 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-parrying.png and b/crawl-ref/source/rltiles/item/armour/brands/i-parrying.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-power.png b/crawl-ref/source/rltiles/item/armour/brands/i-power.png new file mode 100644 index 0000000000..8f0e4bee3f Binary files /dev/null and b/crawl-ref/source/rltiles/item/armour/brands/i-power.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-preservation.png b/crawl-ref/source/rltiles/item/armour/brands/i-preservation.png deleted file mode 100644 index 59dab93efc..0000000000 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-preservation.png and /dev/null differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-resonance.png b/crawl-ref/source/rltiles/item/armour/brands/i-resonance.png index 29962c40ec..fc56fe2e9b 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-resonance.png and b/crawl-ref/source/rltiles/item/armour/brands/i-resonance.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-sniping.png b/crawl-ref/source/rltiles/item/armour/brands/i-sniping.png index 09a5c8c856..925e0fcfe0 100644 Binary files a/crawl-ref/source/rltiles/item/armour/brands/i-sniping.png and b/crawl-ref/source/rltiles/item/armour/brands/i-sniping.png differ diff --git a/crawl-ref/source/rltiles/item/armour/brands/i-storms.png b/crawl-ref/source/rltiles/item/armour/brands/i-storms.png new file mode 100644 index 0000000000..0d08e46caf Binary files /dev/null and b/crawl-ref/source/rltiles/item/armour/brands/i-storms.png differ diff --git a/crawl-ref/source/rltiles/item/staff/i-staff_death.png b/crawl-ref/source/rltiles/item/staff/i-staff_necromancy.png similarity index 100% rename from crawl-ref/source/rltiles/item/staff/i-staff_death.png rename to crawl-ref/source/rltiles/item/staff/i-staff_necromancy.png diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc index 9d9ee0a504..ed48ef20e8 100644 --- a/crawl-ref/source/shopping.cc +++ b/crawl-ref/source/shopping.cc @@ -384,7 +384,7 @@ unsigned int item_value(item_def item, bool ident) case SPARM_PROTECTION: case SPARM_HURLING: case SPARM_REPULSION: - case SPARM_PRESERVATION: + case SPARM_CORROSION_RESISTANCE: case SPARM_SHADOWS: case SPARM_RAMPAGING: case SPARM_INFUSION: -- Dungeon Crawl Stone Soup |