|
From: <gi...@cr...> - 2026-01-27 18:20:12
|
via 2e2e0191d489cc40a7b79d7fe5660293fc59f135 (commit)
via a163befcda4a51d13a1f36ae1d4f3ae0dd149114 (commit)
via 01fc87eb860e3e4050008a260da3734864ebaede (commit)
via 39c79d34048fbf5a81ef100171f2e6b9d6fe83c9 (commit)
via 74416bb7629f255b872386220863deeda41488c0 (commit)
via cf6912fd91bfbf19160a6be018fa8379bf919bca (commit)
via 281c778d3329ca43ca8bd976029a774ad75d9938 (commit)
via de1f1ef9e5e6cc133399f6d86285efe3e9e875f0 (commit)
via 7545aa91a50f44fb0a563143c05e83b5116569a1 (commit)
via cbb5ade2d1843e03b6b6ed2eee74573d6496034c (commit)
via 64aece269981cd94bd4ff0407d1beb62747cfa5a (commit)
via 5dd18ec61c79e1e65cfdd05f60e528ec681bf687 (commit)
via e745a072dd8154018f8730c3ec92baf49d5dfe93 (commit)
via 38006e5a57052840c4b911fd7711e3e65e19a248 (commit)
via c29d13b6fc2e257928678a0992985d78712ba0d5 (commit)
via 6429ade63d294af1085630f58a9fb45c5bd681f5 (commit)
via 988cdcb123d4cb538265a45a8d07f6ccb32e27b8 (commit)
via c6bc3c3f6de78bfb213936bd4f39bf0f945fab49 (commit)
via cfe2be61d58bb7905b1f9a74de00af04a9191dca (commit)
via 42e68bc82df5145e4bcb2ee36b7cf4c896ed2088 (commit)
via 182fdd2a8a62c5707e54d057ed171d1b0cf2068f (commit)
from ba93e64a92a34d9901f6327faaa56c32c9b96246 (commit)
-----------------------------------------------------------------------
commit 2e2e0191d489cc40a7b79d7fe5660293fc59f135
Author: DracoOmega <dra...@gm...>
Date: Tue Jan 27 14:41:28 2026 -0330
Reduce death knight Hurl Torchlight damage
It was probably a bit too nasty for unavoidable, irresistable damage that
also buffs their allies.
commit a163befcda4a51d13a1f36ae1d4f3ae0dd149114
Author: DracoOmega <dra...@gm...>
Date: Tue Jan 27 14:37:34 2026 -0330
Tweak Blade form numbers
Slightly reduce aux damage and base parrying amount. Reduce the body armour
AC penalty at minskill from -70% to -50%, but increase it to -20% at max
skill (instead of 0%). Prevent negative slaying (eg: from Claustrophobia)
from reducing your SH (which could even cause you to lose your baseline
shield when attacking....).
commit 01fc87eb860e3e4050008a260da3734864ebaede
Author: DracoOmega <dra...@gm...>
Date: Tue Jan 27 14:23:07 2026 -0330
Fix broken lua api for item slot remapping (WizardIke)
This has been somewhat broken since the consumable inventory change,
allowing the player to specify slots outside the allowed gear range and
cause a variety of undefined behavior or crashes on demand by trying to do
so.
This splits the old items.swap_slots function into two new ones:
items.swap_gear_slots() works more or less the same as swap_slots() used
to (but properly constrains the result to valid gear slots)
items.swap_consumable_slots() works on consumables, and requires the
caller to specify which category, but takes letters as slots instead of
indicies. eg: items.swap_consumable_slots('potion', 'c', 'X')
It has been suggested that existing API functions should allow interacting
with letters more directly (instead of often requiring
items.letter_to_index() calls), which makes sense to me, but I have
deferred that for the moment.
This fixes #5050
commit 39c79d34048fbf5a81ef100171f2e6b9d6fe83c9
Author: DracoOmega <dra...@gm...>
Date: Tue Jan 27 13:03:47 2026 -0330
Lower eel hands damage by ~20%
Even for a mid-tier form that melds your shield, it was probably a little
overtuned. Hopefully it should remain quite appealing to UC characters.
commit 74416bb7629f255b872386220863deeda41488c0
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 22:36:34 2026 -0330
Slightly lower parchment prices
It's possible I overshot a small bit with the previous change.
commit cf6912fd91bfbf19160a6be018fa8379bf919bca
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 20:54:57 2026 -0330
Make unidentified orbs less expensive
Whether an orb does anything relevant for a character is very
ego-dependent, so unidentified orbs being as expensive as they are makes
them an often unappealing gamble.
Shift more of the cost from the base orb to the egos themselves to make
these much cheaper while maintaining a hopefully appropriate cost for
identified orbs.
commit 281c778d3329ca43ca8bd976029a774ad75d9938
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 20:06:20 2026 -0330
Nudge orb of stardust damage down a little
I'm quite pleased that players seem to be getting use out of multiple of
the new orbs, but this one is possibly still a *bit* too strong and can
afford a gentle downward nudge.
commit de1f1ef9e5e6cc133399f6d86285efe3e9e875f0
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 19:45:00 2026 -0330
Fix a typo (roxie puddles)
commit 7545aa91a50f44fb0a563143c05e83b5116569a1
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 19:39:43 2026 -0330
Make Maw's dietary preferences more intuitive
Maw form could eat any enemy with a 'corpse', but it turns out that this
isn't very player-facing these days and does not (as one might expect)
directly correlate to what enemies can get raised as zombies. While a few
instances of living monsters that didn't drop corpses might be arguably
intuitive (such as jellies) there were many weird exceptions. Maws were
unable to eat orb guardians, mana vipers, boggarts, Maurice.... (and many
others). There isn't even any way to look this up in-game, and it
meaningfully affects where and when the form is appropriate to use.
Instead, allow Maw to eat exactly living and plant enemies, which are
clearly circumscribed categories. (This also affects what you can be
mesmerised by, as they share the same criteria.)
Acid blobs surely cannot be more unhealthy to eat than tainted leviathans
were, after all.
commit cbb5ade2d1843e03b6b6ed2eee74573d6496034c
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 19:33:39 2026 -0330
Cap the duration of Maw regen at 40
This is still quite a lot of healing to be able to hold at once (but many
characters could previously stack far more than this at once in places like
Vaults)
commit 64aece269981cd94bd4ff0407d1beb62747cfa5a
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 14:10:12 2026 -0330
Tweak the HP of a few Slime monsters
Lower slymdra and shining eye HP, increase creeping plasmodium HP.
commit 5dd18ec61c79e1e65cfdd05f60e528ec681bf687
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 14:03:46 2026 -0330
Increase water nymph XP somewhat
Importantly, they were considered too trivial to Duel for many characters
who'd just entered Shoals, despite being one of the more notably dangerous
monsters within the branch.
In future, it might make sense to loosen Duel's restrictions (while a
little out of theme, the mechanical importance of preventing duelling weak
monsters is much less relevant now that you can't stall to heal by using
it, and with a default .rc it isn't even possible to know in advance what
monsters will be eligable without trying it - which can sometimes be too
late.)
(In future, it might also make sense to review monster XP values in
general, now that we're no longer so bound to accidents of old formulas,
but that is a much larger task.)
commit e745a072dd8154018f8730c3ec92baf49d5dfe93
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:32:27 2026 -0330
Nerf Bane of Multiplicity
It is now less likely to trigger and goes on cooldown for longer when it
does.
commit 38006e5a57052840c4b911fd7711e3e65e19a248
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:27:25 2026 -0330
Make Spiteful Blood a little more impactful
It is now more likely to trigger then before, have a bit more HP when it
does so, and also very slightly more damage.
commit c29d13b6fc2e257928678a0992985d78712ba0d5
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:16:10 2026 -0330
Fix spiteful blood's mutation description not displaying
commit 6429ade63d294af1085630f58a9fb45c5bd681f5
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:13:52 2026 -0330
Make Slick Slippers provide immunity to Grave Claw's -Move (Lici)
commit 988cdcb123d4cb538265a45a8d07f6ccb32e27b8
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:12:11 2026 -0330
Fix Vhi's being overly restrictive while mesmerised
It would prevent you from charging at an enemy if *their* position was
beyond where you were allowed to stand, rather than the position you'd end
up on after casting the spell. This could be doubly confusing since Vhi's
still often reports that 'one issue or another' is keeping you from moving.
Now you should be allowed to charge to any destination you'd otherwise be
allowed to move to while mesmerised/feared.
commit c6bc3c3f6de78bfb213936bd4f39bf0f945fab49
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 12:52:55 2026 -0330
Fix mesmerisation daze stacking on monsters (and gently lower duration)
Rather than stack up to a small cap, as intended, it could often decrease
the duration of an existing effect. Now it should properly stack up to 10
turns, but apply 0.5 turns less on average.
commit cfe2be61d58bb7905b1f9a74de00af04a9191dca
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 12:48:25 2026 -0330
Don't autopickup except when moving
The behaviour canonized by bbb4cc1 (ie: automatically picking up items at
one's feet as soon as performing an attack that killed the last visible
monster) had some potential concerns about rarely doing so in the midst of
a time-sensitive battle where known enemies were just around a corner. With
that in mind, I am reverting to the behavior prior to 90209b8 (ie: you have
to actually take a step (or autoexplore) before autopickup will attempt to
pick up anything the player is already standing on).
commit 42e68bc82df5145e4bcb2ee36b7cf4c896ed2088
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 12:38:39 2026 -0330
Fix star jellies sometimes not making stars
If a star jelly was wounded badly enough to hit the shooting star
threshold, but not killed, and then damaged again and killed before fineffs
fire, it wouldn't make any stars. (This could happen frequently with melee
attacks, which often include multiple packets of damage for auxes and
brands.)
Instead, cache the star jelly every time, just in case.
commit 182fdd2a8a62c5707e54d057ed171d1b0cf2068f
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 11:53:20 2026 -0330
Tweak slymdra splitting behavior
They can now split off slime creatures whenever they are out of sight of
their foe, without needing to be wandering first, and do so somewhat more
quickly.
Time passing off-level can now also cause them to split (though if the
player arrives in sight of them, they may rapidly merge up again - though
this at least costs them energy).
They now count as herd monsters (just like the slime creatures themselves),
so they will have leashing behavior with the rest of their band.
-----------------------------------------------------------------------
Summary of changes:
crawl-ref/source/beam.cc | 2 +-
crawl-ref/source/dat/descript/items.txt | 8 ++--
crawl-ref/source/dat/descript/mutations.txt | 10 ++--
crawl-ref/source/dat/forms/blade.yaml | 2 +-
crawl-ref/source/dat/forms/eel-hands.yaml | 4 +-
crawl-ref/source/dat/mons/creeping-plasmodium.yaml | 2 +-
crawl-ref/source/dat/mons/shining-eye.yaml | 2 +-
crawl-ref/source/dat/mons/slymdra.yaml | 4 +-
crawl-ref/source/dat/mons/water-nymph.yaml | 2 +-
crawl-ref/source/evoke.cc | 4 +-
crawl-ref/source/fineff.cc | 5 +-
crawl-ref/source/item-prop.cc | 2 +-
crawl-ref/source/l-item.cc | 55 ++++++++++++++++++---
crawl-ref/source/melee-attack.cc | 3 +-
crawl-ref/source/mon-abil.cc | 22 +++++----
crawl-ref/source/mon-abil.h | 2 +
crawl-ref/source/mon-cast.cc | 4 +-
crawl-ref/source/mon-util.cc | 2 +-
crawl-ref/source/mon-util.h | 2 +-
crawl-ref/source/movement.cc | 2 +-
crawl-ref/source/ouch.cc | 4 +-
crawl-ref/source/player.cc | 2 +-
crawl-ref/source/shopping.cc | 18 ++++---
crawl-ref/source/spl-transloc.cc | 56 +++++++++++-----------
crawl-ref/source/timed-effects.cc | 8 +++-
crawl-ref/source/transform.cc | 14 ++++--
crawl-ref/source/util/form-gen.py | 2 +-
crawl-ref/source/zap-data.h | 2 +-
28 files changed, 154 insertions(+), 91 deletions(-)
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index abf23de299..67cb113adf 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -4423,7 +4423,7 @@ void bolt::affect_player()
if (origin_spell == SPELL_THROW_BARBS && final_dam > 0)
barb_player(random_range(4, 8), 4);
- if (origin_spell == SPELL_GRAVE_CLAW)
+ if (origin_spell == SPELL_GRAVE_CLAW && !you.unrand_equipped(UNRAND_SLICK_SLIPPERS))
{
mpr("You are skewered in place!");
you.increase_duration(DUR_NO_MOMENTUM, random_range(2, 4));
diff --git a/crawl-ref/source/dat/descript/items.txt b/crawl-ref/source/dat/descript/items.txt
index c65eb2ca44..063c99019b 100644
--- a/crawl-ref/source/dat/descript/items.txt
+++ b/crawl-ref/source/dat/descript/items.txt
@@ -101,10 +101,10 @@ blade talisman
A jagged cluster of blades, almost impossible to grasp without injury. Causes
long, needle-thin blades to grow from the wearer's body, allowing them to
-perform rapid auxiliary melee attacks and even parry blows. The many fragments
-of metal inside the body reduces the effectiveness of body armour, but
-Shapeshifting skill mitigates and eventually eliminates the latter effect, as
-well as increasing damage dealt.
+perform rapid auxiliary melee attacks and even parry blows. Having so many
+fragments of metal inside one's body reduces the effectiveness of body armour,
+but Shapeshifting skill mitigates this effect as well as increases the damage
+dealt.
%%%%
book of air
diff --git a/crawl-ref/source/dat/descript/mutations.txt b/crawl-ref/source/dat/descript/mutations.txt
index 61e4cfa06d..6787a9d06e 100644
--- a/crawl-ref/source/dat/descript/mutations.txt
+++ b/crawl-ref/source/dat/descript/mutations.txt
@@ -507,7 +507,7 @@ Your body is covered in a fungus that metabolises beneficial potions you drink
and sometimes emits spores which transmit their effects to nearby monsters -
whether friend or foe.
%%%%
-spiteful blood
+spiteful blood mutation
Your blood pulses with a strange predatory malice. When you become significantly
injured, some of it may rise up to attack you - though this may not happen again
@@ -1142,13 +1142,13 @@ maw attack mutation
Your maw sometimes bites enemies in melee, at a rate independant of your own
attack speed (once per 15 aut, on average). Its base damage is directly
-increased by 3/4rd of your strength.
+increased by 75% of your strength.
%%%%
devouring maw mutation
-When you kill an edible enemy in melee (anything which drops a corpse), your
-maw devours it, greatly increasing your regeneration for a short while. More
-powerful enemies provide a longer duration of this effect.
+When you kill an edible enemy in melee (any hostile, non-summoned, living or
+plant monster), your maw devours it, greatly increasing your regeneration for a
+short while. More powerful enemies provide a longer duration of this effect.
%%%%
growling stomach mutation
diff --git a/crawl-ref/source/dat/forms/blade.yaml b/crawl-ref/source/dat/forms/blade.yaml
index 9299382e8e..ff93f23ed5 100644
--- a/crawl-ref/source/dat/forms/blade.yaml
+++ b/crawl-ref/source/dat/forms/blade.yaml
@@ -3,7 +3,7 @@ equivalent_mons: player
short_name: Blade
talisman: blade
skill: {min: 17, max: 25}
-body_ac_mult: {base: -70, scaling: 70}
+body_ac_mult: {base: -50, scaling: 30}
fakemuts:
- ["blade aux", "You can perform multiple auxiliary attacks with your blades."]
- ["blade parry", "You gain SH while attacking, based on your slaying."]
diff --git a/crawl-ref/source/dat/forms/eel-hands.yaml b/crawl-ref/source/dat/forms/eel-hands.yaml
index 943ecd1d4b..d25e152197 100644
--- a/crawl-ref/source/dat/forms/eel-hands.yaml
+++ b/crawl-ref/source/dat/forms/eel-hands.yaml
@@ -6,11 +6,11 @@ talisman: eel
skill: {min: 12, max: 20}
melds: [held, gloves]
resists: {elec: 1}
-unarmed: {base: 5, scaling: 5}
+unarmed: {base: 3, scaling: 4}
unarmed_colour: lightcyan
unarmed_verbs: [hit, punch, bite, thrash]
offhand_punch: yes
-special_damage: 1d2+5/2
+special_damage: 1d-2+23/10
special_damage_name: Jolt damage
fakemuts:
- ["eel punch", "Electricity sometimes discharges through enemies you attack."]
diff --git a/crawl-ref/source/dat/mons/creeping-plasmodium.yaml b/crawl-ref/source/dat/mons/creeping-plasmodium.yaml
index 18b2eb7ffe..4679e47694 100644
--- a/crawl-ref/source/dat/mons/creeping-plasmodium.yaml
+++ b/crawl-ref/source/dat/mons/creeping-plasmodium.yaml
@@ -7,7 +7,7 @@ genus: jelly
will: 160
attacks:
hd: 10
-hp_10x: 750
+hp_10x: 980
ac: 17
ev: 3
intelligence: brainless
diff --git a/crawl-ref/source/dat/mons/shining-eye.yaml b/crawl-ref/source/dat/mons/shining-eye.yaml
index c118e3c21d..b0b2f5eaac 100644
--- a/crawl-ref/source/dat/mons/shining-eye.yaml
+++ b/crawl-ref/source/dat/mons/shining-eye.yaml
@@ -7,7 +7,7 @@ genus: floating_eye
will: 100
attacks:
hd: 10
-hp_10x: 700
+hp_10x: 580
ac: 3
ev: 1
spells: shining_eye
diff --git a/crawl-ref/source/dat/mons/slymdra.yaml b/crawl-ref/source/dat/mons/slymdra.yaml
index f7d9d3f9c7..d7a38613e7 100644
--- a/crawl-ref/source/dat/mons/slymdra.yaml
+++ b/crawl-ref/source/dat/mons/slymdra.yaml
@@ -1,6 +1,6 @@
name: "slymdra"
glyph: {char: "J", colour: magenta}
-flags: [eat_doors, see_invis, unblindable, amorphous, no_skeleton, fast_regen]
+flags: [eat_doors, see_invis, unblindable, amorphous, no_skeleton, fast_regen, herd]
resists: {poison: 1, corr: 3}
exp: 3100
genus: jelly
@@ -8,7 +8,7 @@ will: 120
attacks:
- {type: hit, flavour: acid, damage: 33}
hd: 18
-hp_10x: 700
+hp_10x: 400
ac: 10
ev: 3
intelligence: brainless
diff --git a/crawl-ref/source/dat/mons/water-nymph.yaml b/crawl-ref/source/dat/mons/water-nymph.yaml
index 0020be8558..389f647f08 100644
--- a/crawl-ref/source/dat/mons/water-nymph.yaml
+++ b/crawl-ref/source/dat/mons/water-nymph.yaml
@@ -1,7 +1,7 @@
name: "water nymph"
glyph: {char: "m", colour: magenta}
flags: [speaks, warm_blood]
-exp: 444
+exp: 660
will: 100
attacks:
- {type: touch, flavour: drown, damage: 12}
diff --git a/crawl-ref/source/evoke.cc b/crawl-ref/source/evoke.cc
index 5559f6b354..65d01b0608 100644
--- a/crawl-ref/source/evoke.cc
+++ b/crawl-ref/source/evoke.cc
@@ -1400,8 +1400,8 @@ int stardust_orb_max(bool max)
int stardust_orb_power(int mp_spent, bool max_evo)
{
- const int skill = max_evo ? 108 : you.skill(SK_EVOCATIONS, 4);
- int pow = (skill + 15) * (100 + (mp_spent * 25)) / 100;
+ const int skill = max_evo ? 81 : you.skill(SK_EVOCATIONS, 3);
+ int pow = (skill + 10) * (100 + (mp_spent * 25)) / 100;
return pow;
}
diff --git a/crawl-ref/source/fineff.cc b/crawl-ref/source/fineff.cc
index 24d0755b45..a9bc1b4433 100644
--- a/crawl-ref/source/fineff.cc
+++ b/crawl-ref/source/fineff.cc
@@ -524,8 +524,9 @@ public:
: final_effect(agent, nullptr, you.pos()), power(_power), max_stars(_max),
is_star_jelly(_is_star_jelly)
{
- // If this is a star jelly who just got smashed, cache it.
- if (agent->is_monster() && !agent->alive())
+ // If this is a star jelly, cache it (even if it's not dead yet; since
+ // it may die to further damage events within the same attack action.)
+ if (is_star_jelly)
env.final_effect_monster_cache.push_back(*agent->as_monster());
}
protected:
diff --git a/crawl-ref/source/item-prop.cc b/crawl-ref/source/item-prop.cc
index bbf3591d34..dd29d97886 100644
--- a/crawl-ref/source/item-prop.cc
+++ b/crawl-ref/source/item-prop.cc
@@ -236,7 +236,7 @@ static const armour_def Armour_prop[] =
// Note: shields use ac-value as sh-value, EV pen is used as the basis
// to calculate adjusted shield penalty.
- { ARM_ORB, "orb", 0, 0, 150,
+ { ARM_ORB, "orb", 0, 0, 40,
SLOT_OFFHAND, SIZE_LITTLE, SIZE_GIANT, true, 0, {
{ SPARM_GLASS, 1 },
{ SPARM_MAYHEM, 1 },
diff --git a/crawl-ref/source/l-item.cc b/crawl-ref/source/l-item.cc
index f6171d20fc..36faf37743 100644
--- a/crawl-ref/source/l-item.cc
+++ b/crawl-ref/source/l-item.cc
@@ -1240,19 +1240,19 @@ static int l_item_letter_to_index(lua_State *ls)
return 1;
}
-/*** Swap item slots.
+/*** Swap gear slots.
* Requires item indexes, use @{letter_to_index} if you want to swap letters.
* @tparam int idx1
* @tparam int idx2
- * @function swap_slots
+ * @function swap_gear_slots
*/
-static int l_item_swap_slots(lua_State *ls)
+static int l_item_swap_gear_slots(lua_State *ls)
{
int slot1 = luaL_safe_checkint(ls, 1),
slot2 = luaL_safe_checkint(ls, 2);
bool verbose = lua_toboolean(ls, 3);
- if (slot1 < 0 || slot1 >= ENDOFPACK
- || slot2 < 0 || slot2 >= ENDOFPACK
+ if (slot1 < 0 || slot1 >= MAX_GEAR
+ || slot2 < 0 || slot2 >= MAX_GEAR
|| slot1 == slot2 || !you.inv[slot1].defined())
{
return 0;
@@ -1263,6 +1263,48 @@ static int l_item_swap_slots(lua_State *ls)
return 0;
}
+/*** Swap consumable slots.
+ * @tparam string The category of item ('potion', 'scroll', or 'evocable')
+ * @tparam string letter 1
+ * @tparam string letter 2
+ * @function swap_consumable_slots
+ */
+static int l_item_swap_consumable_slots(lua_State *ls)
+{
+ const string &s = luaL_checkstring(ls, 1);
+
+ int sel_type = OSEL_ANY;
+ if (s == "potion")
+ sel_type = OBJ_POTIONS;
+ else if (s == "scroll")
+ sel_type = OBJ_SCROLLS;
+ else if (s == "evocable")
+ sel_type = OSEL_EVOKABLE;
+ // Not a valid category.
+ else
+ return 0;
+
+ const string &letter1 = luaL_checkstring(ls, 2);
+ const string &letter2 = luaL_checkstring(ls, 3);
+
+ // Not valid letters.
+ if (letter1.empty() || letter2.empty() || !isaalpha(letter1[0]) || !isaalpha(letter2[0]))
+ return 0;
+
+ for (int i = MAX_GEAR; i < ENDOFPACK; ++i)
+ {
+ if (you.inv[i].defined()
+ && (you.inv[i].base_type == sel_type || item_is_selected(you.inv[i], sel_type))
+ && you.inv[i].slot == letter1[0])
+ {
+ swap_inv_slots(you.inv[i], letter_to_index(letter2[0]), lua_toboolean(ls, 4));
+ break;
+ }
+ }
+
+ return 0;
+}
+
static item_def *dmx_get_item(lua_State *ls, int ndx, int subndx)
{
if (lua_istable(ls, ndx))
@@ -1808,7 +1850,8 @@ static const struct luaL_Reg item_lib[] =
{ "inventory", l_item_inventory },
{ "letter_to_index", l_item_letter_to_index },
{ "index_to_letter", l_item_index_to_letter },
- { "swap_slots", l_item_swap_slots },
+ { "swap_gear_slots", l_item_swap_gear_slots },
+ { "swap_consumable_slots", l_item_swap_consumable_slots },
{ "pickup", l_item_pickup },
{ "equipped_at", l_item_equipped_at },
{ "slot_is_available", l_slot_is_available },
diff --git a/crawl-ref/source/melee-attack.cc b/crawl-ref/source/melee-attack.cc
index eb86251b51..f45a166e52 100644
--- a/crawl-ref/source/melee-attack.cc
+++ b/crawl-ref/source/melee-attack.cc
@@ -1175,7 +1175,8 @@ static void _devour(monster &victim)
you.duration[DUR_ENGORGED] += 10 + random_range(victim.get_experience_level() * 10 / 3,
victim.get_experience_level() * 20 / 3);
-
+ if (you.duration[DUR_ENGORGED] > 400)
+ you.duration[DUR_ENGORGED] = 400;
}
diff --git a/crawl-ref/source/mon-abil.cc b/crawl-ref/source/mon-abil.cc
index e09e1d5303..0cfdf4da60 100644
--- a/crawl-ref/source/mon-abil.cc
+++ b/crawl-ref/source/mon-abil.cc
@@ -612,8 +612,10 @@ bool slime_creature_polymorph(monster& slime, poly_power_type power)
return monster_polymorph(&slime, RANDOM_POLYMORPH_MONSTER, power);
}
-static int _slymdra_split(monster& slymdra, int count = -1, bool quiet = false)
+int slymdra_split(monster& slymdra, int count, bool quiet)
{
+ ASSERT(slymdra.type == MONS_SLYMDRA);
+
int num_splits = 0;
int& fake_heads = slymdra.props[SLYMDRA_FAKE_HEADS_KEY].get_int();
int& real_slimes = slymdra.props[SLYMDRA_SLIMES_EATEN_KEY].get_int();
@@ -637,7 +639,7 @@ static int _slymdra_split(monster& slymdra, int count = -1, bool quiet = false)
}
// If we've split out as many things as we want or as many as we *can*, return.
- if (++num_splits == count || real_slimes == 0 && fake_heads == 0)
+ if (++num_splits >= count || real_slimes == 0 && fake_heads == 0)
return num_splits;
}
}
@@ -649,7 +651,7 @@ static int _slymdra_split(monster& slymdra, int count = -1, bool quiet = false)
bool slymdra_polymorph(monster& slymdra, poly_power_type power)
{
ASSERT(slymdra.type == MONS_SLYMDRA);
- int count = _slymdra_split(slymdra, -1, true);
+ int count = slymdra_split(slymdra, -1, true);
if (you.can_see(slymdra) && count > 0)
{
@@ -1117,16 +1119,16 @@ static bool _slymdra_try_merge(monster* mons)
static bool _slymdra_split_or_merge(monster* mons)
{
- if (mons->behaviour == BEH_SEEK)
+ const actor* foe = mons->get_foe();
+ if (mons->behaviour == BEH_SEEK
+ && foe && mons->see_cell_no_trans(foe->pos()) && coinflip())
{
- const actor* foe = mons->get_foe();
- if (foe && mons->see_cell_no_trans(foe->pos()) && coinflip())
- return _slymdra_try_merge(mons);
+ return _slymdra_try_merge(mons);
}
- else if (mons->behaviour == BEH_WANDER && mons->num_heads > 4
- && one_chance_in(15))
+ else if (mons->num_heads > 4
+ && (!foe || !mons->see_cell(foe->pos())) && one_chance_in(10))
{
- return _slymdra_split(*mons, 1);
+ return slymdra_split(*mons, 1);
}
return false;
diff --git a/crawl-ref/source/mon-abil.h b/crawl-ref/source/mon-abil.h
index 01c838fec3..967736b003 100644
--- a/crawl-ref/source/mon-abil.h
+++ b/crawl-ref/source/mon-abil.h
@@ -51,3 +51,5 @@ void solar_ember_blast();
void activate_tesseracts();
void tesseract_action(monster& mon);
+
+int slymdra_split(monster& slymdra, int count = -1, bool quiet = false);
diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc
index b7921cde3a..971b1ee12a 100644
--- a/crawl-ref/source/mon-cast.cc
+++ b/crawl-ref/source/mon-cast.cc
@@ -6031,11 +6031,11 @@ static void _mesmerise_los(monster& agent, int power, bool check_hearing)
}
if (!mons->has_ench(ENCH_DAZED))
- mons->add_ench(mon_enchant(ENCH_DAZED, &agent, random_range(50, 90)));
+ mons->add_ench(mon_enchant(ENCH_DAZED, &agent, random_range(50, 80)));
else
{
mon_enchant dazed = mons->get_ench(ENCH_DAZED);
- dazed.duration = min(120, random_range(50, 90));
+ dazed.duration = max(dazed.duration, min(100, dazed.duration + random_range(50, 80)));
mons->update_ench(dazed);
}
}
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 4d3325b3f3..1d7e654694 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -2003,7 +2003,7 @@ mon_attack_def mons_attack_spec(const monster& m, int attk_number,
attk.damage = 2 + (m.get_hit_dice() * 3 / 2);
}
else if (mon.type == MONS_ERYTHROSPITE)
- attk.damage = 3 + m.get_experience_level();
+ attk.damage = 3 + m.get_experience_level() * 10 / 9;
// Vampires get a bite aux in addition to normal attacks.
if (mon.has_ench(ENCH_VAMPIRE_THRALL)
diff --git a/crawl-ref/source/mon-util.h b/crawl-ref/source/mon-util.h
index c13fb4f345..a36cafbfb9 100644
--- a/crawl-ref/source/mon-util.h
+++ b/crawl-ref/source/mon-util.h
@@ -191,7 +191,7 @@ static inline int get_resist(resists_t all, mon_resist_flags res)
return v;
}
-constexpr int SLYMDRA_HP_PER_HEAD = 30;
+constexpr int SLYMDRA_HP_PER_HEAD = 27;
dungeon_feature_type preferred_feature_type(monster_type mt);
diff --git a/crawl-ref/source/movement.cc b/crawl-ref/source/movement.cc
index 55fb71387f..99315559f4 100644
--- a/crawl-ref/source/movement.cc
+++ b/crawl-ref/source/movement.cc
@@ -1105,6 +1105,6 @@ void move_player_action(coord_def move)
crawl_state.cancel_cmd_repeat();
}
- if (you.pos() != initial_pos || i_feel_safe())
+ if (you.pos() != initial_pos)
request_autopickup();
}
diff --git a/crawl-ref/source/ouch.cc b/crawl-ref/source/ouch.cc
index 8f4e469250..3459ba1c40 100644
--- a/crawl-ref/source/ouch.cc
+++ b/crawl-ref/source/ouch.cc
@@ -1023,13 +1023,13 @@ static void _maybe_trigger_spiteful_blood()
// the player gets a reprieve until the next battle.
you.duration[DUR_SPITEFUL_BLOOD_COOLDOWN] = 1;
- if (!one_chance_in(4))
+ if (!x_chance_in_y(2, 5))
return;
mgen_data mg(MONS_ERYTHROSPITE, BEH_HOSTILE, you.pos(), MHITYOU, MG_NONE);
mg.set_summoned(&you, MON_SUMM_SPITEFUL_BLOOD, random_range(18, 26) * BASELINE_DELAY, false).set_range(1, 3);
mg.hd = pow(you.experience_level, 1.1);
- mg.hp = 5 + pow(you.experience_level, 1.25);
+ mg.hp = 5 + pow(you.experience_level, 1.35) * 5 / 4;
const int num = you.get_mutation_level(MUT_SPITEFUL_BLOOD);
bool made_mon = false;
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 233e7c5ddc..432ab7f622 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -1990,7 +1990,7 @@ int player_parrying()
sh += 10 * you.wearing_ego(OBJ_WEAPONS, SPWPN_REBUKE);
if (you.form == transformation::blade)
- sh += get_form()->get_effect_size() + you.slaying();
+ sh += get_form()->get_effect_size() + max(0, you.slaying());
return sh;
}
diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc
index 5f6b144204..b06d65869c 100644
--- a/crawl-ref/source/shopping.cc
+++ b/crawl-ref/source/shopping.cc
@@ -362,6 +362,15 @@ unsigned int item_value(item_def item, bool ident)
valued += 250;
break;
+ case SPARM_GLASS:
+ case SPARM_PYROMANIA:
+ case SPARM_STARDUST:
+ case SPARM_MESMERISM:
+ case SPARM_GUILE:
+ case SPARM_ATTUNEMENT:
+ valued += 200;
+ break;
+
case SPARM_ICE:
case SPARM_FIRE:
case SPARM_AIR:
@@ -392,11 +401,7 @@ unsigned int item_value(item_def item, bool ident)
case SPARM_LIGHT:
case SPARM_ENERGY:
case SPARM_PARRYING:
- case SPARM_GLASS:
- case SPARM_PYROMANIA:
- case SPARM_STARDUST:
- case SPARM_MESMERISM:
- case SPARM_GUILE:
+ case SPARM_MAYHEM:
valued += 50;
break;
@@ -407,7 +412,6 @@ unsigned int item_value(item_def item, bool ident)
case SPARM_SPIRIT_SHIELD:
case SPARM_HARM:
case SPARM_RAGE:
- case SPARM_MAYHEM:
valued += 20;
break;
@@ -769,7 +773,7 @@ unsigned int item_value(item_def item, bool ident)
{
int level = spell_difficulty(static_cast<spell_type>(item.plus));
// more expensive per spell than books
- valued = level * level * 7 + 33;
+ valued = level * level * 6 + 34;
}
#if TAG_MAJOR_VERSION == 34
else if (book == BOOK_BUGGY_DESTRUCTION)
diff --git a/crawl-ref/source/spl-transloc.cc b/crawl-ref/source/spl-transloc.cc
index 435b324183..b3694e537b 100644
--- a/crawl-ref/source/spl-transloc.cc
+++ b/crawl-ref/source/spl-transloc.cc
@@ -578,34 +578,6 @@ bool valid_electric_charge_target(const actor& agent, coord_def target, string*
return false;
}
- // The remaining checks concern only the player.
- if (agent.is_monster())
- return true;
-
- const monster* beholder = you.get_beholder(target);
- if (beholder)
- {
- if (fail_reason)
- {
- *fail_reason = make_stringf("You cannot charge away from %s!",
- beholder->name(DESC_THE, true).c_str());
- }
-
- return false;
- }
-
- const monster* fearmonger = you.get_fearmonger(target);
- if (fearmonger)
- {
- if (fail_reason)
- {
- *fail_reason = make_stringf("You cannot charge closer to %s!",
- fearmonger->name(DESC_THE, true).c_str());
- }
-
- return false;
- }
-
return true;
}
@@ -660,6 +632,34 @@ coord_def get_electric_charge_landing_spot(const actor& agent, coord_def target,
return coord_def(0, 0);
}
+ // Check that the player is allowed to move to the landing spot.
+ if (agent.is_player())
+ {
+ const monster* beholder = you.get_beholder(ray.pos());
+ if (beholder)
+ {
+ if (fail_reason)
+ {
+ *fail_reason = make_stringf("You cannot charge away from %s!",
+ beholder->name(DESC_THE, true).c_str());
+ }
+
+ return coord_def(0, 0);
+ }
+
+ const monster* fearmonger = you.get_fearmonger(ray.pos());
+ if (fearmonger)
+ {
+ if (fail_reason)
+ {
+ *fail_reason = make_stringf("You cannot charge closer to %s!",
+ fearmonger->name(DESC_THE, true).c_str());
+ }
+
+ return coord_def(0, 0);
+ }
+ }
+
// We've already verified that our target is okay, and now we know
// that our landing spot is also. So we should be done here.
return ray.pos();
diff --git a/crawl-ref/source/timed-effects.cc b/crawl-ref/source/timed-effects.cc
index a655af24f3..eabda48069 100644
--- a/crawl-ref/source/timed-effects.cc
+++ b/crawl-ref/source/timed-effects.cc
@@ -30,6 +30,7 @@
#include "message.h"
#include "mgen-data.h"
#include "monster.h"
+#include "mon-abil.h"
#include "mon-behv.h"
#include "mon-clone.h"
#include "mon-death.h"
@@ -320,7 +321,7 @@ static void _bane_triggers(int /*time_delta*/)
{
if (you.has_bane(BANE_MULTIPLICITY)
&& you.elapsed_time > you.props[MULTIPLICITY_TIME_KEY].get_int()
- && coinflip())
+ && one_chance_in(3))
{
vector<monster*> to_clone;
for (monster_near_iterator mi(you.pos(), LOS_NO_TRANS); mi; ++mi)
@@ -356,7 +357,7 @@ static void _bane_triggers(int /*time_delta*/)
// Apply cooldown.
if (did_clone)
- you.props[MULTIPLICITY_TIME_KEY] = you.elapsed_time + random_range(150, 400);
+ you.props[MULTIPLICITY_TIME_KEY] = you.elapsed_time + random_range(270, 600);
if (seen)
{
@@ -661,6 +662,9 @@ monster* update_monster(monster& mon, int time)
mon.heal(div_rand_round(time * mon.off_level_regen_rate(), 1000));
mon.timeout_enchantments(time);
+ if (mon.type == MONS_SLYMDRA)
+ slymdra_split(mon, min(div_rand_round(time, 10), mon.num_heads - 4), true);
+
return &mon;
}
diff --git a/crawl-ref/source/transform.cc b/crawl-ref/source/transform.cc
index 8ac1882b96..61c1e19788 100644
--- a/crawl-ref/source/transform.cc
+++ b/crawl-ref/source/transform.cc
@@ -377,7 +377,12 @@ dice_def Form::get_special_damage(bool random, int skill) const
skill = get_level(1);
if (special_dice)
- return (*special_dice)(skill, random);
+ {
+ dice_def dmg = (*special_dice)(skill, random);
+ if (dmg.size <= 0)
+ dmg.size = 1;
+ return dmg;
+ }
else
return dice_def();
}
@@ -652,13 +657,13 @@ public:
int get_aux_damage(bool random, int skill) const override
{
- return scaling_value(FormScaling().Base(10).Scaling(8), skill, random);
+ return scaling_value(FormScaling().Base(10).Scaling(6), skill, random);
}
// Base parrying bonus
int get_effect_size(int skill = -1) const override
{
- return max(0, scaling_value(FormScaling().Base(8).Scaling(8), skill));
+ return max(0, scaling_value(FormScaling().Base(6).Scaling(6), skill));
}
};
@@ -2545,7 +2550,8 @@ monster* get_solar_ember()
bool maw_considers_appetising(const monster& mon)
{
- return mons_class_can_leave_corpse(mons_species(mon.type))
+ return (mon.holiness() & (MH_NATURAL | MH_PLANT))
+ && !mon.is_firewood()
&& !mon.is_summoned()
&& !(mon.flags & MF_HARD_RESET);
}
diff --git a/crawl-ref/source/util/form-gen.py b/crawl-ref/source/util/form-gen.py
index d90dc3c853..195ecfa80d 100644
--- a/crawl-ref/source/util/form-gen.py
+++ b/crawl-ref/source/util/form-gen.py
@@ -298,7 +298,7 @@ def parse_dice(s):
for i in range(0, 4):
if len(arg_str) > i:
- args[i] = parse_num(int(arg_str[i].strip()), 0, 1000)
+ args[i] = parse_num(int(arg_str[i].strip()), -100, 1000)
return DiceDef(args[0], args[1], args[2], args[3])
diff --git a/crawl-ref/source/zap-data.h b/crawl-ref/source/zap-data.h
index db9562a3bf..507ea47389 100644
--- a/crawl-ref/source/zap-data.h
+++ b/crawl-ref/source/zap-data.h
@@ -1929,7 +1929,7 @@ _mon_hex_zap(ZAP_VITRIFY, BEAM_VITRIFY),
"umbral torchlight",
new dicedef_calculator<3, 7, 1, 5>,
new tohit_calculator<40>,
- new dicedef_calculator<3, 6, 1, 10>,
+ new dicedef_calculator<3, 3, 1, 10>,
new tohit_calculator<40>,
CYAN,
false,
--
Dungeon Crawl Stone Soup
|