|
From: <gi...@cr...> - 2026-01-27 18:20:16
|
via ca6055191c83898cadaa7cd32daeaea88d3ef185 (commit)
via b54ea9f56533a0914f47055246d0a125d9092e1b (commit)
via 87b91cedfdbc5aa45a5e7dd1c3d6b1e3ac64c4da (commit)
via 5ca34f96d4fa749dc255b3a008bd25461c79a357 (commit)
via 23091ee04aa76578fd9500361704dae75fd2deb4 (commit)
via 832111514633c093a67376db88e1c8462271246f (commit)
via 715986b9a4406d8b76fe501274d93a585da4dd64 (commit)
via 6389ac65aa3632fb9711b77417a78272aa3055d1 (commit)
via 7712bfe8dea8d18879e3e7b1db16fdc82825d5f9 (commit)
via a12834e61fcf417bd011c3efd8c9875de98bf56a (commit)
via effeaa37636867afc595aa0ce7a5759112fb4c76 (commit)
via ca812756a5ecdd7768a80e0f94178aded6aa062d (commit)
via 30fa3f96caa51f17f257746ef97b503947edfd22 (commit)
via 8a1b03b673003b8d9a6a98c7a7616beffc1f7dcb (commit)
via 2731a55e829ac0fc601020e481f2390ed7fe5537 (commit)
via b77665ff79bb83351161e7df99893f6ec4bcad4a (commit)
via cde0a2ff41a89e82cf3ec8aea9ad6f91202cc362 (commit)
via ed45ffe0fa28e01514be9829d543cd4b391c809e (commit)
via 176d2a21be9dd9f07f785fab6253f4854e8451df (commit)
via f4267a8a476fb65e400daae4bdd9733b310d70af (commit)
via 6f8043d9b54a953a0c90d85912e8df3afe78cf78 (commit)
from 2976efafa4b088458e9a2d68b6edb28e3e609094 (commit)
-----------------------------------------------------------------------
commit ca6055191c83898cadaa7cd32daeaea88d3ef185
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 b54ea9f56533a0914f47055246d0a125d9092e1b
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 87b91cedfdbc5aa45a5e7dd1c3d6b1e3ac64c4da
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 5ca34f96d4fa749dc255b3a008bd25461c79a357
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 23091ee04aa76578fd9500361704dae75fd2deb4
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 832111514633c093a67376db88e1c8462271246f
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 715986b9a4406d8b76fe501274d93a585da4dd64
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 6389ac65aa3632fb9711b77417a78272aa3055d1
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 19:45:00 2026 -0330
Fix a typo (roxie puddles)
commit 7712bfe8dea8d18879e3e7b1db16fdc82825d5f9
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 a12834e61fcf417bd011c3efd8c9875de98bf56a
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 effeaa37636867afc595aa0ce7a5759112fb4c76
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 ca812756a5ecdd7768a80e0f94178aded6aa062d
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 30fa3f96caa51f17f257746ef97b503947edfd22
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 8a1b03b673003b8d9a6a98c7a7616beffc1f7dcb
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 2731a55e829ac0fc601020e481f2390ed7fe5537
Author: DracoOmega <dra...@gm...>
Date: Mon Jan 26 13:16:10 2026 -0330
Fix spiteful blood's mutation description not displaying
commit b77665ff79bb83351161e7df99893f6ec4bcad4a
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 cde0a2ff41a89e82cf3ec8aea9ad6f91202cc362
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 ed45ffe0fa28e01514be9829d543cd4b391c809e
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 176d2a21be9dd9f07f785fab6253f4854e8451df
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 f4267a8a476fb65e400daae4bdd9733b310d70af
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 6f8043d9b54a953a0c90d85912e8df3afe78cf78
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
|