From d16ed1201876132b39d151da6877de997da67912 Mon Sep 17 00:00:00 2001 From: dolorous Date: Sat, 26 Apr 2008 03:05:13 +0000 Subject: 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 --- crawl-ref/source/externs.h | 6 ++++++ crawl-ref/source/mon-util.cc | 12 +++++++++++- crawl-ref/source/mutation.cc | 8 -------- crawl-ref/source/mutation.h | 2 -- crawl-ref/source/player.cc | 16 ++++++++++++++++ crawl-ref/source/religion.cc | 2 +- crawl-ref/source/xom.cc | 6 +++--- 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")); -- cgit v1.2.3-54-g00ecf