summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/externs.h1
-rw-r--r--crawl-ref/source/fight.cc5
-rw-r--r--crawl-ref/source/mon-util.cc5
-rw-r--r--crawl-ref/source/monstuff.cc9
4 files changed, 16 insertions, 4 deletions
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index 108a168057..e5ab195f50 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -943,6 +943,7 @@ public:
bool alive() const;
coord_def pos() const;
bool swimming() const;
+ bool can_drown() const;
bool floundering() const;
size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;
int damage_type(int attk = -1);
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 1e99499072..dc5c27120a 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -2767,10 +2767,11 @@ void melee_attack::mons_apply_attack_flavour(const mon_attack_def &attk)
special_damage = special_damage * 2 / 3;
if (needs_message && special_damage)
- mprf("%s %s %s!",
+ mprf("%s %s %s%s",
attacker->name(DESC_CAP_THE).c_str(),
attacker->conj_verb("shock").c_str(),
- defender->name(DESC_NOCAP_THE).c_str());
+ defender->name(DESC_NOCAP_THE).c_str(),
+ special_attack_punctuation().c_str());
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Shock damage: %d", special_damage);
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 95248327be..11db414ebf 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -2477,6 +2477,11 @@ bool monsters::floundering() const
&& !mons_flies(this));
}
+bool monsters::can_drown() const
+{
+ return (!mons_res_asphyx(this));
+}
+
size_type monsters::body_size(int /* psize */, bool /* base */) const
{
const monsterentry *e = seekmonster(type);
diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc
index 5d4e560337..34d0b9914e 100644
--- a/crawl-ref/source/monstuff.cc
+++ b/crawl-ref/source/monstuff.cc
@@ -2433,6 +2433,8 @@ static bool handle_potion(struct monsters *monster, bolt & beem)
{
monster->del_ench(ENCH_POISON);
monster->del_ench(ENCH_SICK);
+ monster->del_ench(ENCH_CONFUSION);
+ monster->del_ench(ENCH_ROT);
}
imbibed = true;
@@ -4239,7 +4241,7 @@ void mons_check_pool(monsters *mons, int killer)
if (lev == 2 || (lev && !mons->paralysed()))
return;
- const int grid = grd(mons->pos());
+ int grid = grd(mons->pos());
if ((grid == DNGN_LAVA || grid == DNGN_DEEP_WATER)
&& !monster_habitable_grid(mons, grid))
{
@@ -4252,9 +4254,12 @@ void mons_check_pool(monsters *mons, int killer)
ptr_monam(mons, DESC_CAP_THE),
(grid == DNGN_LAVA ? "lava" : "water"));
+ if (grid == DNGN_LAVA && mons_res_fire(mons) > 0)
+ grid = DNGN_DEEP_WATER;
+
// Even fire resistant monsters perish in lava, but undead can survive
// deep water.
- if (grid == DNGN_LAVA || mons->holiness() != MH_UNDEAD)
+ if (grid == DNGN_LAVA || mons->can_drown())
{
if (message)
{