summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authordolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2008-04-26 03:05:13 +0000
committerdolorous <dolorous@c06c8d41-db1a-0410-9941-cceddc491573>2008-04-26 03:05:13 +0000
commitd16ed1201876132b39d151da6877de997da67912 (patch)
tree30e5d1df643776b9486d0dd0ea0ef123da68e003 /crawl-ref
parent537e2fe2876ff141f926d946f1c9ed2fba85c714 (diff)
downloadcrawl-ref-d16ed1201876132b39d151da6877de997da67912.tar.gz
crawl-ref-d16ed1201876132b39d151da6877de997da67912.zip
Generalize the routines to determine whether you or a monster can mutate
or mutate safely by moving them to the actor interface. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4650 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/externs.h6
-rw-r--r--crawl-ref/source/mon-util.cc12
-rw-r--r--crawl-ref/source/mutation.cc8
-rw-r--r--crawl-ref/source/mutation.h2
-rw-r--r--crawl-ref/source/player.cc16
-rw-r--r--crawl-ref/source/religion.cc2
-rw-r--r--crawl-ref/source/xom.cc6
7 files changed, 37 insertions, 15 deletions
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h
index c37fc842b6..b9aa5700c5 100644
--- a/crawl-ref/source/externs.h
+++ b/crawl-ref/source/externs.h
@@ -147,6 +147,8 @@ public:
virtual bool can_see(const actor *target) const = 0;
virtual bool is_icy() const = 0;
virtual void go_berserk(bool intentional) = 0;
+ virtual bool can_mutate() const = 0;
+ virtual bool can_safely_mutate() const = 0;
virtual void mutate() = 0;
virtual int hurt(const actor *attacker, int amount) = 0;
virtual void heal(int amount, bool max_too = false) = 0;
@@ -839,6 +841,8 @@ public:
bool can_go_berserk() const;
bool can_go_berserk(bool verbose) const;
void go_berserk(bool intentional);
+ bool can_mutate() const;
+ bool can_safely_mutate() const;
void mutate();
void banish(const std::string &who = "");
void blink();
@@ -1161,6 +1165,8 @@ public:
void attacking(actor *other);
bool can_go_berserk() const;
void go_berserk(bool intentional);
+ bool can_mutate() const;
+ bool can_safely_mutate() const;
void mutate();
void banish(const std::string &who = "");
void expose_to_element(beam_type element, int strength = 0);
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 6f901a3c72..71a5207e36 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -5431,9 +5431,19 @@ bool monsters::can_see(const actor *target) const
return (num_feats_between(x, y, tx, ty, DNGN_UNSEEN, DNGN_MAXOPAQUE) == 0);
}
+bool monsters::can_mutate() const
+{
+ return (holiness() == MH_NATURAL);
+}
+
+bool monsters::can_safely_mutate() const
+{
+ return (can_mutate());
+}
+
void monsters::mutate()
{
- if (holiness() != MH_NATURAL)
+ if (!can_mutate())
return;
monster_polymorph(this, RANDOM_MONSTER);
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index 82b4ee4377..8bd3a1e769 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -1039,14 +1039,6 @@ static bool _mutation_is_fully_inactive(mutation_type mut)
&& !you.demon_pow[mut] && !mutation_defs[mut].physical);
}
-// Can the player mutate without decomposing?
-bool can_safely_mutate()
-{
- return (!you.is_undead
- || (you.is_undead == US_SEMI_UNDEAD
- && you.hunger_state == HS_ENGORGED));
-}
-
formatted_string describe_mutations()
{
std::string result;
diff --git a/crawl-ref/source/mutation.h b/crawl-ref/source/mutation.h
index 6074cc1913..a91bce44d8 100644
--- a/crawl-ref/source/mutation.h
+++ b/crawl-ref/source/mutation.h
@@ -47,8 +47,6 @@ void display_mutations();
bool mutation_is_fully_active(mutation_type mut);
-bool can_safely_mutate();
-
formatted_string describe_mutations();
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 4687203d10..84ccd266c6 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -6445,8 +6445,24 @@ bool player::haloed() const
return (halo_radius());
}
+bool player::can_mutate() const
+{
+ return true;
+}
+
+bool player::can_safely_mutate() const
+{
+ return (can_mutate()
+ && (!you.is_undead
+ || (you.is_undead == US_SEMI_UNDEAD
+ && you.hunger_state == HS_ENGORGED)));
+}
+
void player::mutate()
{
+ if (!can_mutate())
+ return;
+
if (one_chance_in(5))
{
if (::mutate(RANDOM_MUTATION))
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 237667a8d0..b5f0c233df 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -2969,7 +2969,7 @@ static bool _zin_retribution()
// if little mutated or can't safely unmutate, do something else
if (punishment < 2 && how_mutated() <= random2(3)
- || !can_safely_mutate())
+ || !you.can_safely_mutate())
{
punishment = random2(8)+2;
}
diff --git a/crawl-ref/source/xom.cc b/crawl-ref/source/xom.cc
index e0e457765b..0c64e935c6 100644
--- a/crawl-ref/source/xom.cc
+++ b/crawl-ref/source/xom.cc
@@ -416,7 +416,7 @@ bool there_are_monsters_nearby()
static bool choose_mutatable_monster(const monsters* mon)
{
- return (mon->alive() && mons_holiness(mon) == MH_NATURAL
+ return (mon->alive() && mon->can_safely_mutate()
&& !mons_is_submerged(mon));
}
@@ -626,7 +626,7 @@ static bool xom_is_good(int sever)
}
else if (random2(sever) <= 9)
{
- if (!can_safely_mutate())
+ if (!you.can_safely_mutate())
goto try_again;
god_speaks(GOD_XOM, _get_xom_speech("good mutations"));
@@ -758,7 +758,7 @@ static bool xom_is_bad(int sever)
}
else if (random2(sever) <= 6)
{
- if (!can_safely_mutate())
+ if (!you.can_safely_mutate())
goto try_again;
god_speaks(GOD_XOM, _get_xom_speech("random mutations"));